java中TestNG使用教程詳解
一、TestNG介紹
TestNG是Java中的一個(gè)測(cè)試框架, 類似于JUnit 和NUnit, 功能都差不多, 只是功能更加強(qiáng)大,使用也更方便。
詳細(xì)使用說明請(qǐng)參考官方鏈接:https://testng.org/doc/index.html
二、TestNG安裝(基于eclipse+maven)
工程的pom.xml中需要添加如下內(nèi)容:
<dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>6.10</version> <scope>test</scope> </dependency>
記得Maven install一下
eclipse中的TestNG插件的安裝則需要在Help中做,地址為http://beust.com/eclipse;有時(shí)候會(huì)打不開網(wǎng)址,本文提供一下本地下載地址:http://www.dbjr.com.cn/softs/575355.html
三、TestNG基本使用和運(yùn)行
新建一個(gè)maven工程,新建一個(gè)TestNG的class,可以直接新建一個(gè)class來使用,也可以新建一個(gè)TestNG的class,如下圖所示:
此方法好處在于你在創(chuàng)建class的時(shí)候可以直接把注解的各個(gè)方法都加進(jìn)去,同時(shí)也可以創(chuàng)建xml,名字路徑可以自己定義,注意xml文件的路徑是支持相對(duì)路徑的,出來的class文件如下所示:
package com.demo.test.testng; import org.testng.annotations.Test; public class NewTest { @Test public void f() { } }
一個(gè)簡(jiǎn)單的用例如下:
package com.demo.test.testng; import org.testng.Assert; import org.testng.annotations.Test; public class NewTest { @Test public void f() { System.out.println("this is new test"); Assert.assertTrue(true); } }
1、直接運(yùn)行:
結(jié)果如下:
[RemoteTestNG] detected TestNG version 6.10.0
[TestNG] Running:
C:\Users\aaa\AppData\Local\Temp\testng-eclipse-342998054\testng-customsuite.xmlthis is new test
PASSED: f===============================================
Default test
Tests run: 1, Failures: 0, Skips: 0
===============================================
===============================================
Default suite
Total tests run: 1, Failures: 0, Skips: 0
===============================================[TestNG] Time taken by org.testng.reporters.JUnitReportReporter@64bfbc86: 4 ms
[TestNG] Time taken by org.testng.reporters.SuiteHTMLReporter@7e0b0338: 26 ms
[TestNG] Time taken by org.testng.reporters.jq.Main@7fac631b: 20 ms
[TestNG] Time taken by [FailedReporter passed=0 failed=0 skipped=0]: 0 ms
[TestNG] Time taken by org.testng.reporters.XMLReporter@23e028a9: 3 ms
[TestNG] Time taken by org.testng.reporters.EmailableReporter2@578486a3: 2 ms
2、xml方式運(yùn)行
由于我將xml放置在其他文件夾,不和class放在一個(gè)文件夾,所以需要修改xml,如下所示:
<?xml version="1.0" encoding="UTF-8"?> <suite name="Suite" parallel="false"> <test name="Test"> <classes> <class name="com.demo.test.testng.NewTest"/> </classes> </test> <!-- Test --> </suite> <!-- Suite -->
運(yùn)行方法:
右鍵該xml選擇Run As–>TestNG Suite,如下:
運(yùn)行結(jié)果如下:
[RemoteTestNG] detected TestNG version 6.10.0
[TestNGContentHandler] [WARN] It is strongly recommended to add "<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >" at the top of your file, otherwise TestNG may fail or not work as expected.
[XmlSuite] [WARN] 'parallel' value 'false' is deprecated, default value will be used instead: 'none'.
[TestNG] Running:
D:\software\workspace\testng\src\main\java\com\demo\test\testCase\newTestXML.xmlthis is new test
===============================================
Suite
Total tests run: 1, Failures: 0, Skips: 0
===============================================
四、注解說明
TestNG支持多種注解,可以進(jìn)行各種組合,如下進(jìn)行簡(jiǎn)單的說明
注解 | 描述 |
---|---|
@BeforeSuite | 在該套件的所有測(cè)試都運(yùn)行在注釋的方法之前,僅運(yùn)行一次 |
@AfterSuite | 在該套件的所有測(cè)試都運(yùn)行在注釋方法之后,僅運(yùn)行一次 |
@BeforeClass | 在調(diào)用當(dāng)前類的第一個(gè)測(cè)試方法之前運(yùn)行,注釋方法僅運(yùn)行一次 |
@AfterClass | 在調(diào)用當(dāng)前類的第一個(gè)測(cè)試方法之后運(yùn)行,注釋方法僅運(yùn)行一次 |
@BeforeTest | 注釋的方法將在屬于test標(biāo)簽內(nèi)的類的所有測(cè)試方法運(yùn)行之前運(yùn)行 |
@AfterTest | 注釋的方法將在屬于test標(biāo)簽內(nèi)的類的所有測(cè)試方法運(yùn)行之后運(yùn)行 |
@BeforeGroups | 配置方法將在之前運(yùn)行組列表。 此方法保證在調(diào)用屬于這些組中的任何一個(gè)的第一個(gè)測(cè)試方法之前不久運(yùn)行 |
@AfterGroups | 此配置方法將在之后運(yùn)行組列表。該方法保證在調(diào)用屬于任何這些組的最后一個(gè)測(cè)試方法之后不久運(yùn)行 |
@BeforeMethod | 注釋方法將在每個(gè)測(cè)試方法之前運(yùn)行 |
@AfterMethod | 注釋方法將在每個(gè)測(cè)試方法之后運(yùn)行 |
@DataProvider | 標(biāo)記一種方法來提供測(cè)試方法的數(shù)據(jù)。 注釋方法必須返回一個(gè)Object [] [] ,其中每個(gè)Object [] 可以被分配給測(cè)試方法的參數(shù)列表。 要從該DataProvider 接收數(shù)據(jù)的@Test 方法需要使用與此注釋名稱相等的dataProvider 名稱 |
@Factory | 將一個(gè)方法標(biāo)記為工廠,返回TestNG 將被用作測(cè)試類的對(duì)象。 該方法必須返回Object [] |
@Listeners | 定義測(cè)試類上的偵聽器 |
@Parameters | 描述如何將參數(shù)傳遞給@Test 方法 |
@Test | 將類或方法標(biāo)記為測(cè)試的一部分,此標(biāo)記若放在類上,則該類所有公共方法都將被作為測(cè)試方法 |
如上列表中的@Factory、@Linsteners這兩個(gè)是不常用的;
前十個(gè)注解看起來不太容易區(qū)分,順序不太容易看明白,以如下范例做簡(jiǎn)單說明,代碼:
import org.testng.Assert; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterGroups; import org.testng.annotations.AfterMethod; import org.testng.annotations.AfterSuite; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeGroups; import org.testng.annotations.BeforeMethod; import org.testng.annotations.BeforeSuite; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; public class NewTest { @Test(groups="group1") public void test1() { System.out.println("test1 from group1"); Assert.assertTrue(true); } @Test(groups="group1") public void test11() { System.out.println("test11 from group1"); Assert.assertTrue(true); } @Test(groups="group2") public void test2() { System.out.println("test2 from group2"); Assert.assertTrue(true); } @BeforeTest public void beforeTest() { System.out.println("beforeTest"); } @AfterTest public void afterTest() { System.out.println("afterTest"); } @BeforeClass public void beforeClass() { System.out.println("beforeClass"); } @AfterClass public void afterClass() { System.out.println("afterClass"); } @BeforeSuite public void beforeSuite() { System.out.println("beforeSuite"); } @AfterSuite public void afterSuite() { System.out.println("afterSuite"); } //只對(duì)group1有效,即test1和test11 @BeforeGroups(groups="group1") public void beforeGroups() { System.out.println("beforeGroups"); } //只對(duì)group1有效,即test1和test11 @AfterGroups(groups="group1") public void afterGroups() { System.out.println("afterGroups"); } @BeforeMethod public void beforeMethod() { System.out.println("beforeMethod"); } @AfterMethod public void afterMethod() { System.out.println("afterMethod"); } }
運(yùn)行結(jié)果如下:
beforeSuite
beforeTest
beforeClass
beforeGroups
beforeMethod
test1 from group1
afterMethod
beforeMethod
test11 from group1
afterMethod
afterGroups
beforeMethod
test2 from group2
afterMethod
afterClass
afterTest
PASSED: test1
PASSED: test11
PASSED: test2===============================================
Default test
Tests run: 3, Failures: 0, Skips: 0
===============================================afterSuite
對(duì)照前面的說明應(yīng)該就可以能比較明白了。
五、TestNG斷言
TestNG的斷言種類很多,包括相等/不相等,true/false、為null/不為null、相同/不相同等。
六、TestNG預(yù)期異常測(cè)試
預(yù)期異常測(cè)試通過在@Test注解后加入預(yù)期的Exception來進(jìn)行添加,范例如下所示:
@Test(expectedExceptions = ArithmeticException.class) public void divisionWithException() { int i = 1 / 0; System.out.println("After division the value of i is :"+ i); }
運(yùn)行結(jié)果如下:
[RemoteTestNG] detected TestNG version 6.10.0
[TestNG] Running:
C:\Users\Administrator\AppData\Local\Temp\testng-eclipse--754789457\testng-customsuite.xmlPASSED: divisionWithException
===============================================
Default test
Tests run: 1, Failures: 0, Skips: 0
===============================================
===============================================
Default suite
Total tests run: 1, Failures: 0, Skips: 0
===============================================[TestNG] Time taken by org.testng.reporters.JUnitReportReporter@55d56113: 0 ms
[TestNG] Time taken by org.testng.reporters.SuiteHTMLReporter@1e127982: 0 ms
[TestNG] Time taken by org.testng.reporters.jq.Main@6e0e048a: 32 ms
[TestNG] Time taken by [FailedReporter passed=0 failed=0 skipped=0]: 0 ms
[TestNG] Time taken by org.testng.reporters.XMLReporter@43814d18: 0 ms
[TestNG] Time taken by org.testng.reporters.EmailableReporter2@6ebc05a6: 0 ms
七、TestNG忽略測(cè)試
有時(shí)候我們寫的用例沒準(zhǔn)備好,或者該次測(cè)試不想運(yùn)行此用例,那么刪掉顯然不明智,那么就可以通過注解@Test(enabled = false)
來將其忽略掉,此用例就不會(huì)運(yùn)行了,如下范例:
import org.testng.annotations.Test; public class TestCase1 { @Test(enabled=false) public void TestNgLearn1() { System.out.println("this is TestNG test case1"); } @Test public void TestNgLearn2() { System.out.println("this is TestNG test case2"); } }
運(yùn)行結(jié)果:
this is TestNG test case2
PASSED: TestNgLearn2
八、TestNG超時(shí)測(cè)試
“超時(shí)”表示如果單元測(cè)試花費(fèi)的時(shí)間超過指定的毫秒數(shù),那么TestNG將會(huì)中止它并將其標(biāo)記為失敗。此項(xiàng)常用于性能測(cè)試。如下為一個(gè)范例:
import org.testng.annotations.Test; public class TestCase1 { @Test(timeOut = 5000) // time in mulliseconds public void testThisShouldPass() throws InterruptedException { Thread.sleep(4000); } @Test(timeOut = 1000) public void testThisShouldFail() { while (true){ // do nothing } } }
結(jié)果如下:
PASSED: testThisShouldPass
FAILED: testThisShouldFail
org.testng.internal.thread.ThreadTimeoutException: Method com.demo.test.testng.TestCase1.testThisShouldFail() didn't finish within the time-out 1000
at com.demo.test.testng.TestCase1.testThisShouldFail(TestCase1.java:37)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:104)
at org.testng.internal.InvokeMethodRunnable.runOne(InvokeMethodRunnable.java:54)
at org.testng.internal.InvokeMethodRunnable.run(InvokeMethodRunnable.java:44)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
九、分組測(cè)試
分組測(cè)試即為使用group,如果你使用xml的話就是里邊的<groups>
標(biāo)簽,如果是直接在class中,是通過@Test(groups="group2")
這種方式來分組,如第四節(jié)的注解說明中的那個(gè)例子,分了兩個(gè)group,而且@BeforeGroup
是需要添加group名稱才可以正確掛載到該group下的;
這個(gè)group說明可以是在單個(gè)的測(cè)試方法上,也可以在class上,只要具有同樣的group名稱都會(huì)在同一個(gè)group中,同時(shí)group名稱可以有多個(gè),類似@Test(groups = {"mysql","database"})
這種,范例如下:
一個(gè)測(cè)試文件NewTest.class:
public class NewTest { @Test(groups="group1") public void test1() { System.out.println("test1 from group1"); Assert.assertTrue(true); } @Test(groups="group1") public void test11() { System.out.println("test11 from group1"); Assert.assertTrue(true); } @Test(groups="group2") public void test2() { System.out.println("test2 from group2"); Assert.assertTrue(true); } @BeforeTest public void beforeTest() { System.out.println("beforeTest"); } @AfterTest public void afterTest() { System.out.println("afterTest"); } @BeforeClass public void beforeClass() { System.out.println("beforeClass"); } @AfterClass public void afterClass() { System.out.println("afterClass"); } @BeforeSuite public void beforeSuite() { System.out.println("beforeSuite"); } @AfterSuite public void afterSuite() { System.out.println("afterSuite"); } @BeforeGroups(groups="group1") public void beforeGroups() { System.out.println("beforeGroups"); } @AfterGroups(groups="group1") public void afterGroups() { System.out.println("afterGroups"); } @BeforeMethod public void beforeMethod() { System.out.println("beforeMethod"); } @AfterMethod public void afterMethod() { System.out.println("afterMethod"); } }
另一個(gè)TestCase1.class:
@Test(groups= "group2") public class TestCase1 { @Test(enabled=false) public void TestNgLearn1() { System.out.println("this is TestNG test case1"); } @Test public void TestNgLearn2() { System.out.println("this is TestNG test case2"); } }
xml如下:
<?xml version="1.0" encoding="UTF-8"?> <suite name="Suite" parallel="false"> <test name="Test"> <groups> <incloud name="group1"></incloud> <incloud name="group2"></incloud> </groups> <classes> <class name="com.demo.test.testng.NewTest"/> <class name="com.demo.test.testng.TestCase1"/> </classes> </test> <!-- Test --> </suite> <!-- Suite -->
運(yùn)行結(jié)果如下:
beforeSuite
beforeTest
beforeClass
beforeGroups
beforeMethod
test1 from group1
afterMethod
beforeMethod
test11 from group1
afterMethod
afterGroups
beforeMethod
test2 from group2
afterMethod
afterClass
this is TestNG test case2
afterTest
afterSuite
如上所示,先運(yùn)行了group1的兩個(gè)用例,再運(yùn)行g(shù)roup2的兩條用例;
注意在xml標(biāo)識(shí)group,需要將要運(yùn)行的group加進(jìn)來,同時(shí)還要將被標(biāo)識(shí)這些group的class也加進(jìn)來,不被加進(jìn)去的不會(huì)運(yùn)行;
十、分suite測(cè)試
測(cè)試套件是用于測(cè)試軟件程序的行為或一組行為的測(cè)試用例的集合。 在TestNG中,我們無法在測(cè)試源代碼中定義一個(gè)套件,但它可以由一個(gè)XML文件表示,因?yàn)樘准菆?zhí)行的功能。 它還允許靈活配置要運(yùn)行的測(cè)試。 套件可以包含一個(gè)或多個(gè)測(cè)試,并由<suite>
標(biāo)記定義。<suite>
是testng.xml的根標(biāo)記。 它描述了一個(gè)測(cè)試套件,它又由幾個(gè)<test>
部分組成。
下表列出了<suite>
接受的所有定義的合法屬性。
屬性 | 描述 |
---|---|
name | 套件的名稱,這是一個(gè)強(qiáng)制屬性 |
verbose | 運(yùn)行的級(jí)別或詳細(xì)程度,級(jí)別為0-10,其中10最詳細(xì) |
parallel | TestNG是否運(yùn)行不同的線程來運(yùn)行這個(gè)套件,默認(rèn)為none,其他級(jí)別為methods、tests、classes、instances |
thread-count | 如果啟用并行模式(忽略其他方式),則為使用的線程數(shù) |
annotations | 在測(cè)試中使用的注釋類型 |
time-out | 在本測(cè)試中的所有測(cè)試方法上使用的默認(rèn)超時(shí) |
十一、依賴測(cè)試
有時(shí),我們可能需要以特定順序調(diào)用測(cè)試用例中的方法,或者可能希望在方法之間共享一些數(shù)據(jù)和狀態(tài)。 TestNG支持這種依賴關(guān)系,因?yàn)樗С衷跍y(cè)試方法之間顯式依賴的聲明。
TestNG允許指定依賴關(guān)系:
- 在
@Test
注釋中使用屬性dependsOnMethods - 在
@Test
注釋中使用屬性dependsOnGroups
除此之外依賴還分為hard依賴和soft依賴:
- hard依賴:默認(rèn)為此依賴方式,即其所有依賴的methods或者groups必須全部pass,否則被標(biāo)識(shí)依賴的類或者方法將會(huì)被略過,在報(bào)告中標(biāo)識(shí)為skip,如后面的范例所示,此為默認(rèn)的依賴方式;
- soft依賴:此方式下,其依賴的方法或者組有不是全部pass也不會(huì)影響被標(biāo)識(shí)依賴的類或者方法的運(yùn)行,注意如果使用此方式,則依賴者和被依賴者之間必須不存在成功失敗的因果關(guān)系,否則會(huì)導(dǎo)致用例失敗。此方法在注解中需要加入
alwaysRun=true
即可,如@Test(dependsOnMethods= {"TestNgLearn1"}, alwaysRun=true)
;
在TestNG中,我們使用dependOnMethods和dependsOnGroups來實(shí)現(xiàn)依賴測(cè)試。 且這兩個(gè)都支持正則表達(dá)式,如范例三所示,如下為幾個(gè)使用范例:
范例一,被依賴方法pass:
public class TestCase1 { @Test(enabled=true) public void TestNgLearn1() { System.out.println("this is TestNG test case1"); } @Test(dependsOnMethods= {"TestNgLearn1"}) public void TestNgLearn2() { System.out.println("this is TestNG test case2"); } }
運(yùn)行結(jié)果:
this is TestNG test case1
this is TestNG test case2
PASSED: TestNgLearn1
PASSED: TestNgLearn2
范例二,被依賴方法fail:
public class TestCase1 { @Test(enabled=true) public void TestNgLearn1() { System.out.println("this is TestNG test case1"); Assert.assertFalse(true); } @Test(dependsOnMethods= {"TestNgLearn1"}) public void TestNgLearn2() { System.out.println("this is TestNG test case2"); } }
結(jié)果:
this is TestNG test case1
FAILED: TestNgLearn1
junit.framework.AssertionFailedError
at junit.framework.Assert.fail(Assert.java:47)
at junit.framework.Assert.assertTrue(Assert.java:20)
at junit.framework.Assert.assertFalse(Assert.java:34)
at junit.framework.Assert.assertFalse(Assert.java:41)
at com.demo.test.testng.TestCase1.TestNgLearn1(TestCase1.java:26)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:104)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:645)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:851)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1177)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:129)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:112)
at org.testng.TestRunner.privateRun(TestRunner.java:756)
at org.testng.TestRunner.run(TestRunner.java:610)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:387)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:382)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:340)
at org.testng.SuiteRunner.run(SuiteRunner.java:289)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1293)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1218)
at org.testng.TestNG.runSuites(TestNG.java:1133)
at org.testng.TestNG.run(TestNG.java:1104)
at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:114)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)SKIPPED: TestNgLearn2
范例三、group依賴:
如下所示,method1依賴group名稱為init的所有方法:
@Test(groups = { "init" }) public void serverStartedOk() {} @Test(groups = { "init" }) public void initEnvironment() {} @Test(dependsOnGroups = { "init.*" }) public void method1() {}
這里init這個(gè)group中的兩個(gè)方法的執(zhí)行順序如果沒有在xml中指明則每次運(yùn)行的順序不能保證
十二、參數(shù)化測(cè)試
TestNG中的另一個(gè)有趣的功能是參數(shù)化測(cè)試。 在大多數(shù)情況下,您會(huì)遇到業(yè)務(wù)邏輯需要大量測(cè)試的場(chǎng)景。 參數(shù)化測(cè)試允許開發(fā)人員使用不同的值一次又一次地運(yùn)行相同的測(cè)試。
TestNG可以通過兩種不同的方式將參數(shù)直接傳遞給測(cè)試方法:
- 使用testng.xml
- 使用數(shù)據(jù)提供者
下面分別介紹兩種傳參方式:
1、使用textng.xml傳送參數(shù)
范例代碼如下:
public class TestCase1 { @Test(enabled=true) @Parameters({"param1", "param2"}) public void TestNgLearn1(String param1, int param2) { System.out.println("this is TestNG test case1, and param1 is:"+param1+"; param2 is:"+param2); Assert.assertFalse(false); } @Test(dependsOnMethods= {"TestNgLearn1"}) public void TestNgLearn2() { System.out.println("this is TestNG test case2"); } }
xml配置:
<?xml version="1.0" encoding="UTF-8"?> <suite name="Suite" parallel="false"> <test name="Test"> <parameter name="param1" value="1011111" /> <parameter name="param2" value="10" /> <classes> <class name="com.demo.test.testng.TestCase1"/> </classes> </test> <!-- Test --> </suite> <!-- Suite -->
運(yùn)行xml,結(jié)果如下:
this is TestNG test case1, and param1 is:1011111; param2 is:10
this is TestNG test case2===============================================
Suite
Total tests run: 2, Failures: 0, Skips: 0
===============================================
2、使用@DataProvider
傳遞參數(shù)
此處需要注意,傳參的類型必須要一致,且?guī)в?code>@DataProvider注解的函數(shù)返回的必然是Object[][]
,此處需要注意。
代碼如下:
public class TestCase1 { @DataProvider(name = "provideNumbers") public Object[][] provideData() { return new Object[][] { { 10, 20 }, { 100, 110 }, { 200, 210 } }; } @Test(dataProvider = "provideNumbers") public void TestNgLearn1(int param1, int param2) { System.out.println("this is TestNG test case1, and param1 is:"+param1+"; param2 is:"+param2); Assert.assertFalse(false); } @Test(dependsOnMethods= {"TestNgLearn1"}) public void TestNgLearn2() { System.out.println("this is TestNG test case2"); } }
運(yùn)行此class,結(jié)果為:
this is TestNG test case1, and param1 is:10; param2 is:20
this is TestNG test case1, and param1 is:100; param2 is:110
this is TestNG test case1, and param1 is:200; param2 is:210
this is TestNG test case2
PASSED: TestNgLearn1(10, 20)
PASSED: TestNgLearn1(100, 110)
PASSED: TestNgLearn1(200, 210)
PASSED: TestNgLearn2
十三、XML配置文件說明
前面講的大多都是以測(cè)試腳本為基礎(chǔ)來運(yùn)行的,少部分是以xml運(yùn)行,這里以xml來講解下:
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <suite name="SuiteName" verbose="1" >
如下分別講解各個(gè)標(biāo)簽:
1、suite標(biāo)簽
testNG.xml文件的最外層標(biāo)簽即suite
,即測(cè)試套件,其下可以有多個(gè)<test>
和<groups>
,其有幾個(gè)可以添加的屬性在第十節(jié)的分suite測(cè)試中有做說明,這里做下詳細(xì)說明:
(1)、name屬性
此屬性屬于必須要有的,值可以自行設(shè)定,此名字會(huì)在testNG的報(bào)告中看到;
(2)、verbose屬性
此屬性為指定testNG報(bào)告的詳細(xì)程度,從0開始到10,其中10為最詳細(xì),默認(rèn)生成的xml此屬性值為1;
(3)、parallel屬性
此屬性是指代運(yùn)行方式,默認(rèn)為none,即串行運(yùn)行方式;并行執(zhí)行方法包括如下幾種,下面做分別說明:
methods:方法層級(jí),若為此值,則該suite下所有的測(cè)試方法都將進(jìn)行多線程,即測(cè)試用例級(jí)別的多線程。如果用例之間有依賴,則執(zhí)行順序會(huì)按照設(shè)定的依賴來運(yùn)行;
<suite name="My suite" parallel="methods" thread-count="5">
tests:TestNG將在同一線程中運(yùn)行相同的<Test>
標(biāo)簽中的所有方法,每個(gè)<test>
標(biāo)簽都將處于一個(gè)單獨(dú)的線程中,這允許您將不是線程安全的所有類分組在同一個(gè)<test>
中,并保證它們都將在同一個(gè)線程中運(yùn)行,同時(shí)利用TestNG使用盡可能多的線程運(yùn)行測(cè)試。
<suite name="My suite" parallel="tests" thread-count="5">
classes:類級(jí)別并發(fā),即TestNG會(huì)將該suite下每個(gè)class都將在單獨(dú)的線程中運(yùn)行,同一個(gè)class下的所有用例都將在同一個(gè)線程中運(yùn)行;
<suite name="My suite" parallel="classes" thread-count="5">
instances:實(shí)例級(jí)別,即TestNG將在同一線程中運(yùn)行同一實(shí)例中的所有方法,兩個(gè)不同實(shí)例上的兩個(gè)方法將在不同的線程中運(yùn)行。
<suite name="My suite" parallel="instances" thread-count="5">
(4)、thread-count屬性
此屬性用于指定線程數(shù),按照需要輸入,需要parallel
參數(shù)非none時(shí)才可以添加;
(5)、annotations屬性
此項(xiàng)為注解的級(jí)別,為methods級(jí)別和class級(jí)別,一般不用設(shè)置;
(6)、time-out屬性
此屬性用于指定超時(shí)時(shí)間,該suite下所有的用例的超時(shí)時(shí)間;
(7)、group-by-instances屬性
此項(xiàng)用于那些有依賴的方法,且被依賴的對(duì)象有多個(gè)重載對(duì)象,因?yàn)槿绻且蕾嚪椒?,且該方法有多個(gè)重載方法,則默認(rèn)是會(huì)將所有重載方法都跑完再運(yùn)行被依賴方法,但有時(shí)候我們不想這樣,則將此項(xiàng)設(shè)置為true即可;
(8)、preserve-order屬性
值可輸入true或者false,如果為true,則用例執(zhí)行會(huì)按照在xml中的順序執(zhí)行,否則會(huì)亂序執(zhí)行,不添加此屬性的話默認(rèn)是按順序執(zhí)行的;
2、test標(biāo)簽
此標(biāo)簽無特別意義,其下可以包括多個(gè)標(biāo)簽,如groups
、classes
等,如下介紹下幾種書寫方式:
選擇一個(gè)包中的全部測(cè)試腳本(包含子包)
<test name = "allTestsInAPackage" > <packages> <package name = "whole.path.to.package.* /> </packages> </test>
選擇一個(gè)類中的全部測(cè)試腳本
<test name = "allTestsInAClass" > <classes> <class name="whole.path.to.package.className /> </classes> </test>
選擇一個(gè)類中的部分測(cè)試腳本
<test name = "aFewTestsFromAClass" > <classes> <class name="whole.path.to.package.className > <methods> <include name = "firstMethod" /> <include name = "secondMethod" /> <include name = "thirdMethod" /> </methods> </class> </classes> </test>
選擇一個(gè)包中的某些組
<test name = "includedGroupsInAPackage" > <groups> <run> <include name = "includedGroup" /> </run> </groups> <packages> <package name = "whole.path.to.package.* /> </packages> </test>
排除一個(gè)包中的某些組
<test name = "excludedGroupsInAPackage" > <groups> <run> <exclude name = "excludedGroup" /> </run> </groups> <packages> <package name = "whole.path.to.package.* /> </packages> </test>
其可以附帶的屬性有如下幾種,下面對(duì)各個(gè)屬性做單獨(dú)說明:
(1)、name屬性
此屬性屬于必須要有的,值可以自行設(shè)定,此名字會(huì)在testNG的報(bào)告中看到;
(2)、verbose屬性
此屬性為指定testNG報(bào)告的詳細(xì)程度,從0開始到10,其中10為最詳細(xì),默認(rèn)生成的xml此屬性值為1
(3)、threadPoolSize屬性
該屬性指定此test的線程池大小,為數(shù)字;
@Test(threadPoolSize = 3, invocationCount = 10, timeOut = 10000) public void testServer() { }
(4)、invocationCount屬性
該屬性指定此test的運(yùn)行次數(shù),為數(shù)字,范例如上面的代碼所示;
(5)、time-out屬性
此屬性用于指定超時(shí)時(shí)間,該suite下所有的用例的超時(shí)時(shí)間,范例如上面的代碼所示;
(6)、group-by-instances屬性
此項(xiàng)用于那些有依賴的方法,且被依賴的對(duì)象有多個(gè)重載對(duì)象,因?yàn)槿绻且蕾嚪椒?,且該方法有多個(gè)重載方法,則默認(rèn)是會(huì)將所有重載方法都跑完再運(yùn)行被依賴方法,但有時(shí)候我們不想這樣,則將此項(xiàng)設(shè)置為true即可;
<suite name="Factory" group-by-instances="true">
(7)、preserve-order屬性
值可輸入true或者false,如果為true,則用例執(zhí)行會(huì)按照在xml中的順序執(zhí)行,否則會(huì)亂序執(zhí)行,不添加此屬性的話默認(rèn)是按順序執(zhí)行的;
3、group標(biāo)簽
此標(biāo)簽必然是在<test>
標(biāo)簽下的,用于標(biāo)識(shí)那些組會(huì)被用于測(cè)試或者被排除在測(cè)試之外,其同級(jí)必然要包含一個(gè)<classes>
標(biāo)簽或者<pakages>
標(biāo)簽,用于指定groups來自于哪些包或者類;
如下即為包含一個(gè)group,排除一個(gè)group的例子:
<groups> <run> <include name = "includedGroupName" /> <exclude name = "excludedGroupName" /> </run> </groups>
高級(jí)應(yīng)用:
<test name="Regression1"> <groups> <define name="functest"> <include name="windows"/> <include name="linux"/> </define> <define name="all"> <include name="functest"/> <include name="checkintest"/> </define> <run> <include name="all"/> </run> </groups> <classes> <class name="test.sample.Test1"/> </classes> </test>
4、其他
其他的話就是測(cè)試腳本的選擇了,有三種方式:
選擇一個(gè)包
<packages> <package name = "packageName" /> </packages>
選擇一個(gè)類
<classes> <class name = "className" /> </classes>
選擇一個(gè)方法
<classes> <class name = "className" /> <methods> <include name = "methodName" /> </methods> </class> </classes>
這里也支持正則表達(dá)式,例如:
<test name="Test1"> <classes> <class name="example1.Test1"> <methods> <include name=".*enabledTestMethod.*"/> <exclude name=".*brokenTestMethod.*"/> </methods> </class> </classes> </test>
十四、TestNG報(bào)告
默認(rèn)報(bào)告輸出位置為當(dāng)前工程的test-output文件夾下,包括xml格式和html格式。
如果想將報(bào)告輸出位置換個(gè)地方,則修改地方在如下圖所示位置:
如果想要美化報(bào)告,則按照如下步驟:
1、配置:Eclipse --> Window --> Preferences -->testng
2、勾選Disable default listeners
3、在Pre Defined Listeners 輸入框中輸入org.uncommons.reportng.HTMLReporter
記得在POM上添加如下代碼:
<dependency> <groupId>org.uncommons</groupId> <artifactId>reportng</artifactId> <version>1.1.4</version> <scope>test</scope> <exclusions> <exclusion> <groupId>org.testng</groupId> <artifactId>testng</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.google.inject</groupId> <artifactId>guice</artifactId> <version>3.0</version> <scope>test</scope> </dependency>
不然無法運(yùn)行的。
如上圖所示,還可以自定義testng.xml的模板,并在上圖中指定。
到此這篇關(guān)于java中TestNG使用教程詳解的文章就介紹到這了,更多相關(guān)java TestNG使用 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring boot metrics監(jiān)控指標(biāo)使用教程
這篇文章主要為大家介紹了針對(duì)應(yīng)用監(jiān)控指標(biāo)暴露spring boot metrics監(jiān)控指標(biāo)的使用教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02EDI中JAVA通過FTP工具實(shí)現(xiàn)文件上傳下載實(shí)例
這篇文章主要介紹了EDI中JAVA通過FTP工具實(shí)現(xiàn)文件上傳下載實(shí)例,具有一定的參考價(jià)值,有需要的可以了解一下。2016-11-11Springboot視圖解析器ViewResolver使用實(shí)例
這篇文章主要介紹了Springboot視圖解析器ViewResolver使用實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04Java后臺(tái)防止客戶端重復(fù)請(qǐng)求、提交表單實(shí)現(xiàn)原理
這篇文章主要介紹了Java后臺(tái)防止客戶端重復(fù)請(qǐng)求、提交表單實(shí)現(xiàn)原理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12java對(duì)象中什么時(shí)候適合用static修飾符踩坑解決記錄
這篇文章主要為大家介紹了java對(duì)象中什么時(shí)候適合用static修飾符踩坑解決記錄,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09maven打包成第三方j(luò)ar包且把pom依賴包打入進(jìn)來的方法
這篇文章主要介紹了maven打包成第三方j(luò)ar包且把pom依賴包打入進(jìn)來的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-11-11