PHPUnit是一个面向PHP程序员的测试框架,这是一个xUnit的体系构造的单元测试框架。

安装

一样平常composer安装

phpunitPHPUnit手册浏览 GraphQL

composer require phpunit/phpunit

编写 PhpUnit 测试

测试的依赖关系

用 @depends 标注来表达依赖关系(DependTest.php

数据供给器

用 @dataProvider 标注来表达数据供给器(AdditionProviderTest.php) 同一个测试中组合利用 @depends 和 @dataProvider(DependencyAndDataProviderComboTest.php

对非常进行测试

用 @expectException 标注来测试被测代码中是否抛出了非常(ExceptionTest.php

对输出进行测试

用 expectOutputString() 方法来设定所预期的输出

方法含义void expectOutputRegex(string $regularExpression)设置输出预期为输出应该匹配正则表达式 $regularExpression。
void expectOutputString(string $expectedString)设置输出预期为输出应该与 $expectedString 字符串相等。
bool setOutputCallback(callable $callback)设置回调函数,用来做诸如将实际输出规范化之类的动作。

命令行测试实行器

手册只是列出了phpunit --help,自己看吧

基境(fixture)

在编写测试时,最费时的部分之一是编写代码来将全体场景设置成某个已知的状态,并在测试结束后将其复原到初始状态。
这个已知的状态称为测试的基境(fixture)。

一样平常操作

PHPUnit 支持共享建立基境的代码。
在运行某个测试方法前,会调用一个名叫 setUp() 的 模板方法。
setUp() 是创建测试所用工具的地方。
当测试方法运行结束后,不管是成功还是失落败,都会调用其余一个名叫 tearDown() 的模板方法。
其余,setUpBeforeClass() 与 tearDownAfterClass() 模板方法将分别在测试用例类的第一个测试运行之前和测试用例类的末了一个测试运行之后调用。
TemplateMethodsTest.php) 用 setUp() 建立栈的基境(StackTest.php

基境共享

在测试之间共享基境会降落测试的代价。
潜在的设计问题是工具之间并 非疏松耦合。
如果办理掉潜在的设计问题并利用桩件(stub)(拜会第 9 章 测试替人)来编写测试,就能达成更好的结果,而不是在测试之间产生运行时依赖并错过改进设计的机会。
DatabaseTest.php

组织测试

PHPUnit 的目标之一是测试应该可组合:我们希望能将任意数量的测试以任意组合办法运行。

未完成的测试与跳过的测试

未完成的测试

比如代码没写完啊,功能测试没写完啊。
(SampleTest.php)

方法含义void markTestIncomplete()将当前测试标记为未完成。
void markTestIncomplete(string $message)将当前测试标记为未完成,并用 $message 作为解释信息。

跳过测试

(Sample1Test.php)

方法含义void markTestSkipped()将当前测试标记为已跳过。
void markTestSkipped(string $message)将当前测试标记为已跳过,并用 $message 作为解释信息。

@requires 来跳过测试

数据库测试

建立基境(fixture)

实行被测系统

验证结果

拆除基境(fixture)

(MyApp_Tests_DatabaseTestCase1.php只做了几个常用的办法,其他的没弄)

Flat XML DataSet (平直 XML 数据集)

XML DataSet (XML 数据集)

MySQL XML DataSet (MySQL XML 数据集)

YAML DataSet (YAML 数据集)

CSV DataSet (CSV 数据集)

Array DataSe (数组数据集)

Query (SQL) DataSet (查询(SQL)数据集)

Database (DB) Dataset (数据库数据集)

测试替人

Stubs (桩件) 将工具更换为(可选地)返回配置好的返回值的测试替人的实践方法称为上桩(stubbing)。
可以用桩件(stub)来“更换掉被测系统所依赖的实际组件,这样测试就有了对被测系统的间接输入的掌握点。
这使得测试能逼迫安排被测系统的实行路径,否则被测系统可能无法实行”。

模拟框架

暂时用不到,不过可以好好研究一下。

测试实践

在开拓过程中

在利用单元测试来确认重构的转换步骤中确实保持原有行为并且没有引入缺点时,以下情形有助于改进项目的编码与设计:

所有单元测试均精确运行。

代码传达其设计原则。

代码没有冗余。

代码所包含的类和方法的数量降至最低。

在调试过程中

当看到毛病报告时,你可能会有尽快修复缺点的冲动。
履历表明,这种冲动不是好事,由于修复一个毛病时很可能导致其余一个毛病。
下列操作可以帮你压住冲动:

确承认以或许重现此毛病。

在代码中探求此毛病的最小规模表达。
例如,如果在输出中有一个数字看起来不对,那么 就探求算出此数字的那个工具。

编写一个目前会失落败而毛病修复后将会成功的自动测试。

修复毛病。

代码覆盖率剖析

这个比较主要,须要xdebug的合营,在项眼前面输入类似于下面的命令即可。

vendor/bin/phpunit --coverage-text=./coverage.txt ./FileTest.php

备注:如果你采取了框架来做项目,觉得这个滋扰太大了。


总结

单元测试占用开拓的时候还是很多的,大侠们只管即便写吧,这样就能节省qa的韶光。

备注

相应的代码位置(你照动手册敲一遍也是可以哒):ttps://github.com/Birjemin/study-php

运行办法:

vendor/bin/phpunit ./phpunit/AdditionProviderTest.php

参考

官方手册

http://www.techug.com/post/test-coverage.html