用TestSuite管理Junit单元测试用例
因为在测试过程中可能不能同时run所有的测试用例,或者是想同时run不同的测试用例或所有的用例,那么我们就要维护一个公共的Suite,这个Suite可以添加TestSuite或一个单个用例(测试函数)。
TestCase->TestSuite,Testmethods->TestSuite
举例说明:
package calculor.Calculor;
import static org.junit.Assert.*;
import junit.framework.TestCase;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class CalcTest extends TestCase {
@Before
public void setUp() throws Exception {
}
@After
public void tearDown() throws Exception {
}
@Test
public void testAdd() {
//fail("Not yet implemented");
assertEquals(2, 2);
}
}
另外一个TestCase集合类
package calculor.Calculor;
import static org.junit.Assert.*;
import junit.framework.TestCase;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class TTmmTest extends TestCase {
public TTmmTest(){}
public TTmmTest (String name){
super(name);
}//注意这里添加了这个构造函数,因为要调用父类的构造函数,用于下面Suite添加该类的测试方法
@Before
public void setUp() throws Exception {
}
@After
public void tearDown() throws Exception {
}
@Test
public void testHelloworld() {
//fail("Not yet implemented");
assertEquals(2,2);
}
}
那么我们就可以对这两个不相关的测试类集合进行包装,就是建立一个TestSuite类,封装这些不相关的类,这对于我们大的项目来说是非常关键的,因为我们可能同时维护很多测试类,run回归测试用例等。
package calculor.Calculor;
import junit.framework.Test;
import junit.framework.TestSuite;
//import junit.sampling.*;
public class TestAll {
public static Test suite()
{
TestSuite suite =x new TestSuite("All tests from part1");//表明这个标识性东西
suite.addTestSuite(TTmmTest.class);
suite.addTestSuite(CalcTest.class);
suite.addTest(new TTmmTest("testHelloworld"));//这里可以添加单个的测试方法
return suite;
}
}
Tips:我们看到我们实际上增加了一个Test类,实际上Testsuite,TestCase都是实现了Test接口。
创建过程:TestRunner一开始现寻找测试类中的suite方法,找到了就加入testsuite
注意在编写测试用例的时候,要保持测试用例的独立性
一个原则,每条单元测试用例都必须独立运行,不能依靠其他测试用例,或者不能按照什么顺序运行才可以。如果依靠其他测试用例的话,会给调试带来非常大的麻烦,所以这点一定要记住。
貌似目前项目用到的Eclipse中新建Test Suite的向导是针对Junit3的,而且网上很多资料介绍Test Suite也都是Junit3的,这里简要介绍一下Junit4中Test Suite的使用方法。
一种是类似Junit3的方法:
import junit.framework.JUnit4TestAdapter;
import junit.framework.Test;
import junit.framework.TestSuite;
Junit3中是直接suite.addTest(Test1.class),Junit4中需要用JUnit4TestAdapter来转换一下。TestSuite中也可以添加TestSuite,方法是一样的,即suite.addTest(new JUnit4TestAdapter(TestSuite2.class));
另一种是使用标注的方法:
import junit.testcase.JUnitTestCase;
import junit.testcase.TestCase2;
import org.junit.runner.RunWith;
来看看一个例子:
在这个例子中,您并没有看到任何的TestSuite,事实上,若是您没有供给任何的TestSuite,TestRunner会本身建树一个,然後这个 TestSuite会应用反射(reflection)主动找出testXXX()办法。
若是您要自行生成TestSuite,则在持续TestCase之後,供给静态的(static)的suite()办法,例如:
return new TestSuite(MathTool.class);
}
若是您没有供给任何的TestSuite,则TestRunner就会像上方如许主动为您建树一个,并找出testXXX()办法,您也可以如下面定义 suite()办法:
TestSuite suite = new TestSuite(MathTool.class);
suite.addTest(new MathToolTest("testGcd"));
return suite;
}
JUnit并没有规定您必然要应用testXXX()如许的体式格式来定名您的测试办法,若是您要供给本身的办法(当然JUnit 激劝您应用testXXX()如许的办法名称),则可以如上撰写,为了要可以或许应用建构函式供给测试办法名称,您的TestCase 必须供给如下的建构函 式:
super(testMethod);
}
若是要参加更多的测试办法,应用addTest()就可以了,suite()办法传回一个TestSuite物件,它与 TestCase都实作了Test介面,TestRunner会调用TestSuite上的run()办法,然後TestSuite会将之委托给 TestCase上的run()办法,并履行每一个testXXX()办法。
除了组合TestCase之外,您还可以将数个TestSuite组合在一路,例如:
TestSuite suite= new TestSuite();
suite.addTestSuite(TestCase1.class);
suite.addTestSuite(TestCase2.class);
return suite;
}
如此之来,您可以一次运行所有的测试,而不必个此外运行每一个测试案例,您可以写一个运行全部测试的主测试,而在应用TestRunner时呼唤 suite()办法,例如:
TestCase与TestSuite都实作了Test介面,其运行体式格式为 Command 模式 的一个实例,而TestSuite可以组合数个TestSuite或TestCase,这是 Composite 模式 的一个实例。