假设我开始用TDD进行游戏。这是一个很好的第一次测试吗?
[TestMethod]
public void Can_Start_And_End_Game()
{
Tetris tetris = new Tetris();
tetris.Start();
tetris.End();
}
它基本上迫使我定义了3件事:Tetris
类及其Start()
和End()
方法,但除此之外它还没用。它可能会立即引起它的兴趣,因为我可以定义该类和那些方法,但后来它可能不会用于任何目的。它的唯一目的可能是表明必须有可能开始游戏并结束它而不会在中间出现异常。
你对此有何看法?
答案 0 :(得分:19)
它基本上迫使我定义了三件事:Tetris类及其Start()和End()方法,
真。
但除此之外它还没用。
假。
以后它可能不会用于任何目的
也错。
它的目的[表明]必须有可能开始游戏并结束它而不会在中间出现异常
那太棒了。史诗。巨大的。
事实上,这种测试经常失败,你会变得讨厌它。程序中各种随机位置的每个未处理,未捕获的异常都将无法通过此测试。由于此测试,您将构建仔细的日志记录和调试。
此测试为EPIC。
答案 1 :(得分:7)
你真的没有通过这个测试推动俄罗斯方块类的开发 - 你已经决定了它的API应该是什么,这很好,但是为什么不写一个测试来测试它应该实际做的事情呢?
测试应通知API,反之亦然(imho)。
答案 2 :(得分:3)
我不是这个测试的忠实粉丝。是的,它有助于定义界面,但它对于定义(和测试)行为并不是很强大。
我认为有一个处理启动的测试可能会更好。它可能会声明默认设置或评分值。然后我会进行额外的测试,看看你是否可以结束游戏。
理想情况下,每个测试方法都执行一种行为。
答案 3 :(得分:1)
我认为通过捕获任何异常可以使测试的目的更明确,并且如果它开心就明确地使测试失败:
[TestMethod]
public void Can_Start_And_End_Game()
{
try
{
Tetris tetris = new Tetris();
tetris.Start();
tetris.End();
}
catch (Exception ex)
{
Assert.Fail("Unexpected exception thrown: " + ex.ToString());
}
}
答案 4 :(得分:1)
是的,测试确认构造函数中没有抛出异常,Start()
和Stop()
方法。
我认为在测试中额外的try / catch块没有什么价值可以捕获异常。执行测试的工具将捕获并报告这些。使用TSTTCPW原则,测试可以不使用try / catch块。
您可以通过在末尾添加断言来使测试更有意义,例如验证tetris
对象上属性的值。
请注意编写单元测试和使用TDD之间的区别。价值来自于理解差异。
答案 5 :(得分:1)
正如S. Lott所说,这次测试涵盖了TON的地面。它是如此“值得”,值得分成至少 3测试并为每个测试添加适当的断言:
[TestMethod]
public void Test_Contructor()
{
Tetris tetris = new Tetris();
// make assertions
}
[TestMethod]
public void Test_Start()
{
// setup
Tetris tetris = new Tetris();
// exercise
tetris.Start();
// make assertions
}
[TestMethod]
public void Test_End()
{
// setup
Tetris tetris = new Tetris();
tetris.Start();
// exercise
tetris.End();
// make assertions
}