我有一些功能的测试,当我运行它时,我得到这个信息:
There was 1 failure:
1) myTests::testExamples
Failed asserting that true matches expected false.
测试如下。我的问题是,我怎么知道哪个断言失败了?我是否需要向每个消息添加消息以获取此信息?
class myTests extends TestCase {
public function testExamples() {
$this->assertEquals(isSubStr('cat', 'at'), true);
$this->assertEquals(isSubStr('cat', 'fluffy'), false);
$this->assertEquals(isSubStr('cheeze', 'ee'), true);
$this->assertEquals(isSubStr('snow', 'o'), true);
$this->assertEquals(isSubStr('octopus', 'top'), true);
$this->assertEquals(isSubStr('octopus', 'zzz'), false);
$this->assertEquals(isSubStr('octopus', 'pussy'), false);
$this->assertEquals(isSubStr('octopus', 'tops'), false);
$this->assertEquals(isSubStr('ababc', 'abc'), true);
$this->assertEquals(isSubStr('abc', 'abc'), true);
}
}
答案 0 :(得分:0)
至少有两种不同的方法可供选择:
大多数(如果不是全部)assertSomething
函数接受第三个参数,该参数是断言失败时显示的消息字符串。换句话说,您可以将测试更改为:
$this->assertEquals(isSubStr('ababc', 'abc'), true, "ababc vs ab");
$this->assertEquals(isSubStr('ababc', 'abc'), true, "isSubStr: entire string");
如果这样做,请确保该消息是唯一的,并且有助于您找到给定的断言。
一个非常古老但非常有用的测试方案是Assign Act Assert测试方案。这意味着任何给定的测试函数应该只测试一个特定的函数/动作。如果它失败了,你就会确切地知道哪一个失败了,并且可以直接针对这个。
在您的情况下,这可能看起来像:
class testIsSubStr extends TestCase {
public function test_cat_vs_at_true() {
$this->assertEquals(isSubStr('cat', 'at'), true);
}
public function test_ababc_vs_abc_true() {
$this->assertEquals(isSubStr('cat', 'at'), true);
}
// Full scale with arrange - act - assert
public function test_octopus_vs_zzz_false() {
// Arrange
$expect = false;
$inputText = "octopus";
$inputSub = "zzz";
// Act
$actual = isSubStr($inputText, $inputSub);
// Assert
$this->assertEquals($actual, $expect);
}
}
注意类名如何反映您正在关注这些测试的函数,并且函数名称指示输入参数。和以前一样,正确选择名称,帮助您确定它的测试内容。
最后一个示例显示了一个正确的 arrange-act-assert函数,这对于在安排某些事情时有一定意义的大型案例更有用,例如:在你采取行动之前建立清单,之后可能会做出一些改变,然后再断言。
主要技巧仍然是将测试分成几个函数,这样如果任何给定的函数失败,你就会知道断言的确切位置。
最后一点;当你有一个复杂的测试安排时,有多个断言是否违法是有争议的。您的代码可能会返回一个包含多个更改的对象,并且您希望测试所有更改。如果你选择做多个断言,我强烈建议结合这两个想法并添加适当的消息来帮助你识别哪个断言实际上失败了。 (请注意,对于多个断言,您可能需要多次测试运行才能删除所有失败的断言,因为一个失败会停止该测试函数。)