1. 程式人生 > >Junit4中怎樣隨心所欲的執行Test(一)

Junit4中怎樣隨心所欲的執行Test(一)

使用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",

                            ……

         };

}