一.testNG介紹
TestNG是Java中的一個測試框架, 類似於JUnit 和NUnit, 功能都差不多, 只是功能更加強大,使用也更方便
Java中已經有一個JUnit的測試框架了。 TestNG比JUnit功能強大的多。 測試人員一般用TestNG來寫自動化測試。 開發人員一般用JUnit寫單元測試。
官方網站: http://testng.org/doc/index.html
二. eclipse中安裝testNG
1. 打開Eclipse Help ->Install New Software , 然后Add "http://beust.com/eclipse"
三. testNG最簡單的測試
1 package TankLearn2.Learn; 2 import org.junit.AfterClass; 3 import org.junit.BeforeClass; 4 import org.testng.annotations.Test; 5 6 public class TestNGLearn1 { 7 8 @BeforeClass 9 public void beforeClass() { 10 System.out.println("this is before class"); 11 } 12 13 @Test 14 public void TestNgLearn() { 15 System.out.println("this is TestNG test case"); 16 } 17 18 @AfterClass 19 public void afterClass() { 20 System.out.println("this is after class"); 21 } 22 }
四.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
1 testng.xml 2 <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > 3 <suite name="Suite1"> 4 <test name="test12"> 5 <classes> 6 <class name="TankLearn2.Learn.TestNGLearn1" /> 7 </classes> 8 </test> 9 </suite>
六.testNG按順序執行case
1.在testng.xml中,可以控制測試用例按順序執行。 當preserve-order="true"是,可以保證節點下面的方法是按順序執行的
1 <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > 2 <suite name="Suite1"> 3 <test name="test12" preserve-order="true"> 4 <classes> 5 <class name="TankLearn2.Learn.TestNGLearn1"> 6 <methods> 7 <include name="TestNgLearn3" /> 8 <include name="TestNgLearn1" /> 9 <include name="TestNgLearn2" /> 10 </methods> 11 </class> 12 </classes> 13 </test> 14 </suite>
七. testNG異常測試
測試中,有時候我們期望某些代碼拋出異常。
TestNG通過@Test(expectedExceptions) 來判斷期待的異常, 並且判斷Error Message
1 package TankLearn2.Learn; 2 3 import org.testng.annotations.Test; 4 5 public class ExceptionTest { 6 7 @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp="NullPoint") 8 public void testException(){ 9 throw new IllegalArgumentException("NullPoint"); 10 } 11 }
八.testNG組測試
TestNG中可以把測試用例分組,這樣可以按組來執行測試用例比如:
1 package TankLearn2.Learn; 2 3 import org.testng.annotations.Test; 4 5 public class GroupTest { 6 7 @Test(groups = {"systemtest"}) 8 public void testLogin(){ 9 System.out.println("this is test login"); 10 } 11 12 @Test(groups = {"functiontest"}) 13 public void testOpenPage(){ 14 System.out.println("this is test Open Page"); 15 } 16 }
然后在testng.xml中 按組執行測試用例
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > 3 <suite name="Suite1"> 4 <test name="test1"> 5 <groups> 6 <run> 7 <include name="functiontest" /> 8 </run> 9 </groups> 10 </test> 11 </suite>
九.testNG參數化測試
軟件測試中,經常需要測試大量的數據集。 測試代碼的邏輯完全一樣,只是測試的參數不一樣。 這樣我們就需要一種 “傳遞測試參數的機制”。 避免寫重復的測試代碼
TestNG提供了2種傳遞參數的方式。
第一種: testng.xml 方式使代碼和測試數據分離,方便維護
第二種:@DataProvider能夠提供比較復雜的參數。 (也叫data-driven testing)
方法一: 通過testng.xml 傳遞參數給測試代碼
1 package TankLearn2.Learn; 2 import org.testng.annotations.Parameters; 3 import org.testng.annotations.Test; 4 5 public class ParameterizedTest1 { 6 7 @Test 8 @Parameters("test1") 9 public void ParaTest(String test1){ 10 System.out.println("This is " + test1); 11 } 12 }
1 testng.xml 2 <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > 3 <suite name="Suite1"> 4 <parameter name="test1" value="Tank" /> 5 <parameter name="test1" value="Xiao" /> 6 <test name="test12"> 7 <classes> 8 <class name="TankLearn2.Learn.ParameterizedTest1" /> 9 </classes> 10 </test> 11 </suite>
方式二: 通過DataProvider傳遞參數
1 package TankLearn2.Learn; 2 3 import org.testng.annotations.DataProvider; 4 import org.testng.annotations.Test; 5 6 public class DataProviderLearn { 7 8 @DataProvider(name="user") 9 public Object[][] Users(){ 10 return new Object[][]{ 11 {"root","passowrd"}, 12 {"cnblogs.com", "tankxiao"}, 13 {"tank","xiao"} 14 }; 15 } 16 17 @Test(dataProvider="user") 18 public void verifyUser(String userName, String password){ 19 System.out.println("Username: "+ userName + " Password: "+ password); 20 } 21 }
十.testNG忽略測試
有時候測試用例還沒准備好, 可以給測試用例加上@Test(enable = false), 來禁用此測試用例
1 package TankLearn2.Learn; 2 3 import org.testng.annotations.Test; 4 5 public class TesgNGIgnore { 6 7 @Test(enabled = false) 8 public void testIgnore(){ 9 System.out.println("This test case will ignore"); 10 } 11 }
十一.testNG依賴測試
有時候,我們需要按順序來調用測試用例, 那么測試用例之間就存在依賴關系。 TestNG支持測試用例之間的依賴
1 package TankLearn2.Learn; 2 3 import org.testng.annotations.Test; 4 5 public class DependsTest { 6 7 @Test 8 public void setupEnv(){ 9 System.out.println("this is setup Env"); 10 } 11 12 @Test(dependsOnMethods = {"setupEnv"}) 13 public void testMessage(){ 14 System.out.println("this is test message"); 15 } 16 }
十二.testNG測試報告結果
測試報告是測試非常重要的部分.
TestNG默認情況下,會生產兩種類型的測試報告HTML的和XML的。 測試報告位於 "test-output" 目錄下.
當然我們也可以設置測試報告的內容級別.
verbose="2" 標識的就是記錄的日志級別,共有0-10的級別,其中0表示無,10表示最詳細
1 <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > 2 <suite name="Suite1"> 3 <test name="test12" verbose="2"> 4 <classes> 5 <class name="TankLearn2.Learn.TestNGLearn1" /> 6 </classes> 7 </test> 8 </suite>
