我是PHP SimpleTest框架的新手,我很惊讶地看到失败的断言不会停止测试方法。换句话说,这会在测试报告中导致两条失败消息:
function testFoo() {
$this->assertTrue(true, 'first: %s');
$this->assertTrue(false, 'second: %s');
$this->assertTrue(false, 'third: %s');
}
我的大部分单元测试经验都是JUnit和NUnit,一旦第一个断言失败,它们都会暂停测试方法。也许我已经习惯了,但似乎额外的失败信息只是噪音。它让我想起旧的C编译器因为缺少分号而会出现50个错误。
我可以将SimpleTest配置为快速失败,还是只需要使用不同的样式?
答案 0 :(得分:5)
您可以扩展/修改Reporter类,以便在paintFail()之后退出() (不需要修改单元测试)
或者
assert *函数返回一个布尔值,例如:
$this->assertTrue(false, 'second: %s') or return;
将结束当前的测试功能。
PS:
如果您使用的是PHPUnit_TestCase类而不是UnitTestCase,则assert *函数将不会返回布尔值。
答案 1 :(得分:3)
这并没有真正回答你的问题,但是对于它的价值,PHPUnit总是失败。
http://www.phpunit.de/manual/current/en/goals.html说:
...第一次测试失败,测试执行停止,PHPUnit报告失败。
答案 2 :(得分:1)
assert方法确实为pass或fail返回一个布尔值,因此你可以检查它并在出现故障时停止测试。
我不认为这可以扩展到项目中的每个测试,但是一些特别嘈杂的测试可能会从中受益。
这是一个简单的例子:
function testBar() {
$pass = $this->assertTrue(true, 'first: %s');
$pass = $pass && $this->assertTrue(false, 'second: %s');
$pass = $pass && $this->assertTrue(false, 'third: %s');
}
您可以使用if语句来包装更大的代码块。
答案 3 :(得分:1)
我需要这个,因为我的所有测试都依赖于数据库正在运行。如果数据库关闭,我真的不关心有10,000个故障的屏幕。由于simpletest在失败时立即打印,而且只是php代码,您实际上可以使用简单的die
语句停止测试。
以下是我的关键“我连接”测试的代码。
function testDatabaseAccess()
{
$connected = TRUE;
GLOBAL $clients;
$connected &= $this->assertTrue(is_object($clients), 'Clients database not connected.');
GLOBAL $practices;
$connected &= $this->assertTrue(is_object($practices), 'Practices database not connected.');
GLOBAL $user;
$connected &= $this->assertTrue(is_array($user), 'User not defined.');
GLOBAL $practice;
$connected &= $this->assertTrue(is_object($practice), 'Practice database not connected.');
if (!$connected)
{
die('Not Connected.');
}
}
产生:
当然我没有得到摘要行,但对于我的用例,我不需要或想要我的摘要行。没有数据库,没有测试点。对于我的其余测试,我实际上喜欢它不会立即失败。我通常希望一次看到我所有的失败。