fitnesse java_从Fitnesse中学习Java单元测试

news/2024/7/8 3:20:15

从第一次知道Fitnesse这个集成测试工具到现在也已经差不多有2年多的时间了。在这个期间把Fitnesse的源码也算是反反复复阅读了很多遍,算是对其实现的原理和方法有所了解。在最近一次对Fitnesse最新版本代码的研究中我发现,Fitnesse除了是一个很好的开源集成测试框架之外,它的源代码还是一个非常好的实施Java单元测试的例好例子。

首先我们可以看到在Fitnesse的每个类,都有一个对应的Test的类来构建针对这个功能类的单元测试。

9aa00182e73fda091b01ac0a8f950cf7.png

一个好的单元测试的命名是非常重要的,它可以让我们很清楚的指导我们的单元测试类是针对哪个功能类编写的。Fitnesse的开发团队采用的命名规范是在功能类的名字后面增加Test的后缀,这样可以在一个包里面很好的区分功能类和测试类。

单元测试类和源码之间的放置关系也是我们经常遇到的问题。在这里Fitnesse的开发团队把所有的单元测试类(*.Test)和源码是放在同一个项目里面,并且也放在同一个包内,这样在功能上非常容易区分和归类。我们可以很容易的找到单元类的测试类在哪里。其次这样的单元测试类在编写上更加方便,不太收到java的access控制的影响。例如protected的变量在包内是可见的,这样的话同一包内的单元测试类就可以对很轻松的针对它进行单元测试。第三在Fitnesse的发布的build.xml中,也很好的继承了单元测试,这样在发布的过程中对于质量有了很好的控制,做到了单元测试自动化。参考下面的build.xml文件

ce3cb4c96e6d3ec908a88f15d89366a8.png

我们到底应该对哪些方法做单元测试呢?这个问题也一直是我们在做单元测试的时候一直困扰的问题。我们之前习惯上算是针对没一个方法构建单元测试,这样的单元测试在覆盖率上很高,但是工作的时间成本就会直线上身。测试工作需要在时间和质量上寻找一个平衡。从Fitnesse的源代码中可以看到,Fitnesse的开发团队并没有采用上面的那种单元测试的方法。他们采用的是针对主要的功能方法进行单元测试。我们来看下面这个例子

……………………

这样就完成了针对所有可能的Http Response Code的测试的覆盖。这里只是一个简单的Fitnesse中的例子,在很多其他的单元测试类中我们都能看到。

针对主要功能函数的构建单元测试对于独立进行单元测试的测试团队来说是一个很大的考验。正式因为Fitnesse源码的单元测试是其开发团队自己编写的,他们可以很清楚的指导哪个函数是关键函数,哪个是不重要的。但是如果是独立的测试团队,他们就很难去判断被测试函数的重要性来决定是否需要构建单元测试。

单元测试中最最重要的一个概念就是驱动模块和桩模块。从百度百科上我查到的定义如下:

驱动模块是用来模拟被测试模块的上一级模块,相当于被测模块的主程序。它接收数据,将相关数据传送给被测模块,启用被测模块,并打印出相应的结果。

21/212>


http://www.niftyadmin.cn/n/3528577.html

相关文章

java 获得basepath_JavaWeb项目获取绝对路径basePath

1. freemarker获取系统相对路径方式spring-mvc.xml 中配置其中是关键。ftl页面中设置首页js文件中获取pathvar base document.getElementById("base").href;// 与后台交互_send function(async, url, value, success, error) {$.ajax({async : async,url : base /…

java 分析工具_java分析工具

java分析工具jinfojstatjmapjstack1.jinfo查看java进程的扩展参数-flag 查看某个jvm参数-flag /- 动态开启或关闭部分jvm参数-flag namevalue 修改部分jvm参数flags 查看所有jvm参数-sysprops 查看系统参数(System.getProperties())①-flag 查看某个jvm参数jvm参数②flag /- 动…

Java web登录拦截器_SpringMVC拦截器实现登录认证

博客以Demo的形式讲诉拦截器的使用项目结构如图:需要的jar:有springMVC配置需要的jar和jstl需要的jarSpringMVC包的作用说明:aopalliance.jar:这个包是AOP联盟的API包,里面包含了针对面向切面的接口。通常spring等其它具备动态织入功能的框架…

java 文件备注_java文档注释:

java支持三种注释方式,前两种分别是//和/* */,第三种被称作说明注释,它以/**开始,以*/结束.说明注释允许你在程序中嵌入关于程序的信息,你可以使用javadoc工具软件来生成信息,并输出到html文件中。说明注释,使你更加方便的记录你的…

java 访问私有成员_javap反编译探寻内部类为何能访问外部私有成员

Java语言理论告诉我们内部类对象持有外部类对象的一个引用,这说明内部类与外部类还是独立的两个类,只不过内部类对象通过持有外部类的对象的引用来维持这个关系。通常任何一个类都不可能访问另一个类的私有成员,那么内部类是如何做到访问外部…

java dblink_Oracle中dblink的实际应用示例详解

前言本文介绍的是关于Oracle同义词dblink的实际应用,下面话不多说了,来一起看看详细的介绍吧。业务需求:原数据库(10.2.0.4.0),新数据库(11.2.0.3)由于程序的需求原因,现在需要把新库上的某个用户直接映射到老库用户下…

java数据库映射_java日期、时间以及数据库映射处理

继承关系:java.lang.Object->java.text.Format->java.text.DateForm->java.text.SimpleDateFormat日期代码:G年代,y年,M月,d日,h时(上下午1-12),H时(24小时制),m分钟&#…

java中什么是事件_java中的事件

package事件处理3;importjava.awt.*;importjavax.swing.*;publicclassWindowextendsJFrame{JTextFieldtext;JButtonbutton;Policelistener;publicWindow(){init();setBounds(100,100,1...package 事件处理3;import java.awt.*;import javax.swing.*;public class Window extend…