testNG常用用法總結
一.testNG介紹
TestNG是Java中的一個測試框架, 類似於JUnit 和NUnit, 功能都差不多, 只是功能更加強大,使用也更方便
Java中已經有一個JUnit的測試框架了。 TestNG比JUnit功能強大的多。 測試人員一般用TestNG來寫自動化測試。 開發人員一般用JUnit寫單元測試。
二. eclipse中安裝testNG
1. 開啟Eclipse Help ->Install New Software , 然後Add "http://beust.com/eclipse"
三. testNG最簡單的測試
package TankLearn2.Learn; import org.junit.AfterClass; import org.junit.BeforeClass; import org.testng.annotations.Test; public class TestNGLearn1 { @BeforeClass public void beforeClass() { System.out.println("this is before class"); } @Test public void TestNgLearn() { System.out.println("this is TestNG test case"); } @AfterClass public void afterClass() { System.out.println("this is after class"); } }
四.testNG最基本的註解
註解 |
描述 |
@BeforeSuite |
註解的方法將只執行一次,執行所有測試前此套件中。 |
@AfterSuite |
註解的方法將只執行一次此套件中的所有測試都執行之後。 |
@BeforeClass |
註解的方法將只執行一次先行先試在當前類中的方法呼叫。 |
@AfterClass |
註解的方法將只執行一次後已經執行在當前類中的所有測試方法。 |
@BeforeTest |
註解的方法將被執行之前的任何測試方法屬於內部類的 <test>標籤的執行。 |
@AfterTest |
註解的方法將被執行後,所有的測試方法,屬於內部類的<test>標籤的執行。 |
@BeforeGroups |
組的列表,這種配置方法將之前執行。此方法是保證在執行屬於任何這些組第一個測試方法,該方法被呼叫。 |
@AfterGroups |
組的名單,這種配置方法後,將執行。此方法是保證執行後不久,最後的測試方法,該方法屬於任何這些組被呼叫。 |
@BeforeMethod |
註解的方法將每個測試方法之前執行。 |
@AfterMethod |
被註釋的方法將被執行後,每個測試方法。 |
@DataProvider |
標誌著一個方法,提供資料的一個測試方法。註解的方法必須返回一個Object[] [],其中每個物件[]的測試方法的引數列表中可以分配。 該@Test 方法,希望從這個DataProvider的接收資料,需要使用一個dataProvider名稱等於這個註解的名字。 |
@Factory |
作為一個工廠,返回TestNG的測試類的物件將被用於標記的方法。該方法必須返回Object[]。 |
@Listeners |
定義一個測試類的監聽器。 |
@Parameters |
介紹如何將引數傳遞給@Test方法。 |
@Test |
標記一個類或方法作為測試的一部分。 |
五. testNG中如何執行測試
1.第一種直接執行:右鍵要執行的方法,點Run As ->TestNG Test
2. 第二種: 通過testng.xml檔案來執行. 把要執行的case, 放入testng.xml檔案中。 右鍵點選testng.xml, 點Run As
testng.xml
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite1">
<test name="test12">
<classes>
<class name="TankLearn2.Learn.TestNGLearn1" />
</classes>
</test>
</suite>
六.testNG按順序執行case
1.在testng.xml中,可以控制測試用例按順序執行。 當preserve-order="true"是,可以保證節點下面的方法是按順序執行的
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite1">
<test name="test12" preserve-order="true">
<classes>
<class name="TankLearn2.Learn.TestNGLearn1">
<methods>
<include name="TestNgLearn3" />
<include name="TestNgLearn1" />
<include name="TestNgLearn2" />
</methods>
</class>
</classes>
</test>
</suite>
七. testNG異常測試
測試中,有時候我們期望某些程式碼丟擲異常。
TestNG通過@Test(expectedExceptions) 來判斷期待的異常, 並且判斷Error Message
package TankLearn2.Learn;
import org.testng.annotations.Test;
public class ExceptionTest {
@Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp="NullPoint")
public void testException(){
throw new IllegalArgumentException("NullPoint");
}
}
八.testNG組測試
TestNG中可以把測試用例分組,這樣可以按組來執行測試用例比如:
package TankLearn2.Learn;
import org.testng.annotations.Test;
public class GroupTest {
@Test(groups = {"systemtest"})
public void testLogin(){
System.out.println("this is test login");
}
@Test(groups = {"functiontest"})
public void testOpenPage(){
System.out.println("this is test Open Page");
}
}
然後在testng.xml中 按組執行測試用例
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite1">
<test name="test1">
<groups>
<run>
<include name="functiontest" />
</run>
</groups>
</test>
</suite>
九.testNG引數化測試
軟體測試中,經常需要測試大量的資料集。 測試程式碼的邏輯完全一樣,只是測試的引數不一樣。 這樣我們就需要一種 “傳遞測試引數的機制”。 避免寫重複的測試程式碼
TestNG提供了2種傳遞引數的方式。
第一種: testng.xml 方式使程式碼和測試資料分離,方便維護
第二種:@DataProvider能夠提供比較複雜的引數。 (也叫data-driven testing)
方法一: 通過testng.xml 傳遞引數給測試程式碼
package TankLearn2.Learn;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
public class ParameterizedTest1 {
@Test
@Parameters("test1")
public void ParaTest(String test1){
System.out.println("This is " + test1);
}
}
testng.xml
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite1">
<parameter name="test1" value="Tank" />
<parameter name="test1" value="Xiao" />
<test name="test12">
<classes>
<class name="TankLearn2.Learn.ParameterizedTest1" />
</classes>
</test>
</suite>
方式二: 通過DataProvider傳遞引數
package TankLearn2.Learn;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class DataProviderLearn {
@DataProvider(name="user")
public Object[][] Users(){
return new Object[][]{
{"root","passowrd"},
{"cnblogs.com", "tankxiao"},
{"tank","xiao"}
};
}
@Test(dataProvider="user")
public void verifyUser(String userName, String password){
System.out.println("Username: "+ userName + " Password: "+ password);
}
}
十.testNG忽略測試
有時候測試用例還沒準備好, 可以給測試用例加上@Test(enable = false), 來禁用此測試用例
package TankLearn2.Learn;
import org.testng.annotations.Test;
public class TesgNGIgnore {
@Test(enabled = false)
public void testIgnore(){
System.out.println("This test case will ignore");
}
}
十一.testNG依賴測試
有時候,我們需要按順序來呼叫測試用例, 那麼測試用例之間就存在依賴關係。 TestNG支援測試用例之間的依賴
package TankLearn2.Learn;
import org.testng.annotations.Test;
public class DependsTest {
@Test
public void setupEnv(){
System.out.println("this is setup Env");
}
@Test(dependsOnMethods = {"setupEnv"})
public void testMessage(){
System.out.println("this is test message");
}
}
十二.testNG測試報告結果
測試報告是測試非常重要的部分.
TestNG預設情況下,會生產兩種型別的測試報告HTML的和XML的。 測試報告位於 "test-output" 目錄下.
當然我們也可以設定測試報告的內容級別.
verbose="2" 標識的就是記錄的日誌級別,共有0-10的級別,其中0表示無,10表示最詳細
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite1">
<test name="test12" verbose="2">
<classes>
<class name="TankLearn2.Learn.TestNGLearn1" />
</classes>
</test>
</suite>