您的位置:軟件測試 > 開源軟件測試 > 開源單元測試工具 > junit
JUnit 4與TestNG
作者:網(wǎng)絡轉載 發(fā)布時間:[ 2015/11/13 14:02:41 ] 推薦標簽:軟件測試工具 單元測試工具

  <!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
  <suite name="My test suite">
  <test name="testing">
  <classes>
  <class name="com.fsecure.demo.testng.TestNGTest1" />
  <class name="com.fsecure.demo.testng.TestNGTest2" />
  </classes>
  </test>
  </suite>
  TestNG可以在這塊做的更好,使用了組的概念,每個方法都可以被分配到一個組里面,可以根據(jù)功能特性來分組。例如:
  這是一個有4個方法,3個組(method1, method2 和 method4)的類
@Test(groups="method1")
public void testingMethod1() {
System.out.println("Method - testingMethod1()");
}
@Test(groups="method2")
public void testingMethod2() {
System.out.println("Method - testingMethod2()");
}
@Test(groups="method1")
public void testingMethod1_1() {
System.out.println("Method - testingMethod1_1()");
}
@Test(groups="method4")
public void testingMethod4() {
System.out.println("Method - testingMethod4()");
}
  下面XML文件定義了一個只是執(zhí)行methed1的組的單元測試
  <!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
  <suite name="My test suite">
  <test name="testing">
  <groups>
  <run>
  <include name="method1"/>
  </run>
  </groups>
  <classes>
  <class name="com.fsecure.demo.testng.TestNGTest5_2_0" />
  </classes>
  </test>
  </suite>
  使用分組的概念,集成測試會更加強大。例如,我們可以只是執(zhí)行所有測試中的組名為DatabaseFuntion的測試。
  參數(shù)化測試
  參數(shù)化測試意思是給單元測試傳多個參數(shù)值。這個特性在JUnit 4 和TestNG。然后兩個框架實現(xiàn)的方式卻完全不同。
  JUnit 4
  @RunWith 和 @Parameter 注解用于為單元測試提供參數(shù)值,@Parameters必須返回 List,參數(shù)將會被作為參數(shù)傳給類的構造函數(shù)。
@RunWith(value = Parameterized.class)
public class JunitTest6 {
private int number;
public JunitTest6(int number) {
this.number = number;
}
@Parameters
public static Collection<Object[]> data() {
Object[][] data = new Object[][] { { 1 }, { 2 }, { 3 }, { 4 } };
return Arrays.asList(data);
}
@Test
public void pushTest() {
System.out.println("Parameterized Number is : " + number);
}
}
  它在使用上有許多的限制;我們必須遵循 JUnit 的方式去聲明參數(shù),參數(shù)必須通過構造函數(shù)的參數(shù)去初始化類的成員來用于測試。返回的參數(shù)類型必須是List [],數(shù)據(jù)已經(jīng)被限定為String或者是一個原始值。
  TestNG
  使用XML文件或者@DataProvider注解來給測試提供參數(shù)。
  XML文件配置參數(shù)化測試
  只是在方法上聲明@Parameters注解,參數(shù)的數(shù)據(jù)將由 TestNG 的 XML 配置文件提供。這樣做之后,我們可以使用不同的數(shù)據(jù)集甚至是不同的結果集來重用一個測試用例。另外,甚至是終用戶,QA 或者 QE 可以提供使用 XML 文件來提供他們自己的數(shù)據(jù)來做測試。
  Unit Test
  public class TestNGTest6_1_0 {
  @Test
  @Parameters(value="number")
  public void parameterIntTest(int number) {
  System.out.println("Parameterized Number is : " + number);
  }
  }
  XML 文件
  <!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
  <suite name="My test suite">
  <test name="testing">
  <parameter name="number" value="2"/>
  <classes>
  <class name="com.fsecure.demo.testng.TestNGTest6_0" />
  </classes>
  </test>
  </suite>
  @DataProvider 注解做參數(shù)化測試
  使用XML文件初始化數(shù)據(jù)可以很方便,但是測試偶爾需要復雜的類型,一個String或原始值并不能完全滿足。 TestNG 的@ DataProvider的注解,可以更好的把復雜的參數(shù)類型映射到一個測試方法來處理這種情況。
  @DataProvider 可以使用 Vector, String 或者 Integer 類型的值作為參數(shù)
  @Test(dataProvider = "Data-Provider-Function")
  public void parameterIntTest(Class clzz, String[] number) {
  System.out.println("Parameterized Number is : " + number[0]);
  System.out.println("Parameterized Number is : " + number[1]);
  }
  //This function will provide the patameter data
  @DataProvider(name = "Data-Provider-Function")
  public Object[][] parameterIntTestProvider() {
  return new Object[][]{
  {Vector.class, new String[] {"java.util.AbstractList", "java.util.AbstractCollection"}},
  {String.class, new String[] {"1", "2"}},
  {Integer.class, new String[] {"1", "2"}}
  };
  }
  @DataProvider 作為對象的參數(shù)
  P.S “TestNGTest6_3_0” 是一個簡單的對象,使用了get和set方法。
  @Test(dataProvider = "Data-Provider-Function")
  public void parameterIntTest(TestNGTest6_3_0 clzz) {
  System.out.println("Parameterized Number is : " + clzz.getMsg());
  System.out.println("Parameterized Number is : " + clzz.getNumber());
  }
  //This function will provide the patameter data
  @DataProvider(name = "Data-Provider-Function")
  public Object[][] parameterIntTestProvider() {
  TestNGTest6_3_0 obj = new TestNGTest6_3_0();
  obj.setMsg("Hello");
  obj.setNumber(123);
  return new Object[][]{
  {obj}
  };
  }
  TestNG的參數(shù)化測試使用起來非常的友好和靈活 (不管是XML配置還是在類里面注解的方式). 它可以使用許多復雜的數(shù)據(jù)類型作為參數(shù)的值,并且沒有什么限制。如上面的例子所示, we even can pass in our own object (TestNGTest6_3_0) for parameterized test
  依賴測試
  參數(shù)化測試意味著測試的方法是有依賴的,也是要執(zhí)行的的方法在執(zhí)行之前需要執(zhí)行的部分。如果依賴的方法出現(xiàn)錯誤,所有的子測試都會被忽略,不會被標記為失敗。
  JUnit 4
  JUnit 框架主要聚焦于測試的隔離,暫時還不支持這個特性。
  TestNG
  它使用dependOnMethods來實現(xiàn)了依賴測試的功能,如下:
  @Test
  public void method1() {
  System.out.println("This is method 1");
  }
  @Test(dependsOnMethods={"method1"})
  public void method2() {
  System.out.println("This is method 2");
  }
  如果method1()成功執(zhí)行,那么method2()也將被執(zhí)行,否則method2()將會被忽略。
  討論總結
  當我們做完所有特性的對比以后,我建議使用 TestNG 作為 Java 項目的主要單元測試框架,因為 TestNG 在參數(shù)化測試、依賴測試以及套件測試(組)方面功能更加強大。TestNG 意味著高級的測試和復雜的集成測試。它更加的靈活,特別是對大的套件測試。另外,TestNG 也涵蓋了 JUnit4 的全部功能。那沒有任何理由使用 Junit了。

上一頁12下一頁
軟件測試工具 | 聯(lián)系我們 | 投訴建議 | 誠聘英才 | 申請使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd