testNG入門學習(一)
方法一、線上安裝:
開啟Eclipse Help ->Install New Software , 然後Add "http://beust.com/eclipse"
方法二、
1.下載附件,並解壓。百度網盤:http://pan.baidu.com/s/1i3y1QtR
2.將解壓後的檔案..\eclipse-testng離線包\features\目錄下的資料夾org.testng.eclipse_6.8.6.20130607_0745放到eclipse-->features目錄下
3.將解壓後的檔案..\eclipse-testng離線包\org.testng.eclipse_6.8.6.20130607_0745資料夾放到eclipse-->plugins目錄下
4.重啟eclipse
5.驗證是否安裝成功,windows->preferences,如下圖
TestNG的基本註解
註解 | 描述 |
---|---|
@BeforeSuite | 被註釋的方法將在所有測試執行前執行 |
@AfterSuite | 被註釋的方法將在所有測試執行後執行 |
@BeforeClass | 被註釋的方法將在當前類的第一個測試方法呼叫前執行。 |
@AfterClass | 被註釋的方法將在當前類的所有測試方法呼叫後執行。 |
@BeforeTest | 被註釋的方法將在測試執行前執行 |
@AfterTest | 被註釋的方法將在測試執行後執行 |
@BeforeGroups | 被配置的方法將在列表中的group前執行,這個方法保證在第一個屬於這些組的測試方法呼叫前立即執行。 |
@AfterGroups |
被配置的方法將在列表中的group後執行,這個方法保證在最後一個屬於這些組的測試方法呼叫後立即執行。 |
@BeforeMethod | 被註釋的方法將在每一個測試方法呼叫前執行。 |
@AfterMethod | 被註釋的方法將在每一個測試方法呼叫後執行。 |
@DataProvider | 標記一個方法用於為測試方法提供資料。被註釋的方法必須返回object[][],其中每個object[]可以指派為這個測試方法的引數列表。從這個DataProvider接受資料@Test方法需要用一個和當前註釋相同名稱的dataProvider名稱。 |
@Factory | 標記方法作為一個返回物件的工廠,這些物件將被TestNG用於作為測試類。這個方法必須返回object[]. |
@Listeners | 定義一個測試類的監聽器。 |
@Parameters | 描述如何將引數傳遞給@Test方法。 |
@Test | 標記一個類或方法作為測試的一部分。 |
下面是TestNG的簡單的一個例子,可以看到註釋都是如何工作的
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
public class TestNGLearn {
@BeforeSuite
public void beforeSuite(){
System.out.println("this is beforeSuite");
}
@AfterSuite
public void afterSuite(){
System.out.println("this is afterSuite");
}
@BeforeClass
public void beforeClass(){
System.out.println("this is before class");
}
@AfterClass
public void afterClass(){
System.out.println("this is after class");
}
@BeforeTest
public void beforeTest(){
System.out.println("this is a beforeTest");
}
@AfterTest
public void afterTest(){
System.out.println("this is a afterTest");
}
@BeforeMethod
public void beforeMethod(){
System.out.println("this is a beforeMethod");
}
@AfterMethod
public void afterMethod(){
System.out.println("this is a afterMethod");
}
@Test
public void testNgLearn(){
System.out.println("this is a testcase1");
}
@Test
public void testNgLearn1(){
System.out.println("this is a testcase2");
}
}
輸出結果: this is beforeSuite this is a beforeTest this is before class this is a beforeMethod this is a testcase1 this is a afterMethod this is a beforeMethod this is a testcase2 this is a afterMethod this is after class this is a afterTest this is afterSuite
TestNG中如何執行測試
第一種直接執行:右鍵要執行的方法,點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="test1">
<classes>
<class name="com.study.testng.TestCalculate" />
</classes>
</test>
</suite>
TestNG測試準備工作
我們編寫一個Calculator類,這是一個能夠簡單實現加減乘除、平方、開方的計算器類,方法中故意設定了一些錯誤,然後對這些功能進行單元測試。
public class Calculate {
private static int result;
public void add(int n){
result+=n;
}
public void substract(int n){
result=result-1; //方法有錯誤
}
public void multiply(int n){
//方法未寫好
}
public void divide(int n){
result=result/n;
}
public void twoMultiply(int n,int m){
result=m*n;
}
public void squareRoot(int n){
for(;;); //Bug:死迴圈
}
public void clear(){
result=0; //將結果清零
}
public int getResult(){
return result;
}
}
TestNG按順序執行Case
在testng.xml中,可以控制測試用例按順序執行。 當preserve-order="true"是,可以保證節點下面的方法是按順序執行的
我們的測試類:package com.study.testng;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
public class TestCalculate {
Calculate calculate=new Calculate();
@BeforeMethod
public void init(){
calculate.clear();
System.out.println("計算機初始化");
}
@Test
public void testAdd(){
calculate.add(2);
calculate.add(3);
System.out.println("加法結果:"+calculate.getResult());
Assert.assertEquals(calculate.getResult(),5);
}
@Test
public void testSubstract() {
calculate.add(10);
calculate.substract(2);
System.out.println("減法結果:"+calculate.getResult());
Assert.assertEquals(calculate.getResult(), 8);
}
@Test
public void testDivide(){
calculate.add(9);
calculate.divide(3);
System.out.println("除法結果:"+calculate.getResult());
Assert.assertEquals(calculate.getResult(),3);
}
}
然後我們在檔案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" <span style="color:#FF0000;">preserve-order="true"</span>>
<classes>
<class name="com.study.testng.TestCalculate" />
<methods>
<include name="testSubstract" />
<include name="testAdd" />
<include name="testDivide" />
</methods>
</classes>
</test>
</suite>
執行結果: 計算機初始化 減法結果:9 計算機初始化 加法結果:5 計算機初始化 除法結果:3 從結果中可以看出方法是按順序執行的。
TestNG異常測試
我們簡單修改我們的測試類,為了看的更清楚點,我們這裡只列出除法的測試方法:public class TestCalculate {
Calculate calculate=new Calculate();
@BeforeMethod
public void init(){
calculate.clear();
System.out.println("計算機初始化");
}
@Test(expectedExceptions=ArithmeticException.class,expectedExceptionsMessageRegExp="/ by zero")
public void testDivide(){
calculate.add(9);
calculate.divide(0);
System.out.println("除法結果:"+calculate.getResult());
Assert.assertEquals(calculate.getResult(),3);
}
}
testNG組測試
我們的測試類如下,一個測試方法可以同時屬於多個不同的測試組:
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
public class TestCalculateGroup {
Calculate calculate=new Calculate();
@BeforeMethod
public void init(){
calculate.clear();
System.out.println("計算機初始化");
}
@Test(groups={"groupone"})
public void testAdd(){
calculate.add(2);
calculate.add(3);
System.out.println("加法結果:"+calculate.getResult());
Assert.assertEquals(calculate.getResult(),5);
}
@Test(groups={"groupone"})
public void testSubstract() {
calculate.add(10);
calculate.substract(2);
System.out.println("減法結果:"+calculate.getResult());
Assert.assertEquals(calculate.getResult(), 8);
}
@Test(groups={"groupone","grouptwo"})
public void testDivide2(){
calculate.add(9);
calculate.divide(3);
System.out.println("除法結果2:"+calculate.getResult());
Assert.assertEquals(calculate.getResult(),3);
}
@Test(groups={"grouptwo"},expectedExceptions=ArithmeticException.class,expectedExceptionsMessageRegExp="/ by zero")
public void testDivide1(){
calculate.add(9);
calculate.divide(0);
System.out.println("除法結果1:"+calculate.getResult());
Assert.assertEquals(calculate.getResult(),3);
}
}
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="grouptwo"></include>
</run>
</groups>
<classes>
<class name="com.study.testng.TestCalculateGroup" />
</classes>
</test>
</suite>
testNG引數化測試
軟體測試中,經常需要測試大量的資料集。 測試程式碼的邏輯完全一樣,只是測試的引數不一樣。 這樣我們就需要一種 “傳遞測試引數的機制”。 避免寫重複的測試程式碼
TestNG提供了2種傳遞引數的方式。
第一種: testng.xml 方式使程式碼和測試資料分離,方便維護
第二種:@DataProvider能夠提供比較複雜的引數。方法一: 通過testng.xml 傳遞引數給測試程式碼
public class TestCalculateParam {
Calculate calculate=new Calculate();
@BeforeMethod
public void init(){
calculate.clear();
System.out.println("計算機初始化");
}
@Test
@Parameters({"m","n","result"})
public void testAdd(int m,int n,int result){
calculate.add(m);
calculate.add(n);
System.out.println("加法的結果:"+calculate.getResult());
Assert.assertEquals(calculate.getResult(),result);
}
}
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">
<parameter name="m" value="3"/>
<parameter name="n" value="4" />
<parameter name="result" value="7"/>
<classes>
<class name="com.study.testng.TestCalculateParam" />
</classes>
</test>
<test name="test2">
<parameter name="m" value="4"/>
<parameter name="n" value="5" />
<parameter name="result" value="9"/>
<classes>
<class name="com.study.testng.TestCalculateParam" />
</classes>
</test>
</suite>
方式二: 通過DataProvider傳遞引數
public class TestCalculateParam {
Calculate calculate=new Calculate();
@BeforeMethod
public void init(){
calculate.clear();
System.out.println("計算機初始化");
}
@DataProvider(name="mydata")
public Object[][] creater(){
return new Object[][]{
{3,3,6},
{3,7,10}
};
}
@Test(dataProvider="mydata")
public void testAdd1(int m,int n,int result){
calculate.add(m);
calculate.add(n);
System.out.println("加法運算結果:"+calculate.getResult());
Assert.assertEquals(calculate.getResult(),result);
}
}
testNG忽略測試
有時候程式碼功能還沒實現,但是測試用例已經寫好了, 可以給測試用例加上@Test(enable = false), 來禁用此測試用例,等程式碼完成後再開發這個測試用例。
@Test(enabled=false)
public void testMultiply(){
calculate.add(2);
calculate.multiply(3);
System.out.println("乘法結果:"+calculate.getResult());
Assert.assertEquals(calculate.getResult(),6);
}
testNG依賴測試
有時候,我們需要按順序來呼叫測試用例, 那麼測試用例之間就存在依賴關係。 TestNG支援測試用例之間的依賴
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" 目錄下.
file:///F:/eclipseworkSpace/testNG/test-output/Suite1/test1.html
文字參考了一些網路資料:
http://www.cnblogs.com/TankXiao/p/3888070.html