1. 程式人生 > 其它 >測試驅動技術(TDD)系列之2:詳解TestNG引數化

測試驅動技術(TDD)系列之2:詳解TestNG引數化

技術標籤:測試基礎知識測試開發自動化測試單元測試java

上一篇文章介紹了測試驅動的相關概念,並以junit4為例,帶大家瞭解如何在測試框架中實現測試驅動。詳情:

測試驅動技術(TDD)系列之1:一文帶你上手測試資料驅動

大家會發現Junit4在同一個測試類中實現多組資料的資料驅動,不是很方便,需要我們自己解決!我也說過在TestNG中這個問題很容易搞定!給自己挖了個坑!自己挖的坑總要填上,那麼今天就給大家講解一下資料驅動在TestNG中的應用。本篇文章只重點講解TestNG引數化相關知識,關於TestNG的環境配置以及基礎使用不在本文的討論範圍!TestNG中使用DataProvider實現引數化功能,在執行用例的時候dataProvider迭代中的每組資料都是作為一個用例執行。

一組引數化資料

定義引數化資料,程式碼如下:

@DataProvider

public Object[][] dp1() {

return new Object[][] {

new Object[] { 1, 1,0 },

new Object[] { 2, 1,1 },

new Object[] { 2, 1,2 },

};

}

用例中使用引數化資料(dp1定義的),程式碼如下:

@Test(dataProvider = "dp1")

public void f1(Integer n1, Integer n2, Integer n3) {

Integer result=n2+n3;

assertEquals(n1,result);

}

多組引數化資料

在一個測試類中,可以定義多組引數化資料(引數化資料個數不同,dp1三個,dp2二個),程式碼如下:

@DataProvider

public Object[][] dp2() {

return new Object[][] {

new Object[] { 1, 1},

new Object[] { 2, 1},

new Object[] { 2, 1},

};

}

用例中使用引數化資料(dp2定義的),程式碼如下:

@Test(dataProvider = "dp2")

public void f2(Integer n1, Integer n2) {

assertEquals(n1,n2);

}

測試方法通過DataProvider引用

我們可以自定義一些方法,對外部檔案進行讀取,然後把讀取的資料作為引數在TestNG中引用,具體方法如下:

寫一個讀取各類檔案的方法(txt、excel、db)具體程式碼就不給出了,但是一定注意方法的返回值必須是Object[][](關於操控excel的知識會在後面的文章中介紹)

public Object[][] readfile(String p_file){

return new Object[][] {{ 1, 1},{ 1, 2}};

}

在@DataProvider修飾的方法中呼叫該方法(也可以直接實現)

@DataProvider(name = "dp_func")

public Object[][] testData(Method testMethod) {

return readfile("");

}

用例中使用引數化資料(dp_func),程式碼如下:

@Test(dataProvider = "dp_func")

public void f3(Integer n1, Integer n2) {

assertEquals(n1,n2);

}

完整程式碼

import org.testng.annotations.DataProvider;

import org.testng.annotations.Test;

import staticorg.testng.Assert.assertEquals;

import java.lang.reflect.Method;

public class NewTest {

      @DataProvider
      public Object[][] dp1() {

        return new Object[][] {
          new Object[] { 1, 1,0 },
          new Object[] { 2, 1,1 },
          new Object[] { 2, 1,2 },
        };

      }

      @DataProvider
      public Object[][] dp2() {

        return new Object[][] {
          new Object[] { 1, 1},
          new Object[] { 2, 1},
          new Object[] { 2, 1},
        };

      }

      @DataProvider(name = "dp_func")
        public Object[][] testData(Method testMethod) {

          return readfile("");

        }

     //讀取各類檔案,返回值是Object[][]

      public Object[][] readfile(String p_file){

          return  new Object[][] {{ 1, 1},{ 1, 2}};

      }

  @Test(dataProvider = "dp1")
  public void f1(Integer n1, Integer n2, Integer n3) {

      Integer result=n2+n3;
      assertEquals(n1,result);

  }

  @Test(dataProvider = "dp2")
  public void f2(Integer n1, Integer n2) {

     assertEquals(n1,n2);

  }

  @Test(dataProvider = "dp_func")
  public void f3(Integer n1, Integer n2) {

      assertEquals(n1,n2);

  }

}

執行測試用例,可以看到用例成功地進行了引數化,f1執行了3次,f2執行了3次,f3執行了2次,如下圖所示: