测试驱动开发允许你在更好的了解问题之前不做出任何决定;在具备足够的关于产品将如何被开发的知识
之前,你不需要提出一个完美的架构;
一个最简单的测试:
所谓实践出真知,现在来做一个做简单的例子;我们不使用任何特殊的工具;
一个计算矩形面积和周长的程序:
public class Quad
{
public int Area(int length, int width)
{
return 0;
}
}
static void Main(string[] args)
{
Quad q = new Quad();
System.Diagnostics.Debug.Assert(q.Area(3,2) == 6);
}
执行程序,发生“断言失败”的错误,很明显,因为q.Area(3,2)!=6;
接下来硬编码,使q.Area(3,2)==6;
public class Quad
{
public int Area(int length, int width)
{
return 0;
}
}
再次运行,没有任何问题,一切正常;
接下来,重构测试程序:
public class Quad
{
private int m_length;
private int m_width;
public Quad( int length, int width)//初始化值
{
m_length = length;
m_width = width;
}
public int Area()//计算面积
{
return m_length * m_width;
}
public int Perimeter()
{
return m_length*2+m_width*2;
}
}
static void Main(string[] args)
{
Quad q = new Quad(3,2);
System.Diagnostics.Debug.Assert(q.Area() == 6);
System.Diagnostics.Debug.Assert(q.Perimeter()==10);
}
是的,没有发生任何异常;于是我们就用最简单的形式完成了一次演示TDD(测试驱动开发)的练习;接下
来是对于相关的每一步的摘要:
1.写下一个失败的测试:我们选择了一个看起来最容易实现的测试进行编码;接下来我们写了一个计算矩
形面积的最简单的实现以便编译它,尽管当我们执行程序的时候它发生了中断因为面积并不等于6;
2.修改代码通过测试:修改代码的过程中,我们用硬编码返回值6的方法完成了一个最简单的任务,目标仅
仅是让程序通过测试,接下来,我们使用了不同的参数强迫我们实现一个适当的算法来通过测试;
3.接下来我们重构了代码,使得程序更具有柔韧性,并且更易于理解;
关于TDD,注意到以下几点:
1.测试证明了代码,我们可以通过测试很清晰的看到Quad这个类究竟做了些什么;
2.我们可以通过测试来度量进度;每一个功能都被测试所证明;
3.测试能使每个人都对改变的代码充满自信,即使你是一个使用专家编写的类的C#菜鸟,执行所有测试能
保证你没有搞糟任何事情;
4.失误,正如传递长度与宽度数据给Area 和 Perimeter方法而不是构造函数一样,将在重构中被逐步纠
正;
5.当你在现实世界中使用TDD的时候,你会生成大量的测试,所以你需要使用像NUnit这样的工具组织你的
测试;
使用Nunit进行你的自动化测试:
在成百上千个测试的海洋中,小组成员将频繁经历“编写测试,修改代码,重构”这样的周期;本质就是
你可以很有效率的编写和运行测试;Nunit这样的框架就是设计来帮助你做这些事情的