核心實驗:基於TestNG實現代碼級

核心實驗:基於TestNG實現代碼級

來自專欄強哥學堂19 人贊了文章

實驗簡介

TestNG是Java中的一個測試框架, 類似於JUnit 和NUnit,功能都差不多,TestNG也是以JUnit和NUnit的一些特性作為參考開發而成的,只是功能稍微強大一些,使用也更方便。測試人員一般用TestNG來寫自動化測試。開發人員一般用JUnit寫單元測試。但是這並不是必然的,無論選用哪種框架,並不決定我們的代碼級測試開發工作是否做得很好。

實驗目的

(1)掌握TestNG的使用以及與JUnit的區別。

(2)為後續學習其它基於上述兩種框架的測試技術打下基礎。

實驗流程

  1. 安裝配置TestNG

(1)通過Eclipse的菜單Help -> Install New Software:

輸入網址:beust.com/eclipse 安裝即可,視網路情況可能會花較長時間。

(2)直接下載文件並進行離線安裝:

直接去網址dl.bintray.com/testng-t 下載離線安裝包。將下載的文件解壓,將目錄features和plugins下面的文件複製到Eclipse目錄下相對應的文件夾下,重啟Eclipse即可。

2. 驗證TestNG安裝

在File -> New -> Other中,我們能夠看到可以創建TestNG class的文件,則說明安裝成功。

3. 導入TestNG庫文件到當前項目

進入菜單Project -> Properties -> Java Build Path -> Libraries,選擇 Add Library,瀏覽到TestNG類庫,點擊確認即可將TestNG需要用到的jar包導入到當前項目中,這一操作跟JUnit類似。

4. 完成對isNumber和splitString的簡單測試

先實現測試代碼和斷言,同樣使用@Test為每個測試用例進行註解

package com.woniuxy.testng;import org.testng.annotations.AfterTest;import org.testng.annotations.BeforeTest;import org.testng.annotations.Test;import org.testng.Assert;import com.woniuxy.compare.StringHandle;public class StringHandleTest { @BeforeTest public void init() { System.out.println("測試用例正在執行..."); } @Test public void isNumber() { StringHandle stringHandle = new StringHandle(); String source = "123.45"; boolean actual = stringHandle.isNumber(source); Assert.assertTrue(actual); } @Test public void splitString() { StringHandle stringHandle = new StringHandle(); String source = "333,111,222,666"; Integer[] expect = {333, 111, 222, 666}; Integer[] actual = stringHandle.splitString(source, ","); Assert.assertEquals(expect, actual); } @AfterTest public void end() { System.out.println("測試用例執行完成..."); }}

5. 使用Eclipse方式運行

在包com.woniuxy.testng下,右鍵選擇上述測試類:「StringHandleTest」,選擇「Run As」 -> TestNG Test」的方式運行。運行結果如下:

同樣,我們在另外一個視圖:Results of running class …中,也可以看到詳細信息,還可以用瀏覽器打開HTML格式的報表:

6.使用XML方式運行

除了使用Run As的方式執行測試以外,TestNG提供了另外一種更加靈活的執行手段:通過XML文件執行。我們可以在當然包下面創建一個XML文件,命名為:ArrayCompareTestSuite.xml,格式如下:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" ><suite name="Suite-1"> <test name="Test-1"> <classes> <class name="com.woniuxy.testng.ArrayHandleTest" /> <class name="com.woniuxy.testng.StringHandleTest" /> </classes> </test></suite>

在此XML文件上,點擊右鍵,Run As -> TestNG Suite,即可開始運行。注意一下,上述XML中,我們其實運行了兩個測試類,一個叫ArrayHandleTest,一個叫StringHandleTest,我們可以通過設定兩個測試類的順序來決定先運行哪個測試。這也是TestNG非常方便的地方。

7. 為ArrayHandle類快速添加測試類

除了直接創建一個普通的Java類文件來創建TestNG的測試用例以外,我們還可以有一種相對快速的創建測試類的辦法。

(1)選中要進行測試的被測類,比如此處我們選擇com.woniuxy.compare包下的ArrayHandle.java,右鍵,選擇New -> Other -> TestNG –> TestNG Class,下一步,選擇要添加測試用例的方法:

