TestNG是Java中的一個測試框架, 相似於JUnit 和NUnit, 功能都差很少, 只是功能更增強大,使用也更方便html
Java中已經有一個JUnit的測試框架了。 TestNG比JUnit功能強大的多。 測試人員通常用TestNG來寫自動化測試。 開發人員通常用JUnit寫單元測試。框架
官方網站: http://testng.org/doc/index.htmleclipse
打開Eclipse Help ->Install New Software , 而後Add "http://beust.com/eclipse"ide
註解 | 描述 |
---|---|
@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.xmlui
<?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"是,能夠保證節點下面的方法是按順序執行的this
<?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>
測試中,有時候咱們指望某些代碼拋出異常。spa
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); } }
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); } }
有時候測試用例還沒準備好, 能夠給測試用例加上@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>