编写由多个测试用例组成的单个单元测试违反了单元测试原则?

时间:2009-08-06 20:35:36

标签: unit-testing testing

我应该

Test1(){
  Assert(TestCase1);
  Assert(TestCase1);
  Assert(TestCase3);
  ...
}

Test1(){
  Assert(TestCase1);
}
Test2(){
  Assert(TestCase2);
}
Test3(){
  Assert(TestCase3);
}
...

注意:所有测试用例都是密切相关的。它们之间只有布尔差异。

3 个答案:

答案 0 :(得分:8)

一个测试用例=一个要测试的条件,有些人将条件转换为断言,这是错误的,条件可以由一个或多个断言组成

示例:想象一下,您正在开发一款国际象棋游戏,并且您刚刚实现了移动功能,并且您想测试它,请检查以下测试用例。

public void testPawnCanMoveTwoSquaresAheadFromInitialRow (){
    [...]
    //Test moving first a white pawn
    assertPawnCanMoveTwoSquaersAheadFromInitialRow ("a2", "a4");
    //Test moving fater a black pawn
    assertPawnCanMoveTwoSquaersAheadFromInitialRow ("h7", "h5");
}

private void assertPawnCanMoveTwoSquaersAheadFromInitialRow (String from, String to){
    [...]
    Piece movingPiece = board.getSquareContent(from);
    assertTrue (movingPiece.isPawn ());
    assertTrue (board.move (from, to));
    assertTrue (board.getSquareContent(from).isEmpty());
    assertTrue (board.getSquareContent(to).isPawn());
    [...]
}

正如您所看到的,此示例非常清楚,如果失败,您将确切知道应用程序失败的位置,使添加新测试用例变得非常容易,并且您可以看到测试只有一个条件,但使用了很多断言。

您可能想查看我在博客上写的这篇文章:How to write good tests

答案 1 :(得分:0)

您应该使用第二种方案。如果您使用第一个场景并且Test1失败,则您不知道问题出在哪里......它可能在任何数量的测试中。在第二种情况下,您确切地知道正在测试的是什么。

答案 2 :(得分:0)

第二种情况可以帮助您准确检测出错的地方,并且您将始终知道所有断言的结果。

您可能会想到第一个场景的优点是您可以对所有断言使用相同的排列。但是,如果你的第一个断言失败,你将会错过其他两个是否会通过。

我建议第二个,一旦大多数测试框架允许你为许多测试做一次性安排。