走進Java接口測試之測試框架 TestNG 數據驅動(入門篇)

      網友投稿 1031 2022-05-30

      前言

      數據驅動的優勢?

      常見提供數據的方式?

      數據驅動的原理?

      TestNG如何實現?

      testng.xml 中的參數

      使用 DataProviders 的參數

      簡單使用

      @DataProvider函數插入參數使用

      延遲數據提供者

      前言

      數據驅動的優勢?

      常見提供數據的方式?

      數據驅動的原理?

      TestNG如何實現?

      testng.xml 中的參數

      使用 DataProviders 的參數

      簡單使用

      @DataProvider函數插入參數使用

      延遲數據提供者

      其他的高級玩法

      小結

      前言

      我們在前面的文章中,和大家分享過接口自動化測試一些基本的實現方法,但是,你很快就會發現,如果在測試腳本中硬編碼測試數據的話,測試腳本靈活性會非常低。而且,對于那些具有重復的請求,而只是測試入參不同的用例來說,就會存在大量重復的代碼。

      那么怎么把自己從簡單、重復的工作中解放出來呢?

      這個時候我們應考慮把測試數據和測試腳本分離,也就是說數據驅動。

      數據驅動的優勢?

      數據驅動很好地解決了大量重復腳本的問題,實現了“測試腳本和數據的解耦”。目前幾乎所有主流的自動化測試工具和框架都支持。

      數據驅動測試的數據不僅可以包括測試輸入數據,還可以包含測試驗證結果數據,甚至可以包含測試邏輯分支的控制變量。

      數據驅動的測試思想不僅適用于接口測試,也適合與單元測試,UI自動化測試,性能測試等

      常見提供數據的方式?

      硬編碼

      txt文件

      Json

      Yaml

      配置文件properties

      excel

      db

      網絡中

      數據驅動的原理?

      測試腳本中通過 data provider 去數據源中讀取一行數據,賦值給相應的變量,執行用例。接著再去文件中讀取下一行數據,讀取完所有的數據后,測試結束。參數化文件中有幾行數據,測試用例就會被執行幾次。如圖所示:

      TestNG如何實現?

      我們可以在每個測試方法上使用任意數量的參數,并指示 TestNG 使用 @Parameters 注釋傳遞正確的參數。

      TestNG有兩種方法可以設置這些參數(@Factory 數據工廠不在此介紹):

      使用 testng.xml

      DataProvider

      注意:

      TestNG.xml 中的參數可以是套件或測試級別;

      DataProvider 中的參數可以將 Method 和 ITestContext 作為參數。

      testng.xml 中的參數

      如果簡單參數,則可以在 testng.xml 中指定它們,在以下代碼中,我們指定的參數 name 和 age 值。 此 XML 參數在 testng.xml 中 定義:

      測試方法將分別接收參數 name 和 age 的值。

      @Slf4j public class ParamterTest { @Test @Parameters({"name","age"}) public void paramTest(String name,int age){ log.info("name = [{}] ; age = [{}]" ,name,age); } }

      注意 @Parameters 可以被放置在下列位置:

      在任何已經有 @Test,@Before/After 或 @Factory 注釋的方法上;

      最多只有一個測試類的構造函數。在這種情況下,TestNG 將調用此特定構造函數,并在需要實例化測試類時將參數初始化為 testng.xml 中指定的值。此功能可用于將類中的字段初始化為測試方法隨后將使用的值。

      @Parameters({ "name", "age" }) @BeforeMethod public void beforeTest(String name, String age) { m_name = name; // 查詢數據源值 m_age = age; }

      注意:

      XML 參數按照與注釋中相同的順序映射到 Java 參數,如果數字不匹配,TestNG 將報錯;

      參數是存在作用域的。在 testng.xml 中,可以在 suite 標記下或 test 下聲明它們 。如果兩個參數具有相同的名稱,則它是 test 中定義的具有優先權。如果需要指定適用于所有測試的參數并僅為某些測試覆蓋其值,這將非常方便。

      使用 DataProviders 的參數

      如果需要傳遞復雜參數或需要從 Java 創建的參數(復雜對象,從文件或數據庫讀取的對象等等),則在 testng.xml 中指定參數可能不夠。在這種情況下,可以使用數據提供程序提供測試所需的值。數據提供程序是類上的一個方法,它返回一組對象數組。此方法使用 @DataProvider 注釋。

      @DataProvider函數,需要定義屬性 name:

      @DataProvider(name="data") public Object[][] providerData(){ Object[][] objects = new Object[][]{ {"zhangsan",10}, {"lisi",20}, {"wangwu",30} }; return objects; }

      @Test 測試用例,屬性 dataProvider 需要指定對應的數據提供者名稱。

      @Test(dataProvider = "data") public void testDataProvider(String name,int age){ log.info("name = [{}] ; age = [{}]" ,name,age); }

      執行結果:

      name = [zhangsan] ; age = [10] name = [lisi] ; age = [20] name = [wangwu] ; age = [30] =============================================== Default Suite Total tests run: 3, Failures: 0, Skips: 0 ===============================================

      @DataProvider 函數可以插入 Method 和 ITestContext 類型參數,這兩個參數里面可以獲取很多有用的信息。

      @DataProvider函數:

      @DataProvider(name="methodData") public Object[][] methodDataTest(Method method){ Object[][] result=null; if(method.getName().equals("test1")){ result = new Object[][]{ {"zhangsan",20}, {"lisi",25} }; }else if(method.getName().equals("test2")){ result = new Object[][]{ {"wangwu",50}, {"zhaoliu",60} }; } return result; }

      @Test 測試執行腳本:

      @Test(dataProvider = "methodData") public void test1(String name,int age){ log.info("test111方法: name = [{}] ; age = [{}]" ,name,age); } @Test(dataProvider = "methodData") public void test2(String name,int age){ log.info("test222方法: name = [{}] ; age = [{}]" ,name,age); }

      執行結果:

      test111方法: name = [zhangsan] ; age = [20] test111方法: name = [lisi] ; age = [25] test222方法: name = [wangwu] ; age = [50] test222方法: name = [zhaoliu] ; age = [60] =============================================== Default Suite Total tests run: 7, Failures: 0, Skips: 0 ===============================================

      有的場景我們需要大量參數進行讀取,比如參數數據源是 DB,而數據達到百萬級,這樣測試程序遍歷所有數據時,可能就會導致內存溢出。

      那么我們怎樣解決這個問題?當我們獲取了一條數據,對它執行測試方法,然后就廢棄這個數據對象,再測試下一個。這個原則是延遲初始化,這個思想就是當你真正需要一個對象時才創建它,而不是提前創建它。

      為了實現這種方法,TestNG 允許我們從數據提供者返回一個 Iterator 對象,而不是一個二維對象數組。

      Iterator 是 java.util 包中的一個接口,它的方法簽名如下:

      public interface Iterator { boolean hasNext(); E next(); default void remove(); }

      它可以通過 next 調用下一組數據,這樣就有機會在最后一刻實例化相應的對象,即剛好在需要在這些參數的測試方法被調用之前。

      下面例子是重寫后的例子,我們實現了一個 Iterator,它將返回 4 個帶有不同ID的對象:

      public class AccoutIterator implements Iterator { private int index =0; static private final int MAX =4; @Override public boolean hasNext() { return index < MAX; } @Override public Object next() { return new Object[]{ //這里就是放入要實現的對象或者一組數據 "延遲數據提供:"+ (index++) }; } @Override public void remove() { throw new UnsupportedOperationException("remove"); }

      @DataProvider函數調用:

      @DataProvider(name = "iterator") public Iterator iteratorDataProvider(){ return new AccoutIterator(); }

      @Test測試運行函數:

      @Test(dataProvider = "iterator") public void testcase2(String name){ log.info(" name = [{}] " ,name); }

      運行結果:

      name = [延遲數據提供:0] name = [延遲數據提供:1] name = [延遲數據提供:2] name = [延遲數據提供:3] =============================================== Default Suite Total tests run: 4, Failures: 0, Skips: 0 ===============================================

      其他的高級玩法

      數據提供程序可以與并行屬性并行運行:

      @DataProvider(parallel = true) // ...

      從 XML 文件運行的并行數據提供程序共享相同的線程池,默認情況下大小為 10??梢栽?XML 文件的 suite 標記中修改此值:

      如果要在不同的線程池中運行幾個特定的數據提供程序,則需要從其他 XML文件運行它們。

      小結

      這篇的知識點:

      需要參數化來創建數據驅動測試;

      TestNG 支持兩種參數化,使用 @Parameter + TestNG.xml 并使用 @DataProvider;

      在 @Parameter + TestNG.xml中,參數可以放在套件級別和測試級別。如果在兩個地方聲明相同的參數名稱,測試級別參數將優先于套裝級別參數;

      使用 @Parameter + TestNG.xml,一次只能設置一個值,但 @DataProvider 返回一個2維的 Object 數組;

      走進Java接口測試之測試框架 TestNG 數據驅動(入門篇)

      如果 DataProvider 存在于不同的類中,那么測試方法所在的類,DataProvider 應該是靜態方法;

      有通過支持兩個參數的 DataProvider 的方法和 ITestContext;

      TestNG 允許我們從數據提供者返回一個 Iterator 對象,實現延遲提供數據。

      當然,DataProvider 只是從行為操作上分離了數據的提供方式,沒有從根本上解決自動化測試中測試數據本身的穩定性、快速響應變化、數據丟失、數據被修改的這些難點和阻礙:

      比如生產數據庫里的數據導入并刷新測試數據庫,之前用例里使用的數據被覆蓋;

      比如幾個小組在一個系統里使用同一個測試數據庫,AB組使用存在交叉,B組還要把數據改變一下再用,或者B組用完后測試數據已經發生改變;

      比如使用的測試數據具備時效性,狀態會改變的,從 active 變成 inactive 的等;

      自動化測試的其他方面都不是什么大問題,最主要的阻礙就是測試數據本身(特別是在真實的測試環境上時)

      本文示例源碼:

      https://github.com/zuozewei/blog-example/tree/master/Java-api-test/01-data-driven/springboot-testng-data-driven-demo

      參考資料:

      [1]:https://blog.csdn.net/LangSand/article/details/53895654

      [2]:https://testng.org/doc/index.html

      [3]:軟件測試52講 茹炳晟

      Java 自動化測試

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Observers: Scaling ZooKeeper Without Hurting Write Performance
      下一篇:期末數據結構復習的一點筆記
      相關文章
      中文字幕中韩乱码亚洲大片| va亚洲va日韩不卡在线观看| 激情综合色五月丁香六月亚洲| 国产天堂亚洲国产碰碰| 亚洲熟伦熟女专区hd高清| 亚洲AV成人影视在线观看| 亚洲一区欧洲一区| 色天使亚洲综合在线观看| 亚洲人成7777| 亚洲一区二区三区在线观看网站 | 一本色道久久88—综合亚洲精品 | 亚洲AV无码乱码麻豆精品国产| 亚洲资源在线视频| 1区1区3区4区产品亚洲| 亚洲成a人片在线观看播放| 亚洲一级免费毛片| 亚洲午夜无码久久| 含羞草国产亚洲精品岁国产精品| 精品久久久久亚洲| 亚洲国产精品尤物YW在线观看| 亚洲日韩人妻第一页| 色久悠悠婷婷综合在线亚洲| 亚洲精品成人片在线播放| 久久国产精品亚洲一区二区| 亚洲三级电影网站| 亚洲人成片在线观看| 亚洲 欧洲 日韩 综合在线| 亚洲国产成人精品无码区二本| 精品亚洲视频在线| 国产精品亚洲高清一区二区| 亚洲人成影院在线无码按摩店 | 亚洲欧洲专线一区| 色偷偷亚洲第一综合网| 亚洲午夜精品一级在线播放放| 国产精品亚洲精品日韩已满| 久久久久亚洲av无码专区 | 亚洲国产成人爱av在线播放| 黑人大战亚洲人精品一区| 久久亚洲精品无码| 亚洲国产精品网站久久| 亚洲日韩精品无码专区加勒比|