2007-09-10
测试驱动开发With JUnit(二)
关键字: java 测试 junit第二章:JUnit测试套件:
在第一节中简单的介绍了JUnit的使用,但是每次运行测试类时,该测试类的所有方法全部都被测试一遍,如果想单独测试某个方法还是比较麻烦的。但是可以利用测试套件来解决这个问题。
下面我们先更改CalculateUtilTest向里面增加一个构造方法
代码解释:
1行:自定义构造方法,里面有一个String参数,在该方法中调用父类的构造方
在第一节中简单的介绍了JUnit的使用,但是每次运行测试类时,该测试类的所有方法全部都被测试一遍,如果想单独测试某个方法还是比较麻烦的。但是可以利用测试套件来解决这个问题。
下面我们先更改CalculateUtilTest向里面增加一个构造方法
- import junit.framework.TestCase;
- public class CalculateUtilTest extends TestCase
- {
- public CalculateUtilTest(String name) //1行
- {
- super(name);
- }
- ……其余方法省略
- }
代码解释:
1行:自定义构造方法,里面有一个String参数,在该方法中调用父类的构造方
法。
构造一个类来操作测试套件:
构造一个类来操作测试套件:
- import junit.framework.*;
- public class MainTest
- {
- public static Test suite() //1行
- {
- TestSuite suite = new TestSuite(); //2行
- //添加测试testDivision方法
- suite.addTest(new CalculateUtilTest("testDivision")); //3行
- //添加测试testCreate方法
- suite.addTest(new CalculateUtilTest("testCreate"));
- return suite;
- }
- public static void main(String[] args)
- {
- //执行测试
- junit.textui.TestRunner.run(suite()); //4行
- }
- }
代码解释:
1行:静态方法,返回Test类对象。该方法主要是构造TestSuite类对象,然后向
1行:静态方法,返回Test类对象。该方法主要是构造TestSuite类对象,然后向
其中加入你想要测试的方法。
2行:构造TestSuite类对象
3行:向TestSuite对象中添加一个要测试的方法。
new CalculateUtilTest("testDivision")表示测试CalculateUtilTest类的
2行:构造TestSuite类对象
3行:向TestSuite对象中添加一个要测试的方法。
new CalculateUtilTest("testDivision")表示测试CalculateUtilTest类的
testDivision方法。
4行:运行该测试套件
上面的方法可以非常方便地添加自己所需要的方法,如果是用该方法,就要在编写测试方法时将其加入测试套件中。如果你觉得很麻烦,那么就使用下列一行代码一次测试一个类吧。
或者在suite方法中添加所要测试的类也可以
4行:运行该测试套件
上面的方法可以非常方便地添加自己所需要的方法,如果是用该方法,就要在编写测试方法时将其加入测试套件中。如果你觉得很麻烦,那么就使用下列一行代码一次测试一个类吧。
- public static void main(String[] args)
- {
- junit.swingui.TestRunner.run(CalculateUtilTest.class);
- }
或者在suite方法中添加所要测试的类也可以
- public static Test suite()
- {
- TestSuite suite = new TestSuite();
- suite.addTestSuite(CalculateUtil.class);
- return suite;
- }
尽管上面的测试套件提供了你所需要的各种粒度测试方法(按照方法名,测试整个类),但是有个问题是,当我们面临一大堆测试代码时,很容易忘记将你的测试类加入到一个测试套件中去。一个好的解决方法是让java程序扫描你的classpath中的全部类,搜集所需要的测试类然后逐一执行。这样做的好处就是不会有测试被遗漏,但缺点是某些测试,你并不希望每次都运行它们。具体做法如下:先编写收集测试类的功能,并将全部测试类装入测试套件。代码如下
- import java.lang.reflect.Modifier;
- import java.util.*;
- import junit.runner.*;
- import junit.framework.*;
- public class SuiteBuilder
- {
- //将所有的测试类都加入TestSuite中
- public Test suite()
- {
- TestSuite suite=new TestSuite();
- List list=getTestClassNames();
- for(int i=0;i
- {
- suite.addTestSuite(createClass(list.get(i).toString()));
- }
- return suite;
- }
- //获取全部测试类的类名
- public List
getTestClassNames() - {
- TestCollector collector = new ClassPathTestCollector()
- {
- public boolean isTestClass(String classFileName)
- {
- if (!super.isTestClass(classFileName))
- return false;
- String className = classNameFromFile(classFileName);
- Class clazz = createClass(className);
- return TestCase.class.isAssignableFrom(clazz) && isConcrete(clazz);
- }
- };
- return Collections.list(collector.collectTests());
- }
- //判断该类是否是接口或抽象类
- private boolean isConcrete(Class clazz)
- {
- if (clazz.isInterface())
- return false;
- int modifiers = clazz.getModifiers();
- return !Modifier.isAbstract(modifiers);
- }
- //加载该类
- private Class createClass(String name)
- {
- try
- {
- return Class.forName(name);
- }
- catch (ClassNotFoundException e)
- {
- return null;
- }
- }
- //判断该类是否是测试类:标准如下
- //1:类文件以.class结束
- //2:类名不能有$,防止内部类
- //3:类名必须以Test单词结尾
- protected boolean isTestClass(String classFileName)
- {
- return classFileName.endsWith(".class") && classFileName.indexOf('$') < 0 &&
- classFileName.indexOf("Test") > 0;
- }
- }
注:注释都比较详细,在这里就不多解释了。
然后编写测试套件类:
运行该测试套件,你会发现在你的classpath下的所有测试类都会被执行。只不过是文本形式显示结果。
然后编写测试套件类:
- package com;
- public class MainTest
- {
- public static void main(String[] args)
- {
- junit.textui.TestRunner.run(new SuiteBuilder().suite());
- }
- }
运行该测试套件,你会发现在你的classpath下的所有测试类都会被执行。只不过是文本形式显示结果。







评论排行榜