Entropy 是一个库,提供用于在 PHPUnit 中进行随机测试以及测试使用 PHP 随机函数(例如rand
和shuffle
的系统的工具。
有时单元测试需要更改全局状态,或者覆盖改变该状态的功能。虽然这绝不是理想的情况,但这通常会导致无意中创建对其他测试的依赖关系。
启用 Entropy 的测试改组功能会随机化测试的顺序,有助于突出这些依赖性。
Entropy 的测试洗牌还避免使用 PHPUnit 的@depends
功能更改测试顺序;未来的工作将努力确保在适当的时候仍然可以对这些测试进行改组。
有时,您可能会发现自己处于这样一种情况:函数的输入范围如此之大,以至于采用这些输入的横截面可以更有效地利用您的资源。但是,如果该横截面有孔洞,导致测试可能失败,会发生什么情况?
解决这个问题的一种方法是使用随机输入,其中输入的生成方式是为了获得范围的随机横截面。换句话说,使用rand
或其他此类非确定性方法。
对此的扩展,基于属性的测试是将随机输入应用于应用程序或函数,并观察输出是否遵守某些规则或具有相对于输入的某些属性,而不是精确测试与已知结果的相等性放。
通过管理测试的随机种子,熵不仅允许使用这些方法,而且还可以通过接受固定种子或从上次失败的运行中恢复它直到测试套件通过来使它们可重复。
您可以使用 Composer 将此库添加到您的项目中:
$ composer require datto/phpunit-entropy
配置完成后,您可以正常运行测试套件;听者会照顾自己。在测试错误或失败时,使用的种子将存储在临时文件中,以便在下次运行时将重用它,而不是生成新的种子。
随机数生成器的种子由最多四个位置提供,此处按优先级顺序呈现。
如果设置, SEED
环境变量将用于覆盖任何其他设置。它可以通过export
设置,但建议的用途是仅将其设置为当前运行:
SEED=123456 phpunit -c phpunit.xml tests
种子可以通过配置固定;请参阅下面的配置部分。
如果测试运行失败,则使用的种子将存储在临时文件中。然后将其加载到后续测试中,并将持续到套件再次成功为止。
如果通过上述方法没有设置种子,最后的方法是使用 PHP 的rand
函数。
通过 Composer 安装后,配置测试监听器只需更改 PHPUnit 配置文件(通常是phpunit.xml
):
< phpunit xmlns : xsi = " http://www.w3.org/2001/XMLSchema-instance "
xsi : noNamespaceSchemaLocation = " http://schema.phpunit.de/4.1/phpunit.xsd "
backupGlobals = " false "
colors = " true "
bootstrap = " bootstrap.php "
>
< listeners >
< listener class = " DattoPHPUnitEntropyListener " >
< arguments >
< array >
< element key = " seeding " >
< array >
< element key = " enabled " >
< boolean >true</ boolean >
</ element >
< element key = " seed " >
< integer >1234567</ integer >
</ element >
< element key = " file " >
< string >/tmp/phpentropy-seed</ string >
</ element >
</ array >
</ element >
< element key = " shuffle " >
< boolean >true</ boolean >
</ element >
</ array >
</ arguments >
</ listener >
</ listeners >
</ phpunit >
如果设置为 true,随机数生成器将由侦听器播种。
如果通过此参数设置种子,则只有此值将用于为随机数生成器提供种子。请参阅下面有关种子优先级的部分。
如果设置,该文件将用于存储最后一次失败的随机种子;它默认为[TMPDIR LOCATION]/phpunit-entropy-seed
。
如果设置为 true,单元测试的执行顺序将是随机的(使用@depends
的套件除外)。这对于确定和识别测试间依赖性很有用。
克里斯托弗·霍尔特 <[email protected]>