(2)輸入相應的包信息,注意路徑和測試代碼的目標包,寫錯了會重複創建包,沒有必要:

(3)自動生成部分測試代碼:

package com.woniuxy.testng;import org.testng.annotations.Test;public class ArrayHandleTest { @Test public void arrayCompare() { throw new RuntimeException("Test not implemented"); } @Test public void arraySort() { throw new RuntimeException("Test not implemented"); }}

當然,這樣的代碼只是一個框架而已,沒有實際用途。

(4)完善測試驅動程序:

package com.woniuxy.testng;import org.testng.Assert;import org.testng.annotations.Test;import com.woniuxy.compare.ArrayHandle;public class ArrayHandleTest { ArrayHandle ah = new ArrayHandle(); @Test public void arrayCompare() { Integer[] source = {22, 33, 55, 77, 11, 99, 66}; Integer[] expect = {11, 22, 33, 55, 66, 77, 99}; Assert.assertFalse(ah.arrayCompare(source, expect)); } @Test public void arraySort() { Integer[] source = {22, 33, 55, 77, 11, 99, 66}; Integer[] expect = {11, 22, 33, 55, 66, 77, 99}; Integer[] actual = ah.arraySort(source); Assert.assertEquals(expect, actual); }}

8. TestNG按順序執行Case

針對一個測試類中,有多個測試用例的情況,我們也可以為每一個測試方法單獨指定運行順序。就像執行多個測試類一樣,我們通過配置XML文件的順序來進行:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" ><suite name="Suite-2"> <test name="Test-2" preserve-order="true"> <classes> <class name="com.woniuxy.testng.ArrayHandleTest"> <methods> <include name="arraySort" /> <include name="arrayCompare" /> </methods> </class> </classes> </test></suite>

9. TestNG組測試

在TestNG中,我們還可以把測試用例進行分組,比如本次測試我們只測試ArrayHandle的arraySort和StringHandle的isNumber兩個方法,那麼這個時候,我們通過把這兩條測試用例指定為同一組,即可實現交叉執行。

(1)先在ArrayHandleTest類中的arraySort的@Test註解後面加上 @Test(groups = {"group1"}):

@Test(groups = {"group1"})public void arraySort() { Integer[] source = {22, 33, 55, 77, 11, 99, 66}; Integer[] expect = {11, 22, 33, 55, 66, 77, 99}; Integer[] actual = ah.arraySort(source); Assert.assertEquals(expect, actual);}

(2)再在StringHandleTest類中的isNumber的註解上加上:@Test(groups = {"group1","group2"}),其實大家可以看到,groups後面跟的就是一個字元串數組,基於此來判斷哪些用例應該被執行。一個測試用例是可以屬於多個組的。

(3)編寫XML執行文件:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" ><suite name="Suite-1"> <test name="Test-1"> <groups> <run> <include name="group1" /> </run> </groups> <classes> <class name="com.woniuxy.testng.ArrayHandleTest" /> <class name="com.woniuxy.testng.StringHandleTest" /> </classes><!-- 也可以通過指定包名來快速完成,但是不要與類名同時指定<packages> <package name="com.woniuxy.testng"></package> </packages> --> </test></suite>

這樣,執行該XML文件,即只會執行groups = {「group1」}的測試用例。需要注意的是,如果分組位於多個類中,我們需要在XML中一起指定完整。

10.TestNG的註解

11. TestNG異常測試

package com.woniuxy.testng;import org.testng.annotations.Test;public class ExceptionTest { @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp="NullPoint") public void testException(){ throw new IllegalArgumentException("NullPoint"); }}

12. TestNG參數化測試

參數化測試的目的主要為了測試腳本與測試數據分離,這也是自動化測試框架的標配功能。在TestNG中,我們可以通過兩種方式實現參數化測試。

(1)使用XML文件方式

先定義測試用例,注意參數的註解格式和對應的測試用例的參數傳遞方式和參數類型:

@Test@Parameters({"number","expect"})public void isNumberParam(String number, boolean expect) { StringHandle stringHandle = new StringHandle(); String source = number; boolean actual = stringHandle.isNumber(source); Assert.assertEquals(actual, expect);}

再編寫執行XML:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" ><suite name="Suite-1"> <test name="Test-3"> <parameter name="number" value="12345" /> <parameter name="expect" value="true" /> <classes> <class name="com.woniuxy.testng.StringHandleTest" /> </classes> </test></suite>

