TestNG簡介:
TestNG是一個測試架構,其靈感來自JUnit和NUnit,但同時引入了一些新的功能,使其功能更強大,使用更友善。
TestNG相較于Junit的優點:
·可指定執行順序, dependsOnMethods 屬性來應對測試的依賴性問題。
·參數化測試,TestNG 提供了開箱即用的類似特性。通過在 TestNG 的 XML 配置檔案中放入參數化資料,就可以對不同的資料集重用同一個測試用例,甚至有可能會得到不同的結果。支援@DataProvider 注釋可以友善地把複雜參數類型映射到某個測試方法。
·支援分組測試
·支援多線程測試
官網位址:http://testng.org/doc/index.html
引入依賴:
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.8</version>
</dependency>
TestNG用法簡介:
注解 | 描述 |
---|---|
@BeforeSuite | 注解的方法将隻運作一次,所有測試運作前運作。 |
@AfterSuite | 注解的方法将隻運作一次,,所有測試運作後運作。 |
@BeforeClass | 注解的方法将隻運作一次,被注釋的方法将在目前類的第一個測試方法調用前運作。 |
@AfterClass | 注解的方法将隻運作一次,被注釋的方法将在目前類的最後一個個測試方法調用後運作。 |
@BeforeTest | 被注釋的方法将在所有測試方法運作前運作 |
@AfterTest | 被注釋的方法将在所有測試方法運作後運作 |
@BeforeGroups | 組的清單,這種配置方法将之前運作。此方法是保證在運作屬于任何這些組第一個測試方法,該方法被調用。 |
@AfterGroups | 組的名單,這種配置方法後,将運作。此方法是保證運作後不久,最後的測試方法,該方法屬于任何這些組被調用。 |
@BeforeMethod | 注解的方法将每個測試方法之前運作。 |
@AfterMethod | 被注釋的方法将被運作後,每個測試方法。 |
@DataProvider | 标志着一個方法,提供資料的一個測試方法。注解的方法必須傳回一個Object[] [],其中每個對象[]的測試方法的參數清單中可以配置設定。該@Test 方法,希望從這個DataProvider的接收資料,需要使用一個dataProvider名稱等于這個注解的名字。 |
@Factory | 作為一個工廠,傳回TestNG的測試類的對象将被用于标記的方法。該方法必須傳回Object[]。 |
@Listeners | 定義一個測試類的監聽器。 |
@Parameters | 介紹如何将參數傳遞給@Test方法。 |
@Test | 标記一個類或方法作為測試的一部分。 |
生命周期:
@BeforeSuite->@BeforeTest->@BeforeClass->{@BeforeMethod->@Test->@AfterMethod}->@AfterClass->@AfterTest->@AfterSuite
分組測試
相比junit的TestCase/TestSuite,TestNG有suite/test/test method三個級别,即将test/test method明确區分開了。
* suite由xml檔案描述。它包含一個或多個測試并被定義為标簽
* test由描述并包含一個或者多個TestNG類
* TestNG類是包含至少一個TestNG annotation的java類,由标簽描述并包含一個或多個測試方法
測試類:
public class QueryTest {
@Test(groups = {"functest", "checkintest"})
public void testMethod1() {
System.out.println("groups = { functest, checkintest }");
}
@Test(groups = {"functest", "checkintest"})
public void testMethod2() {
System.out.println("groups = { functest, checkintest }");
}
@Test(groups = {"functest"})
public void testMethod3() {
System.out.println("groups = { functest }");
}
@Test(groups = {"checkintest"})
public void testMethod4() {
System.out.println("groups = { checkintest }");
}
}
testng.xml檔案:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="framework_testng">
<test verbose="2" name="TestGroups">
<groups>
<run>
<include name="functest" />
<exclude name="checkintest" />
</run>
</groups>
<classes>
<class name="QueryTest" />
</classes>
</test>
</suite>
意思就是執行QueryTest類中group帶functest,排除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");
}
}
參數化測試
TestNG提供了2種傳遞參數的方式。
第一種: testng.xml 方式使代碼和測試資料分離,友善維護,适用于一個用例,需要多個相同參數(值不同)來驗證的情況。
第二種:@DataProvider能夠提供比較複雜的參數。
這裡介紹下第一種,如下例:@Parameters({ “key” }) 會去testng.xml裡取到這個key對應的value,放到傳參secondName中。
public class TestngParameters {
// @Parameters注解内對應的參數名稱和配置檔案中的key必須是相同
@Parameters({ "key" })
@Test
public void testSingleString(String secondName) {
System.err.println("Invoked testString " + secondName);
assert "Cedric".equals(secondName);
}
對應的testng.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite1">
<parameter name="key" value="Tank" />
<parameter name="key" value="Xiao" />
<test name="test12">
<classes>
<class name="ClassName" />
</classes>
</test
</suite>
異常處理
TestNG通過@Test(expectedExceptions) 來判斷期待的異常, 并且判斷Error Message
e.g:@Test(expectedExceptions =IllegalArgumentException.class, expectedExceptionsMessageRegExp=”NullPoint”)
忽略測試:
@Test(enable = false), 來禁用此測試用例
多線程運作:
invocationCount—-表示執行的次數
threadPoolSize—–表示線程池的内線程的個數
timeOut——-逾時時間-毫秒
TestNG常用斷言:
導入Assert包:
import static org.testng.Assert.*;
(1) assertTrue:判斷是否為True。
(2) assertFalse:判斷是否為false。
(3) assertSame:判斷引用位址是否相同。
(4) assertNotSame:判斷引用位址是否不相同。
(5) assertNull:判斷是否為null。
(6) assertNotNull:判斷是否不為null。
(7) assertEquals:判斷是否相等,Object類型的對象需要實作haseCode及equals方法。
(8) assertNotEquals:判斷是否不相等。
(9) assertEqualsNoOrder:判斷忽略順序是否相等。