jonathrg/proposition

轻量级基于属性的PHP测试

v0.9 2017-06-18 17:16 UTC

This package is not auto-updated.

Last update: 2024-09-29 02:27:04 UTC


README

轻量级基于属性的PHP测试库。灵感来自Python的Hypothesis库。

安装

由于API尚未完全稳定,您必须在composer install中指定dev-master

composer install jonathrg/proposition:dev-master

什么是基于属性的测试?

根据我找到的第一篇关于它的博客文章

基于属性的测试基于输入对代码输出的陈述,并对许多不同的可能输入进行验证。基于属性的测试框架会反复运行相同的测试,使用生成的输入。

这与基于示例的测试形成对比,后者需要手动编写输入。类似于Proposition的基于属性的测试库允许您仅用几行代码就使用数千种输入组合(包括所有类型的边缘情况)来测试您的代码。例如,Proposition使用自身进行测试,每行测试代码大约有4000个断言。

文档

请参阅Wiki,特别是快速参考

示例用法

examples文件夹中有一些Proposition生成的值的示例。从命令行运行它们(见那里的readme.md)

以下是一个玩具示例,说明如何使用Proposition检查您对abs($a) == abs($b)的出色重实现是否真正有效。

use Proposition/Proposition;

function equal_magnitude($a, $b)
{
    return ($a = $b) || ($a == -$b);
}

$proposition = new Proposition();

$proposition
    ->given(Proposition::integers(), Proposition::integers())
    ->call(function($a, $b) {
        if(equal_magnitude($a, $b) != (abs($a) == abs($b))) {
            echo "ERROR!! equal_magnitude is wrong when \$a is $a and \$b is $b!\n"; 
        }
    });

哎呀!我们收到了很多错误消息。我们会很快发现我们在函数中使用了=而不是应该使用的==

在实践中,您将使用此功能将大量自动生成的值传递到您的函数中,并检查某些属性是否始终成立。例如,您可能想检查函数的输出是否与输入有某种关系,函数是否抛出了异常,等等。

项目目标

  • 极轻量级且易于使用
    • 您只需要使用use 一个类。
      • 未来可能包括用于PHPUnit测试的简单trait。
    • 简单的API,当使用良好的变量名时,读起来像英语。
    • 使用生成器来产生满足给定约束的随机值。
    • 实用主义:已包含常见的用例,如整数、整数范围、字符串、“垃圾”数据等。
      • 但我们不需要为每个可能的用例都使用生成器。您可以在call的回调中按任何方式转换您的值,并且您可以使用Proposition::stream()方法以您自己的方式生成值。
    • 除了生成器和回调外,不使用“高级”或“框架化”功能(不应有Proposition\Interfaces\PropositionableIterators\PropositionableIteratorInterface)。
    • “require”中没有包
  • 易于与PHPUnit集成,但主Proposition类中不应有任何特定于PHPUnit的功能。
  • 兼容PHP v.7.0及以上版本,但也兼容v.5.6。可能不支持更低版本。

状态

大部分核心功能和文档已完成。计划是修复问题#1和问题#3,编写一些PHPUnit测试,使其能够自我测试,然后发布到Packagist。

欢迎贡献者加入!