測試框架TestNG
一.TestNG介紹
1.適合測試人員使用的原因
- 比Junit涵蓋功能更全面的測試框架
- Junit更適合隔離性比較強的單元測試
- TestNG更適合複雜的整合測試
2.TestNG的使用
-
maven引入
<dependencies> <dependency> <groupId>org.testing</groupId> <artifactId>testing</artifactId> <version>release</
3.TestNG基本註解與執行順序實戰
-
建立maven的工程檔案
-
使用最基本的@Test註解,用來把方法標記為測試的一部分
package com.course.testng; import org.testng.annotations.Test; public class BasicAnnotation { //最基本的註解,用來把方法標記為測試的一部分 @Test public void testCase1() { System.
-
註解實戰@BeforeMethod和@AfterMethod
package com.course.testng; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; public class BasicAnnotation { //最基本的註解,用來把方法標記為測試的一部分 @Test public void
- 當在類中新增case方法時,執行類則可以發現每個Test方法的前後都有BeforeMethod和AfterMethod方法
package com.course.testng; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; public class BasicAnnotation { //最基本的註解,用來把方法標記為測試的一部分 @Test public void testCase1() { System.out.println("這是測試用例1"); } @Test public void testCase2() { System.out.println("這是測試用例2"); } //BeforeMethod是在測試方法之前執行的 @BeforeMethod public void beforeMethod(){ System.out.println("BeforeMethod是在測試方法之前執行的"); } //AfterMethod是在測試方法之後執行的 @AfterMethod public void afterMethod(){ System.out.println("AfterMethod是在測試方法之後執行的"); } } //執行類結果 //BeforeMethod是在測試方法之前執行的 //這是測試用例1 //AfterMethod是在測試方法之後執行的 //BeforeMethod是在測試方法之前執行的 //這是測試用例2 //AfterMethod是在測試方法之後執行的
-
註解實戰@BeforeClass和@AfterClass,在類執行之前和之後執行的方法
package com.course.testng; import org.testng.annotations.*; public class BasicAnnotation { //最基本的註解,用來把方法標記為測試的一部分 @Test public void testCase1() { System.out.println("這是測試用例1"); } @Test public void testCase2() { System.out.println("這是測試用例2"); } //BeforeMethod是在測試方法之前執行的 @BeforeMethod public void beforeMethod(){ System.out.println("BeforeMethod是在測試方法之前執行的"); } //AfterMethod是在測試方法之後執行的 @AfterMethod public void afterMethod(){ System.out.println("AfterMethod是在測試方法之後執行的"); } //BeforeClass是在類執行之前執行的方法 @BeforeClass public void beforeClass(){ System.out.println("BeforeClass是在類執行之前執行的方法"); } //AfterClass是在類執行之後執行的方法 @AfterClass public void afterClass(){ System.out.println("AfterClass是在類執行之後執行的方法"); } } //執行結果 //BeforeClass是在類執行之前執行的方法 //BeforeMethod是在測試方法之前執行的 //這是測試用例1 //AfterMethod是在測試方法之後執行的 //BeforeMethod是在測試方法之前執行的 //這是測試用例2 //AfterMethod是在測試方法之後執行的 //AfterClass是在類執行之後執行的方法
-
註解實戰BeforeSuite和AfterSuite測試套件,在類執行之前的前面執行和在類執行之後的後面執行
package com.course.testng; import org.testng.annotations.*; public class BasicAnnotation { //最基本的註解,用來把方法標記為測試的一部分 @Test public void testCase1() { System.out.println("這是測試用例1"); } @Test public void testCase2() { System.out.println("這是測試用例2"); } //BeforeMethod是在測試方法之前執行的 @BeforeMethod public void beforeMethod(){ System.out.println("BeforeMethod是在測試方法之前執行的"); } //AfterMethod是在測試方法之後執行的 @AfterMethod public void afterMethod(){ System.out.println("AfterMethod是在測試方法之後執行的"); } //BeforeClass是在類執行之前執行的方法 @BeforeClass public void beforeClass(){ System.out.println("BeforeClass是在類執行之前執行的方法"); } //AfterClass是在類執行之後執行的方法 @AfterClass public void afterClass(){ System.out.println("AfterClass是在類執行之後執行的方法"); } //beforeSuite在beforeClass之前執行 @BeforeSuite public void beforeSuite(){ System.out.println("beforeSuite測試套件"); } //afterSuite在afterClass之後執行 @AfterSuite public void afterSuite(){ System.out.println("afterSuite測試套件"); } } //執行結果 //beforeSuite測試套件 //BeforeClass是在類執行之前執行的方法 //BeforeMethod是在測試方法之前執行的 //這是測試用例1 //AfterMethod是在測試方法之後執行的 //BeforeMethod是在測試方法之前執行的 //這是測試用例2 //AfterMethod是在測試方法之後執行的 //AfterClass是在類執行之後執行的方法 //afterSuite測試套件
4.TestNG套件測試
-
編寫
SuiteConfig.java
檔案(檔名可以自定義,主要用於配置套件的相關方法編寫)package com.course.testng.suite; import org.testng.annotations.AfterSuite; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeSuite; import org.testng.annotations.BeforeTest; public class SuiteConfig { @BeforeSuite public void beforeSuite(){ System.out.println("before suite執行啦"); } @AfterSuite public void afterSuite(){ System.out.println("after suite執行啦"); } @BeforeTest public void beforeTest(){ System.out.println("beforeTest"); } @AfterTest public void afterTest(){ System.out.println("afterTest"); } }
-
編寫
LoginTest.java
檔案和PayTest.java
檔案(檔名可以自定義,主要編寫固定的測試用例)//PayTest.java package com.course.testng.suite; import org.testng.annotations.Test; public class PayTest { @Test public void paySuccess(){ System.out.println("支付寶支付成功"); } } //LoginTest.java package com.course.testng.suite; import org.testng.annotations.Test; public class LoginTest { @Test public void loginTaoBao(){ System.out.println("淘寶登入成功"); } }
-
編寫
suite.xml
檔案(檔名可以自定義,主要用於將配置套件檔案與用例檔案整合)<?xml version="1.0" encoding="UTF-8" ?><!-- 標準xml檔案頭 --> <suite name="test"> <test name="login"> <classes> <class name="com.course.testng.suite.SuiteConfig"/> <class name="com.course.testng.suite.LoginTest"/> </classes> </test> <test name="pay"> <classes> <class name="com.course.testng.suite.SuiteConfig"/> <class name="com.course.testng.suite.PayTest"/> </classes> </test> </suite>
-
執行
suite.xml
檔案before suite執行啦 beforeTest 淘寶登入成功 afterTest beforeTest 支付寶支付成功 afterTest after suite執行啦
5.TestNG忽略測試
-
建立檔案
IgnoreTest.java
檔案 -
忽略測試:指的是當前不執行某個測試用例,將@Test的enabled屬性設定為false即可(預設enabled屬性值為true)
package com.course.testng; import org.testng.annotations.Test; public class IgnoreTest { @Test public void ignore1(){ System.out.println("ignore1 執行!"); } @Test(enabled = false) public void ignore2(){ System.out.println("ignore2 執行!"); } @Test(enabled = true) public void ignore3(){ System.out.println("ignore3 執行!"); } } //執行結果 //ignore1 執行! //ignore3 執行!
二.TestNG組測試
1.組測試中的方法分組測試
-
建立
GroupsOnMethod.java
檔案 -
方法分組測試:利用@BeforeGroups和@AfterGroups篩選在對應groups的前後執行的內容
-
例項程式碼
package com.course.testng.groups; import org.testng.annotations.AfterGroups; import org.testng.annotations.BeforeGroups; import org.testng.annotations.Test; public class GroupsOnMethod { @Test(groups = "server") public void test1(){ System.out.println("這是服務端組的測試方法11111"); } @Test(groups = "server") public void test2(){ System.out.println("這是服務端組的測試方法22222"); } @Test(groups = "client") public void test3(){ System.out.println("這是客戶端組的測試方法33333"); } @Test(groups = "client") public void test4(){ System.out.println("這是客戶端組的測試方法44444"); } @BeforeGroups("server") public void beforeGroupsOnServer(){ System.out.println("這是服務端組執行之前執行的方法"); } @AfterGroups("server") public void afterGroupsOnServer(){ System.out.println("這是服務端組執行之後執行的方法"); } @BeforeGroups("client") public void beforeGroupsOnClient(){ System.out.println("這是客戶端組執行之前執行的方法"); } @AfterGroups("client") public void afterGroupsOnClient(){ System.out.println("這是客戶端組執行之後執行的方法"); } } //執行結果 //這是服務端組執行之前執行的方法 //這是服務端組的測試方法11111 //這是服務端組的測試方法22222 //這是服務端組執行之後執行的方法 //這是客戶端組執行之前執行的方法 //這是客戶端組的測試方法33333 //這是客戶端組的測試方法44444 //這是客戶端組執行之後執行的方法
2.組測試中的類分組測試
-
建立
GroupsOnClass1.java
檔案package com.course.testng.groups; import org.testng.annotations.Test; @Test(groups = "stu")//給類命名groups public class GroupsOnClass1 { public void stu1(){ System.out.println("GroupsOnClass1中的stu1執行"); } public void stu2(){ System.out.println("GroupsOnClass1中的stu2執行"); } }
-
建立
GroupsOnClass2.java
檔案package com.course.testng.groups; import org.testng.annotations.Test; @Test(groups = "stu")//給類命名groups public class GroupsOnClass2 { public void stu1(){ System.out.println("GroupsOnClass2中的stu1執行"); } public void stu2(){ System.out.println("GroupsOnClass2中的stu2執行"); } }
-
建立
GroupsOnClass3.java
檔案package com.course.testng.groups; import org.testng.annotations.Test; @Test(groups = "teacher")//給類命名groups public class GroupsOnClass3 { public void teacher1(){ System.out.println("GroupsOnClass3中的teacher1執行"); } public void teacher2(){ System.out.println("GroupsOnClass3中的teacher2執行"); } }
-
建立
groupsOnClass.xml
檔案<?xml version="1.0" encoding="UTF-8" ?> <suite name="suitename"> <test name="runAll"><!-- 執行所有的組 --> <classes> <class name="com.course.testng.groups.GroupsOnClass1"/> <class name="com.course.testng.groups.GroupsOnClass2"/> <class name="com.course.testng.groups.GroupsOnClass3"/> </classes> </test> <test name="onlyRunStu"> <groups> <run> <include name="stu"/><!-- 只執行groups為stu的類組的方法 --> </run> </groups> <classes> <class name="com.course.testng.groups.GroupsOnClass1"/> <class name="com.course.testng.groups.GroupsOnClass2"/> <class name="com.course.testng.groups.GroupsOnClass3"/> </classes> </test> </suite>
-
利用阻塞式配置
groups->run->include
,設定執行哪組的類 -
執行xml結果(前六條因為沒有指定設定則執行所有的組,後四條因為利用阻塞式配置只執行groups為stu的組中的類的方法)
GroupsOnClass1中的stu1執行 GroupsOnClass1中的stu2執行 GroupsOnClass2中的stu1執行 GroupsOnClass2中的stu2執行 GroupsOnClass3中的teacher1執行 GroupsOnClass3中的teacher2執行 GroupsOnClass1中的stu1執行 GroupsOnClass1中的stu2執行 GroupsOnClass2中的stu1執行 GroupsOnClass2中的stu2執行
-
三.TestNG異常測試
1.什麼時候使用異常測試
-
在我們期望結果為某一個異常的時候(系統丟擲的異常或顯式丟擲的異常)
-
比如:我們傳入了某些不合法的引數,程式丟擲異常
-
也就是我的預期結果就是這個異常
2.異常測試舉例
-
失敗的異常測試(下述程式碼因為沒有異常,所以異常測試失敗)
//這是一個測試結果會失敗的異常測試 @Test(expectedExceptions = RuntimeException.class) public void runTimeExceptionFailed(){ System.out.println("這是一個失敗的異常測試"); }
-
成功的異常測試(下述程式碼因為有異常,所以異常測試成功)
//這是一個成功的異常測試 @Test(expectedExceptions = RuntimeException.class) public void