如果我們想通過參數化測試多條用例,應該怎麼辦呢?如果我們要傳遞的不是基礎類型,而是一個數組,又應該怎麼辦呢?

(2) 使用@DataProvider註解

package com.woniuxy.testng;import org.testng.Assert;import org.testng.annotations.DataProvider;import org.testng.annotations.Test;import com.woniuxy.compare.StringHandle;public class StringHandleDP { @DataProvider(name="isNumber") public Object[][] Users(){ return new Object[][]{ {"12345",true}, {"123.45", true}, {"-12345", true}, {"123T5", false}, {"0.123", true} }; } @Test(dataProvider="isNumber") public void isNumber(String number, boolean expect) { StringHandle stringHandle = new StringHandle(); String source = number; boolean actual = stringHandle.isNumber(source); Assert.assertEquals(actual, expect); }}

調用數據方法:

@Test(dataprovide="XXX")

說明:

(1)XXX為@DataProvide聲明的一個名字,返回的是一個Object數組,即可以存放任意類型數據。

(2)方法的執行次數為賦值參數的遍數。比如提供數組為1行,則只執行一次;如果是數組為3行,則執行3次。

其他擴展:

(1)@DataProvide可寫在單獨的Class里,增強復用性。

這時調用該數據的方法為:@Test(dataprovide="XXX",dataClass=YYY.class)

說明:讀取YYY.class下的@DataProvide為XXX的Object數組數據

(2)@DataProvide下定義的數組,可以通過其他文件讀取,比如讀取Excel,返回一個Object數組。這樣可以實現更加靈活的外部數據讀取。

13. TestNG多線程測試

測試程序:

@Test(threadPoolSize = 3, invocationCount = 6, timeOut = 1000)public void isNumber() { StringHandle stringHandle = new StringHandle(); String source = "-1235"; boolean actual = stringHandle.isNumber(source); Assert.assertTrue(actual);}

或使用執行XML:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"><suite name="Suite3" parallel="methods" thread-count="5"> <test name="Test3"> <classes> <class name="com.woniuxy.testng.StringHandleThread" /> </classes> </test></suite>

指定parallel的值可為:methods, classes, tests, instances,目前筆者環境無法調試通過。

14.TestNG忽略測試

如果某次執行,我們不需要測試用例參與,則可以在@Test後面添加:

@Test(enabled=false)

15. TestNG 依賴測試

有時候,我們需要按順序來調用測試用例, 那麼測試用例之間就存在依賴關係。 TestNG支持測試用例之間的依賴,如下代碼所示:

@Test(dependsOnMethods = {"splitString"})public void isNumber() { ……… }

一旦測試用例之間產生了依賴關係,那麼就會優先執行被依賴的測試用例,比如上例中就會優先把splitString這個測試用例執行了,才執行isNumber.

16. TestNG測試結果報告

我們可以在Eclipse中利用瀏覽器打開TestNG的HTML格式的報告,我們也可以在執行XML中設置報告的顯示級別:共有0-10的級別,其中0表示無,10表示最詳細。

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" ><suite name="Suite-4"> <test name="Test-4" verbose="2"> <classes> <class name="com.woniuxy.testng.StringHandleTest" /> </classes> </test></suite>

思考練習

(1)JUnit與TestNG有哪些異同,你更喜歡哪個?

(2)如果不使用任何測試框架,是否會影響我們的自動化測試工作的進行?

(3)參數化測試中,基於XML的@Parameters和基於源代碼的@DataProvider兩種方式哪一種更好?如果要想多參數值多循環運行,XML方式是否可行?

(4)代碼級介面測試框架究竟價值有多大?特別是對測試人員來說?

:希望學習更多技術,繼續在IT行業突破提升自己的各位朋友,歡迎加群594154674,不管你自我感覺牛不牛B

推薦閱讀:

不可忽略的功能測試檢查點
性能測試新手常犯錯誤總結(一):找不到測試點,不知為何而測
Web自動化-配置Chrome瀏覽器
Selenium Page Object 自動化測試框架-data測試數據設計
Jmeter使用流程及簡單分析監控 (上)

TAG:自動化測試 | 軟體測試 | 軟體測試工程師 |