我有一个针对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);
}
}
稍后我会添加至少另一个负责向用户显示游戏板的人。对于当前的,我只对上面显示的内容感兴趣。
在进行集成测试时(我想这是一个集成测试?)我应该做什么样的单元测试?我是否应该尽量使集成测试通过?如果是这样,我只需要让Game
类将其第一个IPlayer
HasWon
设置为true,将第二个设置为false。如果我通过集成测试来推动我的设计,那么单元测试会有什么意义呢?
我认为通常你没有很多集成测试。那么,我应该通过Integration-Tests还是通过Unit-Tests来推动我的设计?
答案 0 :(得分:2)
我不称之为集成测试,对我来说它更像是Build Verification Test。如果组件组合在一起,则在构建测试之后运行的简短基本测试。接触每个模块的测试。因此,您可以测试是否可以创建玩家,创建游戏以及玩脚本游戏。
集成测试将包含更多关于模块之间接口的测试(csci)。
单元测试低于BAT和集成测试。他们确保至少编译单元中的所有公共方法都按预期工作并正确处理错误输入。
所以,是的,单元测试会涵盖更多的方法。
Game类构造函数的单元测试示例:
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 验证构建过程是否正确且完整。它验证它是否生成了可执行的应用程序。
功能测试针对完整应用程序的功能要求。许多功能测试不是自动的,而是由编写的测试脚本完成并由测试人员执行。
答案 1 :(得分:2)
算法总是最难测试的,因为要确保它有效,你必须测试所有可能的组合。实际上,由你来决定在哪里划线。
你在这里有一个高水平的验收测试。
可能的单元测试是:
答案 2 :(得分:1)
我认为这是一个很好的集成测试,你需要对暴露的公共方法的特定行为进行单元测试,即如果玩家玩两次相同的动作怎么办?谁不对此事负责?
public void cannotPlaySameMovementTwice() {
playerO.Play(new Point(0, 0));
playerX.Play(new Point(0, 0));
// You should assert some exception result here
}
答案 3 :(得分:1)
回答你的问题的问题在于它是主观的,我们不像你那样了解你的应用。
总的来说,我会变得功利主义。做任何事情都可以让你的应用程序编码最快,最无bug,最易维护。单位测试也计算所有这些。
如果您发现编写和理解集成测试或端到端测试更容易,请编写它们。如果你认为你必须减少它们,那么这就是你要走的路。
如果您发现通过专注于单元测试更容易测试每个角落和裂缝,那么就这样做。如果你能以可维护的方式编写它们,那么这将很有效。
根据我的经验,单元测试的编写时间较短,可以用更少的精力深入挖掘。这就是我喜欢它们的原因。我写了更少的集成测试(覆盖主要路径的测试,我倾向于将它们用作BVT),甚至更少的“端到端”测试(如果我有多个应用程序/服务器客户端对,完整的进程等测试)。
答案 4 :(得分:1)
单元测试和集成测试之间的区别是非常主观的。
有些人会说,当你组合多个单元时,这是一个集成测试(就像你在这里一样)。其他人会说它需要在环境中触摸控件之外的某些组件(例如数据库或外部API)才能进行集成测试。
虽然我倾向于选择后一种定义,但可以针对每种定义进行论证。即便如此,它实际上真的重要吗?这是一个有用的测试,速度快,而且比集成测试更稳定。出于这个原因,我将它与我的本地和CI测试中的单元测试分组。
在推动时你可以称之为验收测试,虽然它是非常灰色的盒子,并没有真正写在用户术语中。
通常你的系统会比你的tic-tac-toe游戏大得多,单元,集成和验收测试之间的区别会更清晰 - 给你在三个抽象层次上测试的范围。
答案 5 :(得分:0)
在TDD中,每个测试都应该让您在代码中创建或更改一件事,这通常意味着单元测试。
在您创建接口,三个类和至少四个方法之前,此特定测试无法通过。所以我不会称之为试驾。