<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Java有好幾個測試框架,JUnit是比較常見的一個,Spring系列預設的測試框架就是JUnit。TestNG也是Java的一個測試框架,與JUnit功能類似, 但支援更多的註解與功能。
我們常使用JUnit做單元測試,而在做自動化測試時,更偏向於選擇TestNG。
Maven工程中,新增TestNG依賴包即可,可自行選擇版本:
<dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>7.1.0</version> <scope>test</scope> </dependency>
TestNG的註解與JUnit類似,但會更豐富,更細緻:
註解 | 描述 |
---|---|
@Test | 標記一個類裡所有的public void方法,或某個方法,作為測試案例。 |
@BeforeSuite | 對於套件測試,在此套件中的所有測試執行之前執行,僅執行一次。 |
@AfterSuite | 對於套件測試,在此套件中的所有測試執行之後執行,僅執行一次。 |
@BeforeClass | 在呼叫當前類之前執行,只執行一次。 |
@AfterClass | 在呼叫當前類之後執行,只執行一次。 |
@BeforeTest | 對於套件測試,在屬於標籤內的所有類的測試方法執行之前執行。 |
@AfterTest | 對於套件測試,在屬於標籤內的所有類的測試方法都已執行完之後執行。 |
@BeforeGroups | 在呼叫屬於該組的第一個測試方法之前執行。 |
@AfterGroups | 在呼叫屬於該組的最後一個測試方法執行之後執行 。 |
@BeforeMethod | 註解的方法將每個測試方法之前執行。 |
@AfterMethod | 在每個測試方法執行之前都會執行。 |
@DataProvider | 標誌著一個方法,提供資料的一個測試方法。註解的方法必須返回一個Object[] [],其中每個物件[]的測試方法的參數列中可以分配。該@Test 方法,希望從這個DataProvider的接收資料,需要使用一個dataProvider名稱等於這個註解的名字。 |
@Factory | 作為一個工廠,返回TestNG的測試類的物件將被用於標記的方法。該方法必須返回Object[]。 |
@Listeners | 定義一個測試類的監聽器。 |
@Parameters | 用於將引數傳遞給@Test方法。 |
對比JUnit,TestNG最顯眼的區別就是多了一個組態檔。
有了這個組態檔的存在,可以更方便的管理測試案例的執行。
在專案根目錄下,新增testng.xml格式的組態檔,檔名任意,組態檔可以有多個。
maven工程在pom檔案中,指定組態檔路徑後,可以直接執行組態檔:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.0.0-M4</version> <configuration> <suiteXmlFiles> <suiteXmlFile>./testng.xml</suiteXmlFile> </suiteXmlFiles> </configuration> </plugin>
TestNG設定的內容並不複雜,這裡的設定並不是TestNG啟動的依賴,而是對測試案例的執行方式進行劃分。
一個組態檔,有且只能有一個測試套件。suit標籤的常見屬性如下,其中name為強制填寫的,會展示在最終的測試報告中。
屬性 | 描述 |
---|---|
name | 套件的名稱,這是一個強制屬性 |
verbose | 執行的級別或詳細程度,級別為0-10,其中10最詳細 |
parallel | TestNG是否執行不同的執行緒來執行這個套件,預設為none,其他級別為methods、tests、classes、instances |
thread-count | 如果啟用並行模式(忽略其他方式),則為使用的執行緒數 |
annotations | 在測試中使用的註釋型別 |
time-out | 在本測試中的所有測試方法上使用的預設超時 |
preserve-order | 用於設定測試案例是否按順序執行 |
按照groups組進行劃分(使用了@Test (groups={“group1”})進行註解的),include標籤標註的組名會被執行,被exclude標註的組則不會被執行:
<groups> <run> <include name = "includedGroupName" /> <exclude name = "excludedGroupName" /> </run> </groups>
按照包、類、方法三個層級劃分:
包:
<packages> <package name = "com.hhm.demo1.*" /> <package name = "com.hhm.demo2.*" /> </packages>
類:
<classes> <class name="com.hhm.demo1.DemoTest1"/> <class name="com.hhm.demo1.DemoTest2"/> </classes>
方法:
<classes> <class name="com.hhm.demo1.DemoTest1"> <methods> <include name="testMethodName"></include> </methods> </class> </classes>
完整設定範例:
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <suite name="First suite" verbose="1" > <test name="MyTest" parallel="classes" thread-count="4"> <packages> <package name="com.hhm.demo1.*"></package> <package name="com.hhm.demo2.*"></package> </packages> </test> </suite>
設定完成後,可以直接執行組態檔,以執行測試案例。也可以通過maven-Lifecycle的test命令執行。
預期異常測試通過在@Test註解後加入預期的Exception來進行新增,範例如下:
@Test(expectedExceptions = ArithmeticException.class) public void divisionWithException() { int i = 1 / 0; System.out.println("After division the value of i is :"+ i); }
有時候我們寫的用例沒準備好,或者該次測試不想執行此用例,那麼刪掉顯然不明智,那麼就可以通過註解@Test(enabled = false)
來將其忽略掉,此用例就不會執行了,如下範例:
public class DemoTest1{ @Test(enabled=false) public void TestNgLearn1() { System.out.println("this is TestNG test case1"); } @Test public void TestNgLearn2() { System.out.println("this is TestNG test case2"); } }
“超時”表示如果單元測試花費的時間超過指定的毫秒數,那麼TestNG將會中止它並將其標記為失敗。此項常用於效能測試。如下為一個範例:
public class DemoTest2{ @Test(timeOut = 5000) // time in mulliseconds public void testThisShouldPass() throws InterruptedException { Thread.sleep(4000); } @Test(timeOut = 1000) public void testThisShouldFail() { while (true){ // do nothing } } }
程式碼如下:
public class DemoTest2 { @Parameters({"param1", "param2"}) public void TestNgLearn1(String param1, int param2) { System.out.println("this is TestNG test case1, and param1 is:"+param1+"; param2 is:"+param2); Assert.assertFalse(false); } }
XML設定如下:
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <suite name="First suite" verbose="1" > <test name="MyTest"> <parameter name="param1" value="1011111" /> <parameter name="param2" value="10" /> <classes> <class name="com.hhm.demo1.DemoTest2"/> </classes> </test> </suite>
此處需要注意,傳參的型別必須要一致,且帶有@DataProvider註解的函數返回的必然是Object[][],此處需要注意。當提供多組資料時,測試案例則會執行相應次數。
public class DemoTest2 { @DataProvider(name = "provideNumbers") public Object[][] provideData() { return new Object[][] { { 10, 20 }, { 100, 110 }, { 200, 210 } }; } @Test(dataProvider = "provideNumbers") public void TestNgLearn1(int param1, int param2) { System.out.println("this is TestNG test case1, and param1 is:"+param1+"; param2 is:"+param2); Assert.assertFalse(false); } }
有時候,我們需要按順序來呼叫測試用例,那麼測試用例之間就存在依賴關係。 TestNG支援測試用例之間的依賴,使用dependOnMethods和dependsOnGroups來實現依賴測試。如下案例,TestNgLearn1()案例失敗時,TestNgLearn2()案例則不會執行:
public class DemoTest1 { public void TestNgLearn1() { System.out.println("this is TestNG test case1"); Assert.assertFalse(true); } @Test(dependsOnMethods= {"TestNgLearn1"}) public void TestNgLearn2() { System.out.println("this is TestNG test case2"); } }
使用maven執行完測試用例後,會在 工程根目錄targetsurefire-reports 目錄下,生成測試報告檔案,點選index.html檔案則可以在瀏覽器中檢視。
這裡的報告比較簡單,不夠美觀。我們可以結合Allure外掛,生成更美觀的測試報告。
本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45