一、TestNG的優點
1.1 漂亮的HTML格式測試報告
1.2 支持並發測試
1.3 參數化測試更簡單
1.4 支持輸出日志
1.5 支持更多功能的注解
二、編寫TestNG測試用例的步驟
2.1 使用 Eclipse生成TestNG的測試程序框架
2.2 在生成的程序框架中編寫測試代碼邏輯
2.3 根據測試代碼邏輯,插入TestNG注解標簽
2.4 配置Testng.xml文件,設定測試類、測試方法、測試分組的執行信息
2.5 執行TestNG的測試程序
三、如何安裝TestNG?
啟動Eclipse,選擇Help-》Install New Software-》點擊add-》name中輸入TestNG,location中輸入“http://beust.com/eclipse/”,點擊ok-》在彈出的install對話框中勾選TestNG復選框-》Next-》Accept-》Finish
四、testNG用例執行后如何查看執行結果?
4.1 在Console標簽欄中展示測試用例的執行結果,如圖:
4.2 在工程下也會生成一個test-output文件夾,如圖:
五、TestNG常用注解:執行順序如下
@BeforeSuite > @BeforeTest > @BeforeMethod > @Test > @AfterMethod > @AfterTest > @AfterSuite
@BeforeSuite |
表示會在當前測試集合中的任意一個測試用例開始運行前執行 |
@AfterSuite |
表示會在當前測試集合中的所有測試程序運行結束之后執行 |
@BeforeTest |
表示會在Test中的任意一個測試用例開始運行前執行 |
@AfterTest |
表示會在Test中的所有測試用例運行結束后執行 |
@BeforeGroups |
分組測試用例的任一測試用例開始運行前執行 |
@AfterGroups |
分組測試用例的所有測試用例運行結束后執行 |
@BeforeClass |
在當前測試類的任意一個測試用例開始運行前執行 |
@AfterClass |
在當前測試類的所有測試用例運行結束后執行 |
@BeforeMethod |
在每個測試方法開始運行前執行 |
@AfterMethod |
在每個測試方法運行結束后執行 |
@Test |
被認為是一個測試方法,既一個測試用例 |
六、如何創建TestNG測試集合?
6.1 測試集合:在自動化測試的執行過程中,通常會產生批量運行多個測試用例的需求,此需求稱為運行測試集合(Test Suite)
6.2 TestNG的測試用例可以是相互獨立的,也可以按照特定的順序來執行(配置TestNG.xml)
6.3 如何配置testNG.xml文件?
<suite name = "TestNG Suite"> //自定義的測試集合名稱 <test name = "test1"> //自定義的測試名稱 <classes> //定義被運行的測試類 <class name = "cn.gloryroad.FirstTestNGDemo" /> //測試類的路徑 <class name = "cn.gloryroad.NewTest" /> </classes> </test> </suite>
七、測試用例的分組(group)
7.1 只執行一組分組配置如下:
<suite name = "TestNG Suite">
<test name = "Grouping">
<groups>
<run>
<include name = "動物" />
</run>
</groups>
<classes>
<class name = "cn.gloryroad.Grouping"/>
</classes>
</test>
</suite>
7.2 執行多組分組時配置如下(兩種形式都可以):
<suite name = "TestNG Suite"> <test name = "Grouping"> <groups> <run> <include name = "動物" /> //name分組名稱 <include name = "人" /> </run> </groups> <classes> <class name = "cn.gloryroad.Grouping"/> </classes> </test> </suite>
<suite name = "TestNG Suite"> <test name = "Grouping"> <groups>
<define name = "All">
<include name = "動物" />
<include name = "人" />
</define>
<run>
<include name = "All" />
</run>
</groups>
<classes>
<class name = "cn.gloryroad.Grouping"/>
</classes>
</test>
</suite>
八、依賴測試(dependsOnMethod)
@Test(dependsOnMethod = {"方法名稱"})
被依賴的方法優先於此方法執行
九、特定順序執行測試用例(priority)
@Test(priority = 0/1/2/3/4/…)
按照數字大小順序優先執行,優先執行1,然后是2…
十、如何跳過某個測試方法(enabled = false)
@Test(priority = 0/1… , enabled = false)
執行結束后,在測試報告中顯示跳過的測試用例數,例如skip=1
十一、數據注解
11.1 參數化測試(@Parameters-》通過xml文件從外部給測試方法傳參):<Parameter name="Type" value="chrome"/> -》參考http://www.yiibai.com/html/testng/2013/0916303.html
創建測試案例類 創建一個Java測試類 ParameterizedTest1.java. 測試方法parameterTest()添加到測試類。此方法需要一個字符串作為輸入參數。 添加注釋 @Parameters("myName") 到此方法。該參數將被傳遞testng.xml,在下一步我們將看到一個值。 創建Java類文件名 ParameterizedTest1.java 在 C:\ > TestNG_WORKSPACE import org.testng.annotations.Parameters; import org.testng.annotations.Test; public class ParameterizedTest1 { @Test @Parameters("myName") public void parameterTest(String myName) { System.out.println("Parameterized value is : " + myName); } } 創建 TESTNG.XML 創建 testng.xml C:\ > TestNG_WORKSPACE 執行測試案例 <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <suite name="Suite1"> <test name="test1"> <parameter name="myName" value="manisha"/> <classes> <class name="ParameterizedTest1" /> </classes> </test> </suite> 我們還可以定義參數在<suite>級別。假設我們已經定義在兩個<suite>和<test>級別myName,在這種情況下,常規的作用域規則適用。這意味着,任何類里面<test>標簽將查看值參數定義在<test>,而testng.xml文件中的類的其余部分將看到定義在<suite>中值 編譯使用javac的測試用例類。 C:\TestNG_WORKSPACE>javac ParameterizedTest1.java 現在,運行testng.xml,其中將運行parameterTest方法。TestNG的將試圖找到一個命名myName的第一<test>標簽的參數,然后,如果它不能找到它,它會搜索包圍在的<suit>標簽。 C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml 驗證輸出。 Parameterized value is : manisha =============================================== Suite1 Total tests run: 1, Failures: 0, Skips: 0 =============================================== TestNG 對testng.xml 的參數的類型指定的值會自動嘗試轉換。下面是支持的類型: String int/Integer boolean/Boolean byte/Byte char/Character double/Double float/Float long/Long short/Short
11.2 數據驅動(@DataProvider)-》參考http://www.yiibai.com/html/testng/2013/0916303.html
當你需要通過復雜的參數或參數需要創建從Java(復雜的對象,對象讀取屬性文件或數據庫等..),在這種情況下,可以將參數傳遞使用數據提供者。數據提供者@DataProvider的批注的方法。這個注解只有一個字符串屬性:它的名字。如果不提供名稱,數據提供者的名稱會自動默認方法的名稱。數據提供者返回一個對象數組。 讓我們看看下面的例子使用數據提供者。第一個例子是@DataProvider的使用Vector,String或Integer 作為參數,第二個例子是關於@DataProvider 的使用對象作為參數。 實例 1 在這里 @DataProvider 通過整數和布爾參數。 創建Java類 創建一個java類PrimeNumberChecker.java。這個類檢查,如果是素數。創建這個類在 C:\ > TestNG_WORKSPACE public class PrimeNumberChecker { public Boolean validate(final Integer primeNumber) { for (int i = 2; i < (primeNumber / 2); i++) { if (primeNumber % i == 0) { return false; } } return true; } } 創建測試案例類 創建一個Java測試類 ParamTestWithDataProvider1.java. 定義方法primeNumbers(),其定義為DataProvider 使用注釋。此方法返回的對象數組的數組。 測試方法testPrimeNumberChecker()添加到測試類中。此方法需要一個整數和布爾值作為輸入參數。這個方法驗證,如果傳遞的參數是一個素數。 添加注釋 @Test(dataProvider = "test1") 到此方法。dataProvider的屬性被映射到"test1". 創建Java類文件名ParamTestWithDataProvider1.java 在 C:\ > TestNG_WORKSPACE import org.testng.Assert; import org.testng.annotations.BeforeMethod; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; public class ParamTestWithDataProvider1 { private PrimeNumberChecker primeNumberChecker; @BeforeMethod public void initialize() { primeNumberChecker = new PrimeNumberChecker(); } @DataProvider(name = "test1") public static Object[][] primeNumbers() { return new Object[][] { { 2, true }, { 6, false }, { 19, true }, { 22, false }, { 23, true } }; } // This test will run 4 times since we have 5 parameters defined @Test(dataProvider = "test1") public void testPrimeNumberChecker(Integer inputNumber, Boolean expectedResult) { System.out.println(inputNumber + " " + expectedResult); Assert.assertEquals(expectedResult, primeNumberChecker.validate(inputNumber)); } } 創建 TESTNG.XML 創建 testng.xml C:\ > TestNG_WORKSPACE 執行測試案例。 <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <suite name="Suite1"> <test name="test1"> <classes> <class name="ParamTestWithDataProvider1" /> </classes> </test> </suite> 編譯使用javac的測試用例類。 C:\TestNG_WORKSPACE>.javac ParamTestWithDataProvider1.java PrimeNumberChecker.java 運行testng.xml. C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml 驗證輸出。 2 true 6 false 19 true 22 false 23 true =============================================== Suite1 Total tests run: 5, Failures: 0, Skips: 0 =============================================== 實例 2 在這里,@DataProvider 傳遞對象作為參數。 創建Java類 創建一個Java類 Bean.java, 對象帶有 get/set 方法, 在 C:\ > TestNG_WORKSPACE. public class Bean { private String val; private int i; public Bean(String val, int i){ this.val=val; this.i=i; } public String getVal() { return val; } public void setVal(String val) { this.val = val; } public int getI() { return i; } public void setI(int i) { this.i = i; } } 創建測試案例類 創建一個Java測試類 ParamTestWithDataProvider2.java. 定義方法primeNumbers(),其定義為DataProvider使用注釋。此方法返回的對象數組的數組。 添加測試類中測試方法TestMethod()。此方法需要對象的bean作為參數。 添加注釋 @Test(dataProvider = "test1") 到此方法. dataProvider 屬性被映射到 "test1". 創建Java類文件名 ParamTestWithDataProvider2.java 在 C:\ > TestNG_WORKSPACE import org.testng.annotations.DataProvider; import org.testng.annotations.Test; public class ParamTestWithDataProvider2 { @DataProvider(name = "test1") public static Object[][] primeNumbers() { return new Object[][] { { new Bean("hi I am the bean", 111) } }; } @Test(dataProvider = "test1") public void testMethod(Bean myBean) { System.out.println(myBean.getVal() + " " + myBean.getI()); } } 創建 TESTNG.XML 創建一個文件 testng.xml C:\ > TestNG_WORKSPACE 來執行測試用例. <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <suite name="Suite1"> <test name="test1"> <classes> <class name="ParamTestWithDataProvider2" /> </classes> </test> </suite> 編譯使用javac的測試用例類。 C:\TestNG_WORKSPACE>javac ParamTestWithDataProvider2.java Bean.java 運行 testng.xml. C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml 驗證輸出。 hi I am the bean 111 =============================================== Suite1 Total tests run: 1, Failures: 0, Skips: 0 ===============================================
十二、測試報告中自定義日志(Reporter.log(“輸入自定義內容”)),例如:
@Test(groups = {"人"})
public void student(){
System.out.println("學生方法被調用");
Reporter.log("學生方法自定義日志");
}