什麼是TestNG
TestNG,即Testing Next Generation,它派生自JUnit和NUnit,除了繼承了兩者的優勢之外,又額外的發展出了一些新的功能,在參數化測試,依賴測試和套件測試(分組概念)方面更加突出。 TestNG用於高級測試和複雜集成測試。
爲什麼用TestNG
TestNG有以下優點:
-
生成美觀易讀的測試報告
-
註解 使測試變得更加方便
-
可以更輕鬆地對測試用例進行分組和指定執行順序
-
支持併發測試
-
生成日誌
-
數據驅動測試
-
與主流工具的成熟集成
分組測試
相比junit的TestCase/TestSuite,TestNG有suite/test/test method三個級別,即將test/test method明確區分開了。
- suite由xml文件描述。它包含一個或多個測試並被定義爲標籤
- test由描述幷包含一個或者多個TestNG類
- TestNG類是包含至少一個TestNG annotation的java類,由標籤描述幷包含一個或多個測試方法
測試類:
public class Testng {
@Test(groups = { "functest", "checkintest" })
public void testMethod1() {
System.out.println("testMethod1");
}
@Test(groups = {"functest", "checkintest"} )
public void testMethod2() {
System.out.println("testMethod2");
}
@Test(groups = { "functest" })
public void testMethod3() {
System.out.println("testMethod3");
}
}
testng.xml文件:
<?xml version="1.0" encoding="UTF-8" ?>
<suite name="TestNG">
<test name="Test1">
<groups>
<run>
<include name="checkintest"/>
</run>
</groups>
<classes>
<class name="com.example.testng_demo.Testng"/>
</classes>
</test>
</suite>
意思就是執行Testng類中groups包含checkintest的方法,testMethod3這個方法的groups不含checkintest,所以不會執行;
依賴執行
用例間依賴關係,按序執行:
public class DependsTest {
@Test
public void setupEnv(){
System.out.println("this is setup Env");
}
//setupEnv()方法會在testMessage()方法前執行
@Test(dependsOnMethods = {"setupEnv"})
public void testMessage(){
System.out.println("this is test message");
}
}
說到按序執行,我們也可以把一些初始化/ 收尾工作的測試方法用@BeforeSuite/@AfterSuite,@BeforeGroups/@AfterGroups, @BeforeTest/@AfterTest等標記。
參數化測試
TestNG提供了2種傳遞參數的方式。
第一種: testng.xml 方式使代碼和測試數據分離,方便維護,適用於一個用例,需要多個相同參數(值不同)來驗證的情況。
第二種:@DataProvider能夠提供比較複雜的參數。
如下例:
第一種,@Parameters({ “merchantNo” }) 會去testng.xml裏取到這個merchantNo對應的value,放到傳參merchant中。
public class TestParameter {
// @Parameters註解內對應的參數名稱和配置文件中的merchantNo必須是相同
// 如果在配置文件中找不到參數名稱爲“merchantNo”的參數,則測試方法將接收@Optional註解中指定的默認值:“chen001”
@Parameters({ "merchantNo" })
@Test
public void testString(@Optional("chen001")String merchant) {
System.out.println("Invoked testString " + merchant);
assert "chen001".equals(merchant);
}
}
對應的testng.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<suite name="TestNg">
<parameter name="merchantNo" value="chen001"/>
<test name="TestParameter">
<classes>
<class name="com.example.testng_demo.TestParameter"/>
</classes>
</test>
</suite>
第二種,註解@DataProvider在參數化測試中起到重要的作用,該註解下的函數返回數據類型有兩種,一種返回類型是Iterator<Object[]>,還一種返回類型是 Object[][]
,看例子如何實現:
@DataProvider函數,需要定義屬性name
@DataProvider(name = "testcase")
public Iterator <Object[]> createData2() {
List <Object[]> datas = new ArrayList <Object[]>();
datas.add(new Object[]{"payment"});
datas.add(new Object[]{"refund"});
datas.add(new Object[]{"check"});
return datas.iterator();
}
@DataProvider(name = "testcase2")
public Object[][] createData1() {
return new Object[][] {
{ "Cedric", new Integer(36) },
{ "Anne", new Integer(37)},
};
}
@Test測試用例,屬性dataProvider需要指定對應的@DataProvider名稱
@Test(dataProvider = "testcase")
public void verifyData2(String type) {
System.out.println(type);
}
@Test(dataProvider = "testcase2")
public void verifyData1(String n1, Integer n2) {
System.out.println(n1 + " " + n2);
}
輸出:
Cedric : 36
Anne : 37
payment
refund
check
提供數據方式
異常處理
TestNG通過 @Test(expectedExceptions) 來判斷期待的異常, 也可以判斷Error Message
@Test(expectedExceptions = IllegalArgumentException.class,expectedExceptionsMessageRegExp = "非法參數")
public void testException(){
throw new IllegalArgumentException("非法參數");
}
多線程運行
// 共3個線程調用了10次該方法
@Test(threadPoolSize = 3, invocationCount = 10,timeOut = 3000)
public void testThread(){
System.out.println(Thread.currentThread().getId());
}
invocationCount——-表示執行的次數
threadPoolSize——-表示線程池內線程的個數
timeOut——-超時時間-毫秒
測試報告及自定義日誌
TestNG中的測試用例編寫過程
在TestNG中編寫測試非常簡單,基本上包括以下步驟:
- 第1步 - 編寫測試的業務邏輯
- 第2步 - 在代碼中插入TestNG註解
- 第3步 - 在testng.xml文件中添加有關測試的信息(例如,類名,方法名,組名等)
- 第4步 - 運行TestNG
TestNG 常用註解
-
@BeforeSuite:在此套件中的所有測試運行之前,將運行帶註釋的方法。
-
@AfterSuite:在此套件中的所有測試運行後,將運行帶註釋的方法。
-
@BeforeTest:在運行屬於標記內的類的任何測試方法之前,將運行帶註釋的方法。
-
@AfterTest:在標記內的類的所有測試方法都運行之後,將運行帶註釋的方法。
-
@BeforeGroups:此配置方法之前將運行的組列表。保證在調用屬於任何這些組的第一個測試方法之前不久運行此方法。
-
@AfterGroups:此配置方法將在之後運行的組列表。保證在調用屬於任何這些組的最後一個測試方法後不久運行此方法。
-
@BeforeClass:在調用當前類中的第一個測試方法之前,將運行帶註釋的方法。
-
@AfterClass:在運行當前類中的所有測試方法之後,將運行帶註釋的方法。
-
@BeforeMethod:帶註釋的方法將在每個測試方法之前運行。
-
@AfterMethod:帶註釋的方法將在每個測試方法之後運行。
-
@Test:帶註釋的方法是測試用例的一部分。
生命週期:
@BeforeSuite->@BeforeTest->@BeforeClass->{@BeforeMethod->@Test->@AfterMethod}->@AfterClass->@AfterTest->@AfterSuite
TestNG常用斷言:
導入Assert包:
import static org.testng.Assert.*;
-
assertTrue:判斷是否爲True。
-
assertFalse:判斷是否爲false。
-
assertSame:判斷引用地址是否相同。
-
assertNotSame:判斷引用地址是否不相同。
-
assertNull:判斷是否爲null。
-
assertNotNull:判斷是否不爲null。
-
assertEquals:判斷是否相等,Object類型的對象需要實現haseCode及equals方法。
-
assertNotEquals:判斷是否不相等。
-
assertEqualsNoOrder:判斷忽略順序是否相等。