->assertTrue(false);
->assertTrue(true);
第一个断言失败,执行停止。但我想继续进一步的代码片段。
PHPUnit中是否有可能
答案 0 :(得分:12)
其他回答者是正确的 - 如果你想要能够做到这一点,你真的应该将你的断言分成单独的测试。但是,假设你有合理的理由想要这样做......有一种方法。
Phpunit断言失败实际上是异常,这意味着您可以自己捕获并抛出它们。例如,尝试此测试:
public function testDemo()
{
$failures = [];
try {
$this->assertTrue(false);
} catch(PHPUnit_Framework_ExpectationFailedException $e) {
$failures[] = $e->getMessage();
}
try {
$this->assertTrue(false);
} catch(PHPUnit_Framework_ExpectationFailedException $e) {
$failures[] = $e->getMessage();
}
if(!empty($failures))
{
throw new PHPUnit_Framework_ExpectationFailedException (
count($failures)." assertions failed:\n\t".implode("\n\t", $failures)
);
}
}
正如您所看到的,它会尝试两个断言,这两个断言都会失败,但它会等到最后将所有失败输出消息作为单个异常抛出。
答案 1 :(得分:8)
你可以直接存储失败,比如说
$passing = true;
if (! false) { $passing = false; }
if (! true) { $passing = false; }
$this->assertTrue($passing);
但我强烈反对这种形式的测试。我写了这样的测试,并且它们指数地失控,更糟糕的是,由于难以找到的原因,你开始出现奇怪的失败。
此外,比我更聪明的人同意,测试不应该有conditionals(if / else,try / catch),因为每个条件都会增加测试的复杂性。如果需要条件,可能需要非常仔细地查看测试和SUT或系统测试,以便使其更简单。
更好的方法是将其更改为两个测试,如果它们共享设置的重要部分,则将这两个测试移动到新的测试类中,并在Setup()方法中执行共享设置
答案 2 :(得分:7)
这打破了单元测试的重点。您可能希望将其分解为更多的测试方法,而不是采用单片测试方法。
这是一些伪代码,作为一个不好的例子。
MyBadTestMethod()
{
someResult = MyMethod();
assertIsCorrect(someResult);
myResult2 = MyMethod2(someResult);
assertIsCorrect(myResult2);
}
MyMethod2
和myResult2
将失败。
这是一个更好的例子。
MyTestMethod1()
{
someResult = MyMethod();
assertIsCorrect(someResult);
}
MyTestMethod2()
{
myResult2 = MyMethod2(someCorrectResult);
assertIsCorrect(myResult2);
}
答案 3 :(得分:0)
我来晚了,但是我建议使用测试套件的配置文件来轻松实现这一目标。
您可以从运行phpunit测试的位置创建oobar
文件。因此phpunit将运行此处列出的所需测试。
Sebastian Bergmann的PHPUnit 3.7.38。
从/path/phpunit.xml读取的配置
在该文件中,您可以指定您不想在失败时停止。
$("body").html($("body").html().replace(/0\d{3} \d{2} \d{2} \d{2} \d{2}/g, /0\d{3} \d{2} \d{2} \d{2} \d{2}\*/g));
希望这会有所帮助。