TestNG 入門教程
國慶7天假期,大部分朋友都出去旅遊了,微信圈裡全是曬旅遊的照片, 東南亞遊,歐洲遊呀,真是羨慕呀。 悲慘的我隻去了上海野生動物園, 在家休息,利用這段假期,把之前學過的東西都總結下。
我前段時間加班太多了,每天忙碌工作,都沒精力去管自己的學習新技能的計劃, 部落格也沒寫幾篇,很多想做的事情都因為工作太忙而耽擱了。 是以工作太忙了也不好,沒有精力關注工作以外的事情。
最近寫自動化測試每天都用到TestNG, 把常用的TestNG的用法總結下。
閱讀目錄
- TestNG介紹
- 在Eclipse中線上安裝TestNG
- 在Eclipse中離線安裝Testng
- TestNG最簡單的測試
- TestNG的基本注解
- TestNG中如何執行測試
- 使用testtng.xml 檔案執行 case
- TestNG按順序執行Case
- TestNG異常測試
- TestNG組測試
- TestNG參數化測試
- TestNG忽略測試
- TestNG 依賴測試
- TestNG測試結果報告
TestNG是Java中的一個測試架構, 類似于JUnit 和NUnit, 功能都差不多, 隻是功能更加強大,使用也更友善
Java中已經有一個JUnit的測試架構了。 TestNG比JUnit功能強大的多。 測試人員一般用TestNG來寫自動化測試。 開發人員一般用JUnit寫單元測試。
官方網站: http://testng.org/doc/index.html
打開Eclipse Help ->Install New Software , 然後Add "http://beust.com/eclipse"
首先下載下傳testng離線包: http://pan.baidu.com/s/1hrEaX6k
1. 将解壓後的檔案..\eclipse-testng離線包\features\org.testng.eclipse_6.9.9.201510270734 檔案夾 放到 eclipse--》features目錄下
2. 将解壓後的檔案..\eclipse-testng離線包\plugins\org.testng.eclipse_6.9.8.201510130443 檔案夾 放到 eclipse--》plugins目錄下
3. 重新開機eclipse
4. 驗證是否安裝成功,file-->new-->other-->TestNg
下面是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");
}
}
注解 | 描述 |
---|---|
@BeforeSuite | 注解的方法将隻運作一次,運作所有測試前此套件中。 |
@AfterSuite | 注解的方法将隻運作一次此套件中的所有測試都運作之後。 |
@BeforeClass | 注解的方法将隻運作一次先行先試在目前類中的方法調用。 |
@AfterClass | 注解的方法将隻運作一次後已經運作在目前類中的所有測試方法。 |
@BeforeTest | 注解的方法将被運作之前的任何測試方法屬于内部類的 <test>标簽的運作。 |
@AfterTest | 注解的方法将被運作後,所有的測試方法,屬于内部類的<test>标簽的運作。 |
@BeforeGroups | 組的清單,這種配置方法将之前運作。此方法是保證在運作屬于任何這些組第一個測試方法,該方法被調用。 |
@AfterGroups | 組的名單,這種配置方法後,将運作。此方法是保證運作後不久,最後的測試方法,該方法屬于任何這些組被調用。 |
@BeforeMethod | 注解的方法将每個測試方法之前運作。 |
@AfterMethod | 被注釋的方法将被運作後,每個測試方法。 |
@DataProvider | 标志着一個方法,提供資料的一個測試方法。注解的方法必須傳回一個Object[] [],其中每個對象[]的測試方法的參數清單中可以配置設定。 該@Test 方法,希望從這個DataProvider的接收資料,需要使用一個dataProvider名稱等于這個注解的名字。 |
@Factory | 作為一個工廠,傳回TestNG的測試類的對象将被用于标記的方法。該方法必須傳回Object[]。 |
@Listeners | 定義一個測試類的監聽器。 |
@Parameters | 介紹如何将參數傳遞給@Test方法。 |
@Test | 标記一個類或方法作為測試的一部分。 |
第一種直接執行:右鍵要執行的方法, 點Run As ->TestNG Test
第二種: 通過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.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通過@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中可以把測試用例分組,這樣可以按組來執行測試用例比如:
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提供了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);
}
}
<?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);
}
}
有時候測試用例還沒準備好, 可以給測試用例加上@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支援測試用例之間的依賴
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預設情況下,會生産兩種類型的測試報告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>