代码之家  ›  专栏  ›  技术社区  ›  Newbie

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

  •  3
  • Newbie  · 技术社区  · 17 年前

    我该怎么办?

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

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

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

    3 回复  |  直到 17 年前
        1
  •  8
  •   Alberto Gutierrez    17 年前

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

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

    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

        2
  •  0
  •   ahockley    17 年前

    您应该使用第二种方案。如果您使用第一个场景,并且test1失败,那么您不知道问题在哪里……它可以存在于任何数量的测试中。在第二个场景中,您可以精确地知道测试的是什么。

        3
  •  0
  •   Samuel Carrijo    17 年前

    第二个场景帮助您准确地检测出哪里出了问题,并且您将始终知道所有断言的结果。

    您可能会认为第一个场景有一个优势,您可以对所有断言使用相同的安排。但是,如果您的第一个断言失败,那么您将错过其他两个是否会通过。

    我建议使用第二个测试框架,一旦大多数测试框架允许您对许多测试进行一次性安排。