6 有风险的测试
无用测试
什么叫无用测试呢?未进行任何断言的测试方法,就叫做无用测试。本来PHPUnit不会对这些测试进行限制,但是可以使用开启一些配置,将这些测试方法标记为有风险的。
- 命令行参数:
--report-useless-tests
- PHPUnit的XML配置文件中设置:
beStrictAboutTestsThatDoNotTestAnything="true"
意外的代码覆盖
@covers
和@uses
在测试代码中用
@covers
标注来指明测试方法想要对哪些方法进行测试
标注方法暂时不在这一章里面详细介绍。
@uses
标注用来指明那些将会在测试中执行到但同时又不打算让其被测试所覆盖的代码。
这里实在没有找到对应的例子,可能是因为我半路跳过去的吧。所以以下就是我的猜想了,@uses
应该是标注了该测试中会用到的类,但是后面那句**“但同时又不打算让其被测试所覆盖的代码”,我就不知道怎么理解"覆盖"**,这个词的含义了,所以先空着吧。
PHPUnit 可以更严格对待意外的代码覆盖。此项检查可以用命令行选项
--strict-coverage
或在 PHPUnit 的 XML 配置文件中设置beStrictAboutCoversAnnotation="true"
来启用。在启用本项检查后,如果某个带有 @covers 标注的测试执行了未在 @covers 或 @uses 标注中列出的代码,它将被标记为有风险。
测试执行期间产生的输出
PHPUnit 可以更严格对待测试执行期间产生的输出。 此项检查可以用命令行选项
--disallow-test-output
或在 PHPUnit 的 XML 配置文件中设置beStrictAboutOutputDuringTests="true"
来启用。
简单来说就是不允许在测试执行期间有任何的输出(print
,echo
等),否则就会标记为有风险。
测试执行时长的超时限制
如果安装了
PHP_Invoker
包并且pcntl
扩展可用,那么可以对测试的执行时长进行限制。此时间限制可以用命令行选项--enforce-time-limit
或在 PHPUnit 的 XML 配置文件中设置beStrictAboutTestSize="true"
来启用。带有
@large
标注的测试如果执行时间超过60秒将视为失败。此超时限制可以通过XML配置文件中的timeoutForLargeTests
属性进行配置。带有
@medium
标注的测试如果执行时间超过10秒将视为失败。此超时限制可以通过XML配置文件中的timeoutForMediumTests
属性进行配置。没有
@medium
或@large
标注的测试都将视同为带有@small``标注,这类测试如果执行时间超过1秒将视为失败。此超时限制可以通过XML配置文件中的 ``timeoutForSmallTests
属性进行配置。
上面的话总结起来就是:
- 需要安装
PHP_Invoker
和pcntl
拓展 - 可以使用命令行参数
--enforce-time-limit
或者XML配置文件参数beStrictAboutTestSize="true
开启 @large
参数默认60秒,可以通过timeoutForLargeTests
来修改@medium
参数默认10秒,可以通过timeoutForMediumTests
修改@small
是默认配置,默认1秒,可以通过timeoutForSmallTests
修改
全局状态篡改
PHPUnit 可以更严格对待篡改全局状态的测试。此项检查可以用命令行选项
--strict-global-state
或在 PHPUnit 的 XML 配置文件中设置beStrictAboutChangesToGlobalState="true"
来启用。
简单来说开启这个配置之后,如果测试类中有篡改全局状态的代码,就会被认定为有风险的代码。至于全局状态,估计是$GLOBAL
之类的值吧。