我想在我的单元测试框架中使用
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的解决方案.这是我提出的涉及额外代码的解决方案.
原文链接:https://www.f2er.com/php/132863.htmlclass 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()方法移动到变量持有者类,这样可以考虑在测试台上运行的每个单元测试,而不是进行某种神奇的断言调用.