1. 程式人生 > >TestNG基本註解(一)

TestNG基本註解(一)

tor 參數 ner runt ring exc 劃分 .org cal

TestNG基本註解

註解描述
@BeforeSuite 註解的方法將只運行一次,運行所有測試前此套件中。
@AfterSuite 註解的方法將只運行一次此套件中的所有測試都運行之後。
@BeforeClass 註解的方法將只運行一次先行先試在當前類中的方法調用。
@AfterClass 註解的方法將只運行一次後已經運行在當前類中的所有測試方法。
@BeforeTest 註解的方法將被運行之前的任何測試方法屬於內部類的 <test>標簽的運行。
@AfterTest 註解的方法將被運行後,所有的測試方法,屬於內部類的<test>標簽的運行。
@BeforeGroups 組的列表,這種配置方法將之前運行。此方法是保證在運行屬於任何這些組第一個測試方法,該方法被調用。
@AfterGroups 組的名單,這種配置方法後,將運行。此方法是保證運行後不久,最後的測試方法,該方法屬於任何這些組被調用。
@BeforeMethod 註解的方法將每個測試方法之前運行。
@AfterMethod 被註釋的方法將被運行後,每個測試方法。
@DataProvider 標誌著一個方法,提供數據的一個測試方法。註解的方法必須返回一個Object[] [],其中每個對象[]的測試方法的參數列表中可以分配。 [email protected]
/* */ 方法,希望從這個DataProvider的接收數據,需要使用一個dataProvider名稱等於這個註解的名字。
@Factory 作為一個工廠,返回TestNG的測試類的對象將被用於標記的方法。該方法必須返回Object[]。
@Listeners 定義一個測試類的監聽器。
@Parameters [email protected]
@Test 標記一個類或方法作為測試的一部分。

1、作用域的不一樣劃分出了各種不同的標簽:

一個套件(suite)包含多個測試(test)

一個測試(test)包含多個類(class)

一個測試(test)包含多個組(group)

一個類(class)包含多個方法(method)

2、定義組

在上述基本標簽後均可以定義他們所屬的組,定義如下:

@BeforeGroups(groups="test01")
public void group(){
System.out.println("I am a group!");
}

group方法屬於test01這個組,只有當執行test01這個組時group方法才能執行。

每個防範可以屬於多個組,定義如下:

@BeforeClass(groups={"test01","test02"})
public void classs(){
System.out.println("tAutoTest01-BeforeClass");
}

當執行test01和test02時該方法都會執行。

3、參數化

(1)、xml參數傳遞

代碼定義:

@Test
@Parameters("myName")//可同時傳遞多個參數如:@Parameters({"myName","myName01"})

public void test01(String myName) {
System.out.println(myName);
}

xml定義:

<suite name="Suite" parallel="none">
<parameter name="myName" value="YinTing"></parameter>
<test name="Test">
<classes>
<class name="com.sword.test.tAutoTest01"></class>
</classes>
</test>
<test name="Test01">
<classes>
<class name="com.sword.test.tAutoTest"></class> <!-- 該值覆蓋了前面定義的YinTing-->
</classes>
</test>
</suite> <!-- Suite -->

(2)、代碼動態傳遞(數據提供者

代碼定義:

@DataProvider(name="TestData")//定義數據的提供者
public Object[][] data() {

return new Object[][]{{"YinTing",26},{"YangYi",24}};
}
@Test(dataProvider="TestData")//指定數據提供者

public void test01(String name,Integer age){
System.out.println("姓名:"+name+" "+"年齡:"+age);
}

4、工廠

策略:[email protected]行調用,[email protected]

工廠類代碼定義:

package com.sword.test;

import org.testng.annotations.Factory;

public class tAutoFactory {
@Factory
public Object[] test01(){
Object test01[]=new Object[10];
for(int i=00;i<10;i++){
test01[i]=new tAutoTest01(i);
}
return test01;
}
}

Test類代碼定義:

package com.sword.test;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class tAutoTest01 {
public int i=0;
public tAutoTest01(int i){
this.i=i;
}
@DataProvider(name="TestData")
public Object[][] data() {

return new Object[][]{{"YinTing",26},{"YangYi",24}};
}
@Test(dataProvider="TestData")
public void test01(String name,Integer age){
System.out.println("姓名:"+name+" "+"年齡:"+age);
System.out.println("-------------------"+this.i+"--------------------");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

XML定義:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="none">
<parameter name="myName" value="YinTing"></parameter>
<test name="Test">
<classes>
<class name="com.sword.test.tAutoFactory"></class>
</classes>
</test>
</suite> <!-- Suite -->

執行結果:

姓名:YinTing 年齡:26
-------------------7--------------------
姓名:YangYi 年齡:24
-------------------7--------------------
姓名:YinTing 年齡:26
-------------------5--------------------
姓名:YangYi 年齡:24
-------------------5--------------------
姓名:YinTing 年齡:26
-------------------2--------------------
姓名:YangYi 年齡:24
-------------------2--------------------
姓名:YinTing 年齡:26
-------------------4--------------------
姓名:YangYi 年齡:24
-------------------4--------------------
姓名:YinTing 年齡:26
-------------------3--------------------
姓名:YangYi 年齡:24
-------------------3--------------------
姓名:YinTing 年齡:26
-------------------6--------------------
姓名:YangYi 年齡:24
-------------------6--------------------
姓名:YinTing 年齡:26
-------------------8--------------------
姓名:YangYi 年齡:24
-------------------8--------------------
姓名:YinTing 年齡:26
-------------------1--------------------
姓名:YangYi 年齡:24
-------------------1--------------------
姓名:YinTing 年齡:26
-------------------0--------------------
姓名:YangYi 年齡:24
-------------------0--------------------
姓名:YinTing 年齡:26
-------------------9--------------------
姓名:YangYi 年齡:24
-------------------9--------------------

===============================================
Suite
Total tests run: 20, Failures: 0, Skips: 0
===============================================

5、監聽器

該地址講解的相當詳細:http://www.ibm.com/developerworks/cn/opensource/os-cn-testinglistener/index.html

6、順序執行測試&依賴測試&忽略測試

(1)、順序執行測試

xml定義:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="none">
<parameter name="myName" value="YinTing"></parameter>
<test name="Test" preserve-order="true"><!-- 順序執行測試中的測試方法 -->
<classes>
<class name="com.sword.test.tAutoFactory"></class>
</classes>
</test>
</suite> <!-- Suite -->

(2)、依賴測試

代碼定義:

package com.sword.test;


import org.testng.annotations.Test;

public class tAutoTest {
@Test
public void test02(){
System.out.println("I am test02!");
throw new RuntimeException();
}
@Test(dependsOnMethods="test02")//test01依賴test02的成功執行,才能執行。當test02拋出異常不能正常執行後,test01已不能執行。
public void test01(){
System.out.println("YinTing");
}
}

執行報告:

I am test02!
FAILED: test02
java.lang.RuntimeException
at com.sword.test.tAutoTest.test02(tAutoTest.java:10)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:714)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
at org.testng.TestRunner.privateRun(TestRunner.java:767)
at org.testng.TestRunner.run(TestRunner.java:617)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:335)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:330)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
at org.testng.SuiteRunner.run(SuiteRunner.java:240)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1224)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1149)
at org.testng.TestNG.run(TestNG.java:1057)
at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175)

SKIPPED: test01

===============================================
Default test
Tests run: 2, Failures: 1, Skips: 1
===============================================

(3)、忽略測試

代碼定義:

package com.sword.test;


import org.testng.annotations.Test;

public class tAutoTest {
@Test(enabled=false)//該方法不會被執行。
public void test02(){
System.out.println("I am test02!");
}
@Test
public void test01(){
System.out.println("YinTing");
}
}

執行報告:

YinTing
PASSED: test01

===============================================
Default test
Tests run: 1, Failures: 0, Skips: 0

TestNG基本註解(一)