Junit4中怎样随心所欲的执行Test(一)

来源:互联网 发布:node sass error 4058 编辑:程序博客网 时间:2024/05/16 09:20

前言:使用junit4.4进行接口测试时,用来组织测试用例的测试类,我们称之为“TestCase”。TestCase中的每个测试用例用@Test来标记,在这里我们称测试用例为“Test”。在eclipse中,使用junit4.4来编写接口测试用例,可以单独运行一个Test,也可以批量执行指定TestCase中的所有Test。现因业务需要,我们需要在服务端升级到现网后,挑选一些基础用例来确认现网环境的正确性。因此我们只希望执行TestCase中指定的Test,而不是全部的Test,此时需要对junit进行扩展。

        在junit4中,执行指定TestCase中的所有Test,只需要在eclipse中简单的写上以下几行代码,就ok啦。只需要将待执行的TestCase类名添加到SuiteClasses中(eg:蓝色部分),junit会自动为这些TestCase创建一个默认的TestSuite,再由junit中的TestRunner来运行这些TestSuite。默认的TestSuite中包含所有的Test,所以所有的Test都会被执行。

@RunWith(Suite.class)
@SuiteClasses( { 
  TestAppjumpReq.class,
  TestCheckNameReq.class  …... 
})
public class AllTestCases {

}

        如果我们不想执行所有的Test,要么为每个TestCase提供一个自定义的TestSuite,要么对默认TestSuite中的Test进行过滤。前一种方法需要修改每个TestCase的代码,并有一定的侵入性,所以后一种方法更好。经过查看junit4.4的api,发现junit4提供了一个抽象类:Filter(过滤器),扩展这个类就可以过滤出默认TestSuite中应该执行的Test。实现方法如下:

1.       先写一个类继承Filter,通过用户告知的Test名称来过滤出对应的Test,代码如下:

public class BaseTestFilter extends Filter{

 

         private String methodname;

         public BaseTestFilter(String methodname){

                   this.methodname=methodname;

         }

        

         @Override

         public String describe() {

                  return methodname+"should test.";

         }

 

         @Override

         public boolean shouldRun(Description arg0) {

                   String name = arg0.getDisplayName().split("\\(")[0].trim();

                   if(name.equals((methodname.trim()))){

                            return true;

                   }

                   return false;

         }

}

 

2.      再写一个类,来运行过滤后的TestSuite,代码如下:

public class BaseTestSuites {

        

         public static Test suite() throws Exception {

                   TestSuite suite = new TestSuite("test for base testcase.");

                   JUnit4TestAdapter testAdapter;

                   //通过过滤器,添加基础测试到TestSuite中

                   for(int i=0;i<testClasses.length;i++){

                            testAdapter= new JUnit4TestAdapter(testClasses[i]);

                            testAdapter.filter(new BaseTestFilter(testNames[i]));

                            suite.addTest(testAdapter);

                   }

                   return suite;

         }

        

         public static void main(String[] args) throws Exception{

                   junit.textui.TestRunner.run(BaseTestSuites.suite());

    }

         //待执行的TestCase

         private static Class[] testClasses = {

                            TestAppjumpReq.class,

                            TestCheckNameReq.class,

                            ……

};

         //与上述TestCase对应一一对应,待执行的Test方法名。

         private static String[] testNames = {

                            "testAppjump_normal",

                            "testCheckName_normal",

                            ……

         };

        

}

0 0
原创粉丝点击