php – 在单元测试类中存在困境

前端之家收集整理的这篇文章主要介绍了php – 在单元测试类中存在困境前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想在我的单元测试框架中使用 PHP的assert函数.它具有能够在错误消息中看到被评估的表达式(包括注释)的优点.

问题是每个包含测试的方法可能有多个assert语句,我想跟踪已经运行了多少个实际的assert语句.断言不给我一种方式来计算它已经运行了多少次,只有它失败了多少次(在失败回调中).

我试图将assert语句抽象成一个函数,以便我可以添加一个计数机制.

private function assertTrue($expression) {
    $this->testCount++;
    assert($expression);
}

这不行,因为表达式中的任何变量现在超出范围.

$var = true;
$this->assertTrue('$var == true'); // fails

关于如何在单元测试中使用断言的任何建议,同时能够计算实际测试的数量

我想出的两个想法是让用户自己计数

$this->testCount++;
assert('$foo');
$this->testCount++;
assert('$bar');

或使用户在每个测试方法中只放置一个断言(我可以计算运行的方法数量).但这些解决方案都不是非常强制的,并且使编码更加困难.关于如何完成这一点的任何想法?还是应该从我的测试框架中取出assert()?

你受到这个事实的限制,assert()必须在同一个范围内调用你所测试的变量.这就是我所能指出的 – 需要额外代码解决方案,在运行时(预处理)之前修改代码,或者在C级别扩展PHP解决方案.这是我提出的涉及额外代码解决方案.
class UnitTest {
    // controller that runs the tests
    public function runTests() {
        // the unit test is called,creating a new variable holder
        // and passing it to the unit test.
        $this->testAbc($this->newVarScope());
    }

    // keeps an active reference to the variable holder
    private $var_scope;

    // refreshes and returns the variable holder
    private function newVarScope() {
        $this->var_scope = new stdClass;
        return $this->var_scope;
    }

    // number of times $this->assert was called
    public $assert_count = 0;

    // our assert wrapper
    private function assert($__expr) {
        ++$this->assert_count;
        extract(get_object_vars($this->var_scope));
        assert($__expr);
    }

    // an example unit test
    private function testAbc($v) {
        $v->foo = true;
        $this->assert('$foo == true');
    }
}

这种方法的下降:单元测试中使用的所有变量必须声明为$v-> *而不是$*,而写在assert语句中的变量仍然写为$*.其次,assert()发出的警告不会报告调用$this-> assert()的行号.

为了更一致,您可以将assert()方法移动到变量持有者类,这样可以考虑在测试台上运行的每个单元测试,而不是进行某种神奇的断言调用.

原文链接:https://www.f2er.com/php/132863.html

猜你在找的PHP相关文章