我想学习如何在编写代码之前编写测试用例。我读了一篇关于测试驱动开发的文章。我想知道开发人员如何编写测试用例例如这个方法:
public int divideNumbers(int num1, int num2)
{
return num1 / num2;
}
答案 0 :(得分:4)
我们现在开始一个空白项目。你想做点什么,比如分两个数字。所以你写了一个描述你想做什么的测试:
Assert.That(divide(10,2), Eq(5))
此测试为您提供了一个入口点:它描述了divide
方法的可接受接口。因此,您可以继续将其实现为int divide(int x, int y)
。
编写测试,描述您希望从代码中获得的内容。你不需要考虑太多。编写期望的最常用方式可能是设计代码的最佳方式,然后您可以实现它以满足您的测试。
答案 1 :(得分:1)
有几个测试步骤。来自MSDN
;
在你的情况下;
Assert.AreEqual(divideNumbers(8, 4), 2);
Assert
类使用true
/ false
命题验证单元测试中的条件。您应该将测试用例写入您期望的结果。您可以将TestMethod
属性用于测试方法。关于Creating Unit tests for your c# code的帖子很酷。分析得非常好。
答案 2 :(得分:1)
从您要开发的函数/类/组件的存根开始。它应该编译,但故意不(还)做它应该做的事情。
例如:
public int divideNumbers(int num1, int num2)
{
throw new NotImplementedException();
}
或
return -42;
考虑预期的行为,将存根视为黑盒的接口。不关心实现(还)。想想界面的“契约”:X进去,Y出去。
识别标准案例和重要案件。为他们写测试。
对于整数除法(假设我们将从头开始编写),实际上有几种情况需要考虑:有和没有余数,n / 1,n / 0,0 / n,0/0,负数,等
Assert.IsTrue(divideNumbers(4,4) == 1);
Assert.IsTrue(divideNumbers(4,3) == 1);
Assert.IsTrue(divideNumbers(4,2) == 2);
Assert.IsTrue(divideNumbers(4,1) == 4);
Assert.Throws<ArgumentException>(() => divideNumbers(4,0));
Assert.IsTrue(divideNumbers(0,4) == 0);
Assert.Throws<ArgumentException>(() => divideNumbers(0,0));
Assert.IsTrue(divideNumbers( 4,-2) == -2);
Assert.IsTrue(divideNumbers(-4, 2) == -2);
Assert.IsTrue(divideNumbers(-4,-2) == 2);
Assert.IsTrue(divideNumbers( 4,-3) == -1);
Assert.IsTrue(divideNumbers(-4, 3) == -1);
Assert.IsTrue(divideNumbers(-4,-3) == 1);
编译并运行单元测试。他们都失败了吗?如果没有,为什么?也许其中一个测试没有按预期工作(测试也可能有问题!)。
现在,开始实施,直到没有测试失败。
答案 3 :(得分:0)
首先要意识到理论与实践之间的区别。
任何现实生活系统都会有通过TDD轻松创建的东西,而有些则不是。
最后一组是依赖于环境的一切,在处理不寻求抽象环境假设的系统时,但是实际上接受这些假设。
该组可以采用TDD方式开发,但需要额外的工具和软件工厂的扩展。
对于.Net,这将是工具和扩展,如MS虚拟测试实验室和SpecFlow。
我想要传达的是取决于。
对于非常简单的组件/单元测试,我们的想法是在编写要测试的代码之前编写一个失败的测试用例,并在测试成功运行时结束开发。
对于集成测试及其他(系统测试),除了考虑要测试的内容之外,还需要考虑如何将测试环境置于某种已知状态。