C# 集成测试与TDD

C# 集成测试与TDD,c#,java,unit-testing,tdd,C#,Java,Unit Testing,Tdd,我有一个tic-tac-toe游戏的第一个集成测试: [TestClass] public class FirstIntegrationTest { [TestMethod, TestCategory("Integration Tests")] public void Standard_TicTacToe_Game_PlayerO_Wins() { IPlayer playerO = new Player(); IPlayer player

我有一个tic-tac-toe游戏的第一个集成测试:

[TestClass]
public class FirstIntegrationTest
{
    [TestMethod, TestCategory("Integration Tests")]
    public void Standard_TicTacToe_Game_PlayerO_Wins()
    {
        IPlayer playerO = new Player();
        IPlayer playerX = new Player();

        Game game = new Game(playerO, playerX);
        game.Start();

        playerO.Play(new Point(0, 0));
        playerX.Play(new Point(2, 2));
        playerO.Play(new Point(1, 0));
        playerX.Play(new Point(1, 2));
        playerO.Play(new Point(2, 0));

        Assert.IsTrue(game.IsOver);
        Assert.IsTrue(playerO.HasWon);
        Assert.IsFalse(playerX.HasWon);
    }
}
稍后,我将添加至少另一个,负责向用户显示游戏的棋盘。对于当前的一个,我只对上面显示的内容感兴趣

在进行集成测试时(我想这是一个集成测试),我应该做什么样的单元测试?我应该只做最低限度的测试来通过集成测试吗?如果是这样,我只需要让
游戏
类将其第一个
IPlayer
haswoon
设置为true,第二个设置为false。如果我通过集成测试来推动我的设计,那么单元测试到底有什么意义呢


我的想法是,一般来说,您没有太多的集成测试。那么,我应该通过集成测试还是单元测试来驱动我的设计呢?

我不会称之为集成测试,对我来说,它更像是一个测试。如果组件装配在一起,则在构建测试之后运行的一个简短的基本测试。涉及每个模块的测试。因此,您可以测试是否可以创建玩家、创建游戏和玩脚本游戏

集成测试将包含更多关于模块间接口(csci)的测试

单元测试低于BAT和集成测试。它们确保编译单元中至少所有公共方法都能按预期工作,并正确处理错误输入

是的,单元测试将涵盖更多的方法

游戏类构造函数的单元测试示例:

   IPlayer playerO = new Player();
   IPlayer player1 = new Player();
   IPlayer player2 = new AnotherImplOfIPlayer();

   Game game0 = new Game(player0, player1);   // this should work
   Game game1 = new Game(player0, player2);   // this should work
   Game game2 = new Game(null, null);         // exception thrown?    
   Game game3 = new Game(player0, player0);   // exception thrown?

单元测试验证编译单元是否正确。您已经对编译单元提出了一些要求(编写或记住),并验证了这些要求。完全独立于高级应用程序的功能。为什么?因为您可能希望在其他项目中重用编译单元,并希望确保此编译单元没有错误(关于单元规范)

BVT验证构建过程是否正确和完整。它验证是否生成了可执行的应用程序


功能测试针对完整应用的功能要求。许多功能测试不是自动的,而是通过编写测试脚本完成的,由测试人员执行。

我不把它称为集成测试,对我来说,它更像是一个测试。如果组件装配在一起,则在构建测试之后运行的一个简短的基本测试。涉及每个模块的测试。因此,您可以测试是否可以创建玩家、创建游戏和玩脚本游戏

集成测试将包含更多关于模块间接口(csci)的测试

单元测试低于BAT和集成测试。它们确保编译单元中至少所有公共方法都能按预期工作,并正确处理错误输入

是的,单元测试将涵盖更多的方法

游戏类构造函数的单元测试示例:

   IPlayer playerO = new Player();
   IPlayer player1 = new Player();
   IPlayer player2 = new AnotherImplOfIPlayer();

   Game game0 = new Game(player0, player1);   // this should work
   Game game1 = new Game(player0, player2);   // this should work
   Game game2 = new Game(null, null);         // exception thrown?    
   Game game3 = new Game(player0, player0);   // exception thrown?

单元测试验证编译单元是否正确。您已经对编译单元提出了一些要求(编写或记住),并验证了这些要求。完全独立于高级应用程序的功能。为什么?因为您可能希望在其他项目中重用编译单元,并希望确保此编译单元没有错误(关于单元规范)

BVT验证构建过程是否正确和完整。它验证是否生成了可执行的应用程序


功能测试针对完整应用的功能要求。许多功能测试不是自动的,而是通过编写测试脚本完成的,并由测试人员执行。

我认为这是一个很好的集成测试,您需要对公开的公共方法的特定行为进行单元测试,即,如果一个玩家玩同一个动作两次怎么办?谁对这种情况不发生负责

public void cannotPlaySameMovementTwice() {
    playerO.Play(new Point(0, 0));
    playerX.Play(new Point(0, 0));
    // You should assert some exception result here
}

我认为这是一个很好的集成测试,您需要对公开的公共方法的特定行为进行单元测试,例如,如果一个玩家玩同一个动作两次会怎么样?谁对这种情况不发生负责

public void cannotPlaySameMovementTwice() {
    playerO.Play(new Point(0, 0));
    playerX.Play(new Point(0, 0));
    // You should assert some exception result here
}

算法总是最难测试的,因为要真正确保它有效,你必须测试所有可能的组合。现实地说,这取决于你决定在哪里划界

这里是一个高级验收测试

可能的单元测试包括:

  • 确保玩家只能交替轮换
  • 确保玩家不能同时标记坐标
  • 确保在veritcal、对角线和水平方面的胜利得到认可(可在此测试所有8种可能性)

    • 算法总是最难测试的,因为要真正确保它工作,你必须测试所有可能的组合。现实地说,这取决于你决定在哪里划界

      这里是一个高级验收测试

      可能的单元测试包括:

      • 确保玩家只能交替轮换
      • 确保玩家不能同时标记坐标
      • 确保在veritcal、对角线和水平方面的胜利得到认可(可在此测试所有8种可能性)

      回答您的问题的问题在于它是主观的,我们不像您那样了解您的应用程序

      一般来说,我会选择功利主义。尽一切可能让你的应用程序编码得最快、最无bug、最易维护。单元测试对所有这些测试都很重要

      如果您发现编写和理解集成测试或端到端测试更容易,请编写这些测试。如果你认为你将不得不少维护它们,那么这就是方法

      如果您发现通过关注单元测试更容易测试每个角落,那么就这样做。如果您能够以可维护的方式编写它们,那么这将很好地工作

      根据我的经验,单元测试编写起来比较短,而ca