C# 没有断言/预期异常的第一个TDD测试。值得吗?
假设我开始用TDD做一个游戏。这是一个好的第一次测试吗C# 没有断言/预期异常的第一个TDD测试。值得吗?,c#,java,unit-testing,tdd,C#,Java,Unit Testing,Tdd,假设我开始用TDD做一个游戏。这是一个好的第一次测试吗 [TestMethod] public void Can_Start_And_End_Game() { Tetris tetris = new Tetris(); tetris.Start(); tetris.End(); } 它基本上迫使我定义三件事:Tetris类及其Start()和End()方法,但除此之外,它是非常无用的。它可能会立即产生兴趣,因为我可以定义那个类和那个些方法,但稍后它可能不会有任何用途。它
[TestMethod]
public void Can_Start_And_End_Game()
{
Tetris tetris = new Tetris();
tetris.Start();
tetris.End();
}
它基本上迫使我定义三件事:Tetris
类及其Start()
和End()
方法,但除此之外,它是非常无用的。它可能会立即产生兴趣,因为我可以定义那个类和那个些方法,但稍后它可能不会有任何用途。它的唯一目的也许是表明它必须有可能启动游戏并结束它而不在中间产生异常。
您对此有何看法?我认为,通过捕获任何异常并在出现异常时明确失败,可以更清楚地说明测试的目的:
[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());
}
}
我不太喜欢这个测试。是的,它有助于定义接口,但对于定义(和测试)行为来说,它不是很强大 我认为最好有一个测试来处理启动。它可能会断言默认设置或评分值。然后我会有额外的测试,看看你是否可以结束一场比赛
理想情况下,每个测试方法执行一个行为。是的,测试确认构造函数、
Start()
和Stop()
方法中没有抛出异常
在捕获异常的测试中,我发现额外的try/catch块没有什么价值。执行测试的工具将捕获并报告这些数据。使用TSTTCPW原理,测试可以在没有try/catch块的情况下进行
通过在末尾添加断言,您可以使测试更有意义,例如验证tetris
对象上属性的值
请注意编写单元测试和使用TDD之间的区别。它的价值来自于理解这种差异。您并不是在通过这个测试真正推动俄罗斯方块类的开发——您已经决定了它的API应该是什么,这很好,但是为什么不编写一个测试来测试它实际上应该做的事情呢 测试应通知API,反之亦然(imho) 它基本上迫使我定义3件事:俄罗斯方块类及其Start()和End()方法 对 但除此之外,这是非常无用的 错 以后它可能不会有任何用途 也是假的 它。。。目的[是]表明必须能够在中间不出现异常的情况下开始和结束游戏 这是巨大的。史诗。不朽的 事实上,这种测试经常会失败,你会越来越讨厌它。来自程序中各种随机位置的所有未处理、未捕获的异常都将无法通过此测试。由于此测试,您将构建仔细的日志记录和调试
这项测试是史诗般的。正如S.洛特所说,这项测试覆盖了一吨土地。它是如此的“值得”,以至于至少需要分成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
}
我想你成功了。但也要看看S·洛特的答案。@Owneded-谢谢。实际上我更喜欢S.洛特的:)哇,我没想到。我一直知道我是一个编程天才。“现在我有证据了。”吞噬极乐世界:对不起,你不是天才。你只是在按照天才告诉你的去做。好消息是你在追随天才。有一个
Assert.DoesNotThrow
方法可以做到这一点。这难道不像说“let x=x”或“if(true==true)”那样多余吗?我认为“DoesNotThrow”的概念总是隐含和理解的,无论是否有任何类型的断言,无论方法的名称是什么。一个好的测试只有一个断言;在Java中,方法是不大写的。因此tetris.start()
和tetris.end()
从技术上讲,这是一个集成测试,因为您要测试不止一件事情。您应该有开始测试、结束测试和此集成测试。