2013-01-03 128 views
8

我想在编写代码之前学习如何编写测试用例。我阅读了一篇关于测试驱动开发的文章。我想知道开发人员如何编写测试用例例如,此方法:如何编写测试用例?

public int divideNumbers(int num1, int num2) 
    { 
     return num1/num2; 
    } 
+1

你知道你已经在测试之前编写了代码吗? :) – Rafal

回答

3

我们现在从一个空白项目开始。你想做点什么,比如说划两个数字。所以,你写一个测试说明您想做什么:

Assert.That(divide(10,2), Eq(5)) 

这个测试给你一个切入点:它描述了divide方法可接受的接口。因此,您继续执行它作为例如int divide(int x, int y)

写测试,描述你期望从你的代码中得到什么。你不需要考虑太多。编写期望的最正常方式可能是设计代码的最佳方式,然后您可以实现它以满足您的测试。

1

有几个测试步骤。来自MSDN;

你的情况;

Assert.AreEqual(divideNumbers(8, 4), 2); 

Assert类验证中使用true/false命题单元测试的条件。你应该写你的测试用例,你期待他们的结果。您可以使用TestMethod属性来测试您的测试方法。有一个很酷的帖子关于Creating Unit tests for your c# code。分析得很好。

+0

其实我想问的答案是你从codeproject分享的链接。谢谢。 – cihata87

0

从实现理论与实践的区别开始。

任何现实生活系统都会通过TDD轻松创建,而另一些则不是。

最后一组是依赖于环境的一切,当工作在一个不寻求抽象环境假设但实际接受这些假设的系统上时。

该组可以采用TDD方式进行开发,但需要对软件工厂进行额外的工具和扩展。

对于.Net这将是工具和扩展,如MS虚拟测试实验室和SpecFlow。

我想沟通的是它取决于

对于非常简单的组件/单元测试,想法是编写一个失败的测试用例,然后编写要测试的代码,并在测试成功运行时结束开发。

对于集成测试和超越(系统测试),除了考虑测试什么以外,还需要考虑如何将测试环境带入某种已知状态。

1

从您想要开发的函数/类/组件的存根开始。它应该编译,但是故意不(它)做它应该做的事情。

例如:

public int divideNumbers(int num1, int num2) 
{ 
    throw new NotImplementedException(); 
} 

return -42; 

想一想预期的行为,治疗存根以黑盒的接口。不关心实现(还)。想想接口的“契约”:X进去了,Y出去了。

确定标准案例和重要egde案件。为他们写测试。

对于整数除法(假设我们会从头开始写),实际上有相当多的情况需要考虑:有和没有余数,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); 

编译并运行单元测试。他们都失败了吗?如果不是,为什么?也许其中一个测试不按预期工作(测试也可能是越野车!)。

现在开始实施,直到没有测试失败了。

相关问题