今天我生命中第一次使用TDD。我正在使用nUnit。
我有一种方法,我可以插入多个不同的输入并检查结果是否有效。
我读到一次测试中的多个断言不是问题,我真的不想为每个输入编写新的测试。
多个断言的示例:
[TestFixture]
public class TestClass
{
public Program test;
[SetUp]
public void Init()
{
test = new Program();
}
[Test]
public void Parse_SimpleValues_Calculated()
{
Assert.AreEqual(25, test.ParseCalculationString("5*5"));
Assert.AreEqual(125, test.ParseCalculationString("5*5*5"));
Assert.AreEqual(10, test.ParseCalculationString("5+5"));
Assert.AreEqual(15, test.ParseCalculationString("5+5+5"));
Assert.AreEqual(50, test.ParseCalculationString("5*5+5*5"));
Assert.AreEqual(3, test.ParseCalculationString("5-1*2"));
Assert.AreEqual(7, test.ParseCalculationString("7+1-1"));
}
}
但是当一些事情失败时,很难读出哪个断言失败了,我的意思是如果你有很多断言,你必须通过所有断言找到正确的断言。
如果断言失败,是否有任何优雅的方式来显示我们设置的输入,而不是结果和预期的结果?
谢谢。
答案 0 :(得分:10)
我的意思是如果你有很多,所以你必须经历所有。
不,你不 - 你只看堆栈跟踪。如果你在IDE中运行测试,我发现这很容易就可以确定哪一行失败了。
那就是说,是一个(显着)更好的方式 - 使用TestCaseAttribute
进行参数化测试。例如:
[Test]
[TestCase("5*5", 25)]
[TestCase("5*5*5", 125)]
[TestCase("5+5", 10)]
// etc
public void Parse_SimpleValues_Calculated(string input, int expectedOutput)
{
Assert.AreEqual(expectedOutput, test.ParseCalculationString(input));
}
现在,您的单元测试运行器将分别向您显示每个测试用例,您将能够看到哪个失败。此外,它将运行所有测试,即使早期测试失败 - 所以你不会最终只修复一个,只是发现下一个测试意外失败。
对于您想要单独指定输入集合的情况,还有TestCaseSourceAttribute
- 例如在多个测试中使用。