subiabre / phpmetro
PHP代码的统计分析
Requires
- sebastian/version: 2.0.1
- symfony/console: ^5.1
Requires (Dev)
- phpunit/phpunit: ^8.5
Suggests
- amenadiel/jpgraph: Allows developers to create and draw graphs.
- markrogoyski/math-php: Comprehensive math library to perform calculations with a simple API.
README
简化结果统计抽样和分析。
PHPMetro提供了以PHPUnit风格进行数据抽样和分析的基础,旨在使PHP开发者能够尽可能容易地组成分析套件并获取统计结果。
关于
我在2019年冬天创建了此包,因为我正在处理一个项目,该项目要求我不仅对我的代码进行单元和功能测试,还要对我的代码进行创建和执行几个统计分析。PHPMetro是我对这一要求的回应。
警告:尽管此项目的起源是专业环境,但不能保证它适合所有生产环境。
要求
- PHP >= 7.2*
- Composer
*包应与PHP 5.x等旧版本兼容,但这不能保证。
安装
PHPMetro在packagist上分发。
$ composer require --dev subiabre/phpmetro
安装后,您将在bin文件夹中获得phpmetro二进制文件,默认为vendor/bin。安装后,您希望运行composer suggests subiabre/phpmetro
以查看一些您在编写分析时可能会发现有用的库,因为PHPMetro只包含用于描述具有特定工作流程的分析案例的基本工具集以及执行所有分析的基础。
配置
PHPMetro 需要在运行时提供.xml
配置文件。此文件将指定搜索分析类的位置以及如何运行它们。
获取模板配置
最简单的方法是将您的供应商文件夹中的示例配置文件复制到项目的根目录
$ cp vendor/subiabre/phpmetro/phpmetro.xml phpmetro.xml
二进制文件将自动搜索根文件夹中的任何phpmetro.xml
并加载它,除非您指定位置,您可以使用它来使用和运行多个不同的配置和套件。
$ ./vendor/bin/phpmetro path/to/config.xml
配置
.xml配置文件指定了PHPMetro二进制文件的通用运行指令,并定义了通过套件组定义的分析。
默认文件可以是特定环境的:phpmetro.xml.local
将覆盖phpmetro.xml.dist
,这将覆盖phpmetro.xml
。
配置PHPMetro
<?xml version="1.0" encoding="UTF-8"?> <phpmetro verbose="true" > ... </phpmetro>
您看到的是两个必需的属性,它们的意思是
- verbose:当设置为“true”时,PHPMetro将显示额外的运行信息。相当于使用带有
-v
标志的命令运行。
没有更多的运行配置。运行程序将自动从您定义的套件中获取文件。您可以为每个套件设置更多配置。
配置套件
<suites> <suite name="My Analysis Suite" suffix="Suffix" ignore="false" > <namespace>MyApp\Tests\Metro</namespace> <directory>tests/Metro</directory> </suite> </suites>
套件必须在<suites>
标签内。每个套件接受以下属性
- name:套件的显示名称。必需。
- suffix:分析类文件使用的任何字母组合。可选。默认为“Analysis”。
- ignore:当设置为“true”时,它将指示运行程序跳过该套件的执行。可选。默认为“false”。
注意:后缀不一定必须包括'.php'文件扩展名。事实上,套件从后缀中右剪裁它。
在套件内部还必须有另外两个特定标签
- namespace:套件类的公共命名空间。
- 目录:所有类所在的文件夹。
注意:在命名您的分析文件时,必须遵循PSR-4规范。如果您有一个命名空间为
MyApp\Tests\Foo\BarAnalysis
的分析,为了使PHPMetro正确识别这个类,它必须位于tests/Foo/BarAnalysis.php
。
使用方法
假设您有一个自己的随机数生成器,MyApp\RandomNumber
,并想查看一些关于它的统计数据。PHPMetro就是您需要的包!让我们将它放在“分析”下。
创建分析类
分析是一个特殊的类,它扩展了AnalysisCase
,包含一组样本和几个对样本的测试。
<?php # tests/RandomNumber/RandomNumberAnalysis.php namespace MyApp\Tests\RandomNumber; use MyApp\RandomNumber; use PHPMetro\Analysis\AnalysisCase; class RandomNumberAnalysis extends AnalysisCase { # ... }
恭喜,您刚刚创建了自己的第一个分析。但就像这样,它几乎没有什么用处。现在您需要向您的分析中添加一些样本。
添加样本数据
样本是AnalysisCase
类中的一个特殊数组,其中包含来自一组给定函数的样本数据。在您的分析类中添加
public function setUp(): void { $this->addSample('RandomNumber', 100, function(): int { $randomNumber = new RandomNumber(); return $randomNumber->new(); }); }
要向样本添加数据,我们使用addSample
函数,这个函数需要精确地3个参数
- $name:样本名称。字符串。
- $size:样本大小,即记录数,即执行函数的次数。整数。
- $function:要对样本的每次迭代运行的函数。需要指定返回值。可调用。
注意:未指定返回值的函数调用将不会生成样本。
setUp
方法由AnalysisInterface
要求。所有分析都必须实现此方法,以便在分析中的测试方法之前运行。
您可以在类方法中的任何地方调用addSample
,实际上,此函数将保持执行器的执行,直到完成记录的添加。然而,出于性能和可维护性的原因,建议您在设置时添加样本。
注意:与其他测试框架和库不同,PHPMetro仅在运行所有测试之前运行一次
setUp
方法,而不是在每个测试之前运行一次。
现在有了样本数据,我们可以开始对其进行一些计算。为此,您只需在类中添加测试方法。
编写测试方法
测试是分析类中的一个特殊类方法,它执行某种计算并返回结果。这些方法必须匹配正则表达式test[A-Za-z09]*
并返回基本数据类型。
警告:返回复杂数据类型(如数组或无法转换为字符串的对象)的测试将引发错误异常并停止PHPMetro运行。
注意:未指定返回类型的测试将被忽略并执行。
例如,我们想测试生成的随机数的平均值。
我们的分析类应如下所示
<?php # tests/RandomNumber/RandomNumberAnalysis.php namespace MyApp\Tests\RandomNumber; // MathPHP provides nice maths use MathPHP\Statistics\Average; use MyApp\RandomNumber; use PHPMetro\Analysis\AnalysisCase; class RandomNumberAnalysis extends AnalysisCase { public function setUp(): void { $this->addSample('RandomNumbers', 100, function() { $randomNumber = new RandomNumber(); return $randomNumber->new(); }); } public function testMedianAverage(): int { $sample = $this->getSample('RandomNumbers'); return Average::median($sample); } }
要计算它,我们首先使用getSample
访问设置中添加的样本,然后将它传递给MathPHP的Average
以计算平均值。
您可以为您的样本编写更多的测试来计算不同的事情。根据需要编写测试。
最后,要运行分析,只需运行二进制文件
$ ./vendor/bin/phpmetro
您的测试结果应开始出现在控制台屏幕上。
您可以在
tests/Self
文件夹中查看更多使用示例。这是在tests/phpmetro.xml
中描述的自分析套件。
支持
您可以通过为开放问题做出贡献或创建拉取请求来改进/修复现有代码来支持此项目。欢迎贡献者。
如果您喜欢这个包,请给它一个星或告诉您的朋友。
如果您有任何疑问或评论,请联系我。
谢谢!