您现在的位置: 主页 > QQ黑客资讯 > 漏洞中心 > 文章内容

黑客基地网站浅谈测试驱动开发(TDD)使用实践

作者: 黑客基地 来源:黑客 时间: 2019-06-26 阅读:
要真正理解TDD,唯一的办法就是实践。让我们从一个简单的例子开始,这个例子并不要求任何特殊的工具。我们要写一个小程序,来帮助我们规划住宅前的一块长方形的草坪,但在设计之初,我们需要作两个测试:当长度为3,宽度为2 时,计算得到的面积应该为6;同时计算其周长应该为10。
 
tdd
 
写下这些测试有助于我们将焦点集中到程序的一些要点。在这个例子中,似乎创建一个对象来模拟问题域是合理的,因此我们创建了一个类,取名为Quad,来代表我们要建造的长方形草坪,并在一个简单的控制台应用程序中实例化它。下面就是我们实现的步骤:
 
1、启动桌面的Visual Studio,选择文件| 新建| 项目,选择C#项目类型中的“控制台应用程序”。为项目取名为“QuadApp”,然后点击OK。
 
2、在主函数中输入下列几行代码,创建Quad实例,并通过Assert 断言,当长宽各为3和2 时,返回的结果应该是6。
 static void Main(string[] args){ Quad q = new Quad(); System.Diagnostics.Debug.Assert(q.Area(3,2) == 6); }
 3、选择项目| 添加类,在对话框中输入“Quad.cs”,点击“打开”以创建类。
 
4、输入下列代码,创建在Main函数中用到的Quad 类的成员方法Area:
 public class Quad{     public int Area(int length, int width){         return 0;     } }
 5、选择生成| 生成QuadApp 菜单项,此时编译应该是成功的,然后当你运行该程序时,会报告错误,因为此时返回的面积值不等于6。
 
6、指定Area方法的返回值为6,再重新编译程序,并运行,此时没有错误发生。
 
7、改变Area 方法的实现,返回值用输入参数的乘积来代替起初指定的返回值常量。再次重新编译程序,并运行测试。
 
第二个测试(计算周长为10),与前面的方法相似。首先在主函数中通过assert 写测试代码,接着执行第4 到第7 步,只是方法名用Perimeter 而不是Area。当你在第七步中试图改变设计时,你可能会得出一个结果,就是可以通过构造函数来传递长和高的值,并将其存储为对象的属性,而不是通过成员方法的参数来传递。设计改变后的代码如下:
 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;     } }
 重新编译程序,并运行之,以保证你在写代码是否因粗心而漏掉了什么。
 
我们通过一种最简单的形式完成了演示TDD 工作原理的练习。下面是每一步的总结:
 写一个失败的测试:我们选择了一个最容易实现的测试(虽然在这个例子中所有的都很简单)来实现。接下来,我们写了个Quad 类的最简单实现,以保证程序能够通过编译。然而,当我们执行程序时,调试窗口会出现assert 的错误信息,因为返回的面积值不是6。 修改代码以通过测试:要修改代码,首先我们做一个最简单的方法,就是直接返回常量值6。该值刚好使程序能够运行且通过测试。接着下一个测试必须使用不同的参数值,迫使我们实现正确的算法,以通过所有的测试,即使我们还没有开始下一个环节的重构。 重构代码:既然在我们的程序中达到了正确的预期目的,我们应该试图去掉一些重复代码使代码更易维护,更简单,更灵活,也更易于理解。我们可以发现这种改变在运行测试时,并没有影响到程序的行为。
 修改代码使其易于维护,要求不能修改程序可观察的行为,这个思想并不是全新的理念。然而这里重要的是通过重构,而不是一遍一遍地整理代码。重构必须是软件开发活动中一个关键的环节,通过合适的工具,并采取系统的方法,可以逐步地改善代码的质量。通过执行贯穿于产品整个生命周期的许多次小的重构,最后达致最完美的目标,从而使得软件易于维护。
 
倘若必要的反馈要求你的设计(和代码)在产品开发中得到改进,则重构是测试驱动开发中不可缺少的步骤。当然你也可以不执行TDD方式,而进行重构以去除重复代码,使其更简单、灵活、更易于理解。无论你采取什么开发方式,你都需要将重构作为一种常规的活动,以保证你的更改是有效的。
 
重构的力量在于其能够减少因为改变正在工作的代码所带来的危险。好的工具能够帮助你减少潜在的危险,而同等重要的是要采取一系列严谨的步骤和正确的结构与规则。MartinFowler 的大作《重构:改善既有代码的设计》对于重构有非常精彩的描述。他定义了一系列非常有用的重构模式,并提供许多相关的样例指导你怎样进行重构。
 
目前,Visual Studio.Net 除了提供查找和替换功能外,对重构没有太多的支持。然而,相信在不远的将来MS会提供更多有力的工具,使你能完成更多复杂的工作,例如符号的重命名,在编译-生成级上更改类名,而不是在你的源文件中作替换操作。你甚至可以期待这样一天的到来——当你选中一段代码后,通过Visual Studio提供的菜单,直接应用重构模式,然后继续下一步工作。你有充足的信心保证你的程序是更加易于维护的,而不会引入bugs或者会改变其可观察的行为。