配置好了 Maven 接下來就可以新建項(xiàng)目了,。
1 新建Maven項(xiàng)目
新建成功以后會(huì)有一個(gè)pom.xml文件
2 添加依賴
我們要寫TestNG框架,,所以要加入TestNG依賴。
所有依賴都可以在TestNG repository官網(wǎng)找到:https:///
搜索testng
第一個(gè)就是我們要找的,,點(diǎn)擊TestNG,,進(jìn)入詳情頁:
在這里可以選擇要使用的TestNG版本
我們這里使用7.5版本,點(diǎn)擊7.5
復(fù)制這段代碼,,將其粘貼到pom.xml
文件中
外層有一個(gè)標(biāo)簽,,以后將依賴直接添加到里面即可。
然后點(diǎn)一下右上角的同步按鈕,,7.5版本號不再顯示紅色,,就代表下載下來了
看一下項(xiàng)目結(jié)構(gòu)
其中java
一般存放封裝好的通用方法;resources
用于存放數(shù)據(jù)驅(qū)動(dòng)時(shí)的文件,,當(dāng)然你也可以自定義數(shù)據(jù)文件目錄,;test
則用于寫測試用例,。
3 寫代碼
在test->java下新建package:com.demo.test,然后新建一個(gè)類叫TestNGDemo1
注意,TestNG是不需要main方法的,,只要添加了注解即可以直接運(yùn)行,。
注解
@Test
我們在類方法中編寫用例代碼
選擇第一個(gè),會(huì)自動(dòng)導(dǎo)入包
package com.demo.testng;
import org.testng.annotations.Test;
public class TestNGDemo1 {
@Test
public void test01(){
System.out.println("This is test01");
}
@Test
public void test03(){
System.out.println("This is test03");
}
@Test
public void test02(){
System.out.println("This is test02");
}
}
這里我將test02
和test03
位置調(diào)整了一下,,目的是查看一下TestNG的執(zhí)行順序,,可以看到執(zhí)行結(jié)果:
仍然是按照01->02->03
的順序進(jìn)行執(zhí)行的。
@BeforeMethod與@AfterMethod
我們有時(shí)候會(huì)要求每個(gè)方法前和每個(gè)方法后
需要執(zhí)行一些操作,,我們就可以使用@BeforeMethod
和@AfterMethod
方法
可以看到,,@Before***
還有很多類似unittest和Pytest的執(zhí)行方式
package com.demo.testng;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
public class TestNGDemo1 {
@BeforeMethod
public void openBrowser(){
System.out.println("Open browser of @BeforeMethod");
}
@AfterMethod
public void closeBrowser(){
System.out.println("Close browser of @AfterMehtod");
}
@Test
public void test01(){
System.out.println("This is test01");
}
@Test
public void test03(){
System.out.println("This is test03");
}
@Test
public void test02(){
System.out.println("This is test02");
}
}
執(zhí)行代碼:
可以看到每個(gè)方法執(zhí)行前后都執(zhí)行了一次@BeforeMehtod和@AfterMethod。
@BeforeClass與@AfterClass
當(dāng)我們進(jìn)行Selenium
自動(dòng)化測試時(shí),,經(jīng)常會(huì)有打開瀏覽器
和關(guān)閉瀏覽器
的操作,,我們不會(huì)每個(gè)用例方法都執(zhí)行一次操作,而是在用例開始前和結(jié)束后整體執(zhí)行一次:
package com.demo.testng;
import org.testng.annotations.*;
public class TestNGDemo1 {
@BeforeClass
public void openBrowser(){
System.out.println("Open browser of @BeforeMethod");
}
@AfterClass
public void closeBrowser(){
System.out.println("Close browser of @AfterMehtod");
}
@Test
public void test01(){
System.out.println("This is test01");
}
@Test
public void test03(){
System.out.println("This is test03");
}
@Test
public void test02(){
System.out.println("This is test02");
}
}
執(zhí)行代碼:
@BeforeClass與@AfterClass是在每個(gè)類的執(zhí)行開始和結(jié)束執(zhí)行一次,。
方法名 | 解釋 |
---|
@BeforeSuite | 被注釋的方法在所有測試運(yùn)行前運(yùn)行 |
@AfterSuite | 被注釋的方法在所有測試運(yùn)行后運(yùn)行 |
@BeforeTest | 被注釋的方法在測試運(yùn)行前運(yùn)行 |
@AfterTest | 被注釋的方法在測試運(yùn)行后運(yùn)行 |
@BeforeClass | 被注釋的方法在當(dāng)前類的第一個(gè)測試方法調(diào)用前運(yùn)行 |
@AfterClass | 被注釋的方法在當(dāng)前類的所有測試方法調(diào)用后運(yùn)行 |
@BeforeMethod | 被注釋的方法在每一個(gè)測試方法調(diào)用前運(yùn)行 |
@AfterMethod | 被注釋的方法在每一個(gè)測試方法調(diào)用后運(yùn)行 |
整個(gè)流程的控制如圖:
@Test(enable=false)跳過用例
我們跳過test03用例,只需要在@Test注解中添加enable=false
package com.demo.testng;
import org.testng.annotations.*;
public class TestNGDemo1 {
@BeforeClass
public void openBrowser(){
System.out.println("Open browser of @BeforeMethod");
}
@AfterClass
public void closeBrowser(){
System.out.println("Close browser of @AfterMehtod");
}
@Test
public void test01(){
System.out.println("This is test01");
}
@Test(enabled = false)
public void test03(){
System.out.println("This is test03");
}
@Test
public void test02(){
System.out.println("This is test02");
}
}
執(zhí)行用例:
分組執(zhí)行
package com.demo.testng;
import org.testng.annotations.*;
public class TestNGDemo1 {
@BeforeClass
public void openBrowser(){
System.out.println("Open browser of @BeforeMethod");
}
@AfterClass
public void closeBrowser(){
System.out.println("Close browser of @AfterMehtod");
}
@Test(groups = {"groups01"})
public void test01(){
System.out.println("This is test01");
}
@Test(groups = {"groups02"})
public void test03(){
System.out.println("This is test03");
}
@Test(groups = {"groups01", "groups02"})
public void test02(){
System.out.println("This is test02");
}
}
但是如果以上方法直接執(zhí)行,,分組標(biāo)簽就不會(huì)生效,此時(shí)我們需要新建一個(gè)testng.xml
文件,。這個(gè)文件不需要我們手動(dòng)去寫,,可以直接去下載一個(gè)插件:File->Setting->Plugins
,搜索TestNG
下載
下載好以后在項(xiàng)目中右鍵就會(huì)出現(xiàn)生成testng.xml
文件的選項(xiàng),,這個(gè)一般在最下面
添加完成以后需要重新加載一下才會(huì)顯示出來
進(jìn)入文件后代碼都在一行,,只需要在選項(xiàng)Code->Reformat Code
格式化一下代碼:
然后添加分組執(zhí)行的代碼:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http:///testng-1.0.dtd">
<suite name="All Test Suite">
<test verbose="2" preserve-order="true" name="C:/Users/UC504933/Desktop/JavaCode/TestNGDemo">
<groups>
<run>
<include name="groups01" />
</run>
</groups>
<classes>
<class name="com.demo.testng.TestNGDemo1"></class>
</classes>
</test>
</suite>
在testng.xml
文件中執(zhí)行代碼
可以看到執(zhí)行結(jié)果:
如果要不執(zhí)行某個(gè)分組,則把
<include name="groups01" />
改為
<exclude name="groups01" />
即可,。
依賴控制
在@Test
注解中添加dependsOnMethods = {"test01"}
,。
package com.demo.testng;
import org.testng.Assert;
import org.testng.annotations.*;
public class TestNGDemo2 {
@BeforeClass
public void openBrowser(){
System.out.println("Open browser of @BeforeMethod");
}
@AfterClass
public void closeBrowser(){
System.out.println("Close browser of @AfterMehtod");
}
@Test
public void test01(){
System.out.println("This is test01");
Assert.assertEquals(1,3);
}
@Test(dependsOnMethods = {"test01"})
public void test02(){
System.out.println("This is test02");
}
@Test
public void test03(){
System.out.println("This is test03");
}
}
這里我把test01
添加了報(bào)錯(cuò)斷言,執(zhí)行時(shí)就可以看到用例跳過了test02
,。而且這里需要注意,,當(dāng)添加了dependsOnMehtods
以后執(zhí)行用例的順序變了?!救绻?yàn)證,,可以刪掉test01中的Assert語句】
可以看到由于test01
報(bào)錯(cuò),test02
被跳過了,。
testNG多線程
測試方法通過在@Test
注解中配置threadPoolSize
屬性進(jìn)入多線程模式,。參數(shù)解釋:
屬性 | 描述 |
---|
invocationCount | 執(zhí)行的次數(shù) |
threadPoolSize | 線程池內(nèi)線程的個(gè)數(shù) |
timeOut | 超時(shí)時(shí)間-毫秒 |
現(xiàn)在我們希望test02
執(zhí)行五次,而且用多線程以加快執(zhí)行效率,。為了看清,,我給線程號打印出來。
package com.demo.testng;
import org.testng.Assert;
import org.testng.annotations.*;
public class TestNGDemo2 {
@BeforeClass
public void openBrowser(){
System.out.println("Open browser of @BeforeMethod");
}
@AfterClass
public void closeBrowser(){
System.out.println("Close browser of @AfterMehtod");
}
@Test
public void test01(){
System.out.println("This is test01");
Assert.assertEquals(1,1);
}
@Test(threadPoolSize = 5, invocationCount = 5, timeOut = 5000)
public void test02(){
long id = Thread.currentThread().getId();
System.out.println("This is test02 --->"+"Thread id: "+id);
}
@Test
public void test03(){
System.out.println("This is test03");
}
}
執(zhí)行代碼:
數(shù)據(jù)驅(qū)動(dòng)dataProvider
package com.demo.testng;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class TestNGDemo3 {
@DataProvider(name = "data")
public Object[][] dataList(){
Object[][] object;
return object = new Object[][]{
{"Package One", 1},
{"Package Two", 2},
{"Package Three", 3}
};
}
@Test(dataProvider = "data")
public void identyData(String name, int num){
System.out.println("包名:"+ name + " 編號:"+num);
}
}
執(zhí)行代碼:
可以看到數(shù)據(jù)以三個(gè)用例的方式執(zhí)行了三次。
以上就是TestNG基礎(chǔ)方法了,。
如果您覺得對您有幫助,,請幫忙點(diǎn)一下公眾號底部的廣告,點(diǎn)一下就可以,,謝謝~