首页 > 代码库 > Java基础——JUnit

Java基础——JUnit

JUnit     

      测试的重要性毋庸质疑,但如何使测试更加准确和全面,并且独立于项目之外并且避免硬编码,JUnit给了我们一个很好的解决方案。

       可以说JUnit是为单元测试而生的,一个Java语言的单元测试框架。当然,和JUnit类似的,其他语言的单元测试框架还有:CppUnitNUnit等,几乎所有的单元测试工具XUnit都是依照JUnit来写的。

一、JUnit的命名规则和习惯

   1、如果有一个名为ClassA的被测试函数,那么测试类的名称就是TestClassA

   2、如果有一个名为methodA的被测试函数,那么测试函数的名称就是testMethodA

 示例

 首先假设有一个项目类Classs如下:

public class Classs {
Studentstudent=null;
//返回学生集合
publicList<Student> QueryStudent(){
List<Student>lsts=new ArrayList<Student>();
returnlsts;                
}
 
publicStudent QueryOne(){
returnstudent;
}
}
 

其中定义了一个QueryStudent方法返回一个集合;QueryOne的方法返回一个对象,好,现在我们要对方法进行测试。


public final voidtestQueryStudent() {
ClasssmyClass=new Classs();
assertNotNull(myClass.QueryStudent());
}
 
publicfinal void testQueryOne() {
ClasssmyClass=new Classs();
assertNotNull(myClass.QueryOne());
}


    这个方法在JUnit框架中称之为一个断言,JUnit提供给我们了很多断言,比如assertEqual,assertTrue...,我们可以利用这些断言来判断两个值是否相等或者二元条件是否为真等问题。

   然后我们可以运行JUnit来检测我们的测试结果,这样我们在不影响Project文件的前提下,实现了对Project单元的测试。

     JUnit框架下,他会自动执行所有以test..开头的测试方法(利用java的反射机制),如何自定义那些方法运行?一种方法我们可以改变测试方法的名称,不用test开头即可,这样测试框架就会忽略它;第二种方法我们可以自己手工组合我们需要的测试集合,我们可以通过创建test suite来取得,任何测试类都能够包含一个名为suite的静态方法:

TestStudent类:

public class TestStudentextends TestCase {
 
    public TestStudent(String string) {
super(string);
}
 
protectedvoid setUp() throws Exception {
super.setUp();
}
 
publicfinal void testQueryOneClass() {
Studentstudent=new Student();
assertNotNull(student.QueryOneClass());
}
 
publicfinal void testQueryClasss() {
Studentstudent=new Student();
assertNotNull(student.QueryClasss());
}
 
 public static Test suite(){
 TestSuite suite = new TestSuite();
 suite.addTest(newTestStudent("testQueryOneClass"));
 return suite;
 }
}

       我们通过suite显式的说明了我们要运行哪些test方法,而且,通过给构造函数的String参数传值:让TestCase返回一个对命名测试方法的引用。 

      如果要测试两个类里的测试方法,我们可以再写一个类,写suite方法,选择行测试几个类中的方法。

TestComposite类:

public classTestComposite extends TestCase {
 
  public TestComposite(String string) {
super(string);
}
 static public Test suite(){
 TestSuite suite = new TestSuite();
 suite.addTestSuite(TestClasss.class);
 suite.addTest(TestStudent.suite());
 return suite;
 }
}

     这个类会运行TestStudent类中的suite方法指定运行的测试方法,还会运行TestClasss类中存在的符合命名规范的方法。

总结

       JUnit给我们提供了很多方便的服务,例如:如果测试方法,每一个都需要数据库连接,那么我们岂不是要在代码里写很多遍?不用担心,JUnit给我们提供了能起到总控的方式。我们需要针对suite做一个setUptearDown,需要提供所需的一个suite(无论通过什么样的方法)并且把它包装进一个TestSetup对象,和动态代理的思想很类似,有兴趣的可以自己查一下,实现起来很简单。