寫(xiě)作背景:有點(diǎn)Java基礎(chǔ)的功能測(cè)試人員(點(diǎn)點(diǎn)點(diǎn)工程師),所在項(xiàng)目有"去QE"的趨勢(shì),所以自己要多點(diǎn)亮其他技能,讓路子走寬點(diǎn)。
簡(jiǎn)單說(shuō)一下去QE:項(xiàng)目測(cè)試不再有專(zhuān)職的測(cè)試工程師來(lái)做,而是由開(kāi)發(fā)工程師自己來(lái)進(jìn)行。遵循“誰(shuí)開(kāi)發(fā)、誰(shuí)測(cè)試、誰(shuí)上線、誰(shuí)On call”的原則。
一、Java、TestNG、JSONAssert都是什么
1.1、Java基礎(chǔ)教程
我先復(fù)習(xí)Java的基本簡(jiǎn)介、語(yǔ)法、寫(xiě)法、使用。參考資料
- 安裝java 開(kāi)發(fā)工具包:JDK8 或更高版本
- 配置環(huán)境變量
- 安裝java開(kāi)發(fā)工具:IDEA
- Java基本語(yǔ)法:對(duì)象、類(lèi)、實(shí)例、方法、實(shí)例變量、標(biāo)識(shí)符【類(lèi)名| 變量名| 方法名】、修飾符【用于修飾類(lèi)中方法和屬性】、變量【局部變量| 類(lèi)變量/靜態(tài)變量| 成員變量/非靜態(tài)變量】、數(shù)組、枚舉、關(guān)鍵字、注釋、空行、繼承、接口。
- Java命名規(guī)范:大小寫(xiě)敏感、類(lèi)名首字母大寫(xiě)的駝峰式、方法名首字母小寫(xiě)的駝峰式、源文件名必須和類(lèi)名相同
- Java基本概念:多態(tài)、集成、封裝、抽象、類(lèi)、對(duì)象、實(shí)例、方法、重載等等
- Java基本類(lèi)型(八種):byte、short、int、long、float、double、boolean、char
- Java的運(yùn)算符、循環(huán)結(jié)構(gòu)、條件語(yǔ)句、switch case、Number & Math 類(lèi)、Character 類(lèi)、String 類(lèi)、StringBuffer 和 StringBuilder 類(lèi)、數(shù)組、日期時(shí)間、正則表達(dá)式、方法、流(Stream)、文件(File)和IO、Scanner 類(lèi)、異常處理等等
- Java的數(shù)據(jù)結(jié)構(gòu)、集合框架、ArrayList、LinkedList、HashSet、HashMap、Iterator(迭代器)、Object 類(lèi)、泛型、序列化等等
- Java的網(wǎng)絡(luò)編程、發(fā)送郵件 、多線程編程 、Applet 基礎(chǔ)、文檔注釋、實(shí)例等等
1.2、TestNG
- TestNG基本解釋?zhuān)海碩esting,Next Generation,即下一代測(cè)試技術(shù))是Java中的一個(gè)開(kāi)源自動(dòng)化測(cè)試框架。它的靈感來(lái)源于JUnit。它的目的是優(yōu)于JUnit,尤其是在用于測(cè)試集成多類(lèi)時(shí)。它借鑒了Java的注解。它旨在涵蓋所有類(lèi)別的測(cè)試:?jiǎn)卧?,功能,端到端,集成等?br> 詳細(xì)使用說(shuō)明請(qǐng)參考:TestNG官方鏈接。
- TestNG基本特點(diǎn):【注解】、【使用Java面向?qū)ο蟮墓δ堋?、【支持綜合類(lèi)測(cè)試】、【獨(dú)立的編譯時(shí)代碼自檢審核和運(yùn)行時(shí)配置/數(shù)據(jù)信息】、【支持編譯測(cè)試不同優(yōu)先級(jí)、不同類(lèi)別的用例】、【靈活的插件API】、【支持多線程測(cè)試】等
- 使用注解的好處:
a、TestNG通過(guò)查找注釋/注解來(lái)識(shí)別它感興趣的方法。 因此,方法名稱(chēng)不限于任何模式或格式
b、可以將其他參數(shù)傳遞給注釋。
c、注釋是強(qiáng)類(lèi)型的,所以編譯器會(huì)馬上標(biāo)記任何錯(cuò)誤。
d、測(cè)試類(lèi)不再需要擴(kuò)展任何東西(如TestCase,對(duì)于JUnit3)。
1.3、TestNG支持的注釋列表:
| 注解 | 描述 |
|---|---|
? ? ? ? ? ? @BeforeSuite? ? ? ?? ?? ? |
在該套件的所有測(cè)試都運(yùn)行在注釋的方法之前,僅運(yùn)行一次。 |
@AfterSuite |
在該套件的所有測(cè)試都運(yùn)行在注釋方法之后,僅運(yùn)行一次。 |
@BeforeClass |
在調(diào)用當(dāng)前類(lèi)的第一個(gè)測(cè)試方法之前運(yùn)行,注釋方法僅運(yùn)行一次。 |
@AfterClass |
在調(diào)用當(dāng)前類(lèi)的第一個(gè)測(cè)試方法之后運(yùn)行,注釋方法僅運(yùn)行一次 |
@BeforeTest |
注釋的方法將在屬于<test>標(biāo)簽內(nèi)的類(lèi)的所有測(cè)試方法運(yùn)行之前運(yùn)行。 |
@AfterTest |
注釋的方法將在屬于<test>標(biāo)簽內(nèi)的類(lè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)記一種方法來(lái)提供測(cè)試方法的數(shù)據(jù)。注釋方法必須返回一個(gè)Object [] [],其中每個(gè)Object []可以被分配給測(cè)試方法的參數(shù)列表。 要從該DataProvider接收數(shù)據(jù)的@Test方法需要使用與此注釋名稱(chēng)相等的dataProvider名稱(chēng)。 |
@Factory |
將一個(gè)方法標(biāo)記為工廠,返回TestNG將被用作測(cè)試類(lèi)的對(duì)象。 該方法必須返回Object []。 |
@Listeners |
定義測(cè)試類(lèi)上的監(jiān)聽(tīng)器。 |
@Parameters |
描述如何將參數(shù)傳遞給 @Test 方法。 |
@Test |
將類(lèi)或方法標(biāo)記為測(cè)試的一部分。 |
1.4、JSONAssert
- 將字符串轉(zhuǎn)換為JSON對(duì)象,并將邏輯結(jié)構(gòu)和數(shù)據(jù)與實(shí)際JSON進(jìn)行比較。一個(gè)專(zhuān)注于理解 JSON 數(shù)據(jù)并使用該數(shù)據(jù)編寫(xiě)復(fù)雜 JUnit 測(cè)試的庫(kù)。
- 當(dāng)strict(嚴(yán)格模式)設(shè)置為false(推薦設(shè)置)時(shí),它會(huì)允許數(shù)據(jù)重排序以及結(jié)果可擴(kuò)展(只要對(duì)比的JSON包含了所有預(yù)期JSON的所有字段),從而使測(cè)試不那么脆弱。建議關(guān)掉嚴(yán)格模式,除非你要求比較的JSON與預(yù)期的JSON中數(shù)組順序相同,或者要求兩者具有相同的字段。
/**
* Asserts that the JSONObject provided matches the expected string. If it isn't it throws an
* {@link AssertionError}.
*
* @param expectedStr Expected JSON string
* @param actual JSONObject to compare
* @param strict Enables strict checking
* @throws JSONException JSON parsing error
*/
public static void assertEquals(String expectedStr, JSONObject actual, boolean strict)
throws JSONException {
assertEquals(expectedStr, actual, strict ? JSONCompareMode.STRICT : JSONCompareMode.LENIENT);
}
二、搭建框架(創(chuàng)建maven項(xiàng)目,配置testng依賴(lài))
2.1、創(chuàng)建普通maven項(xiàng)目即可

2.2、在pom.xml中配置依賴(lài)
<dependencies>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>${testng.version}</version>
</dependency>
</dependencies>

2.3、下載依賴(lài)(pom文件重新加載項(xiàng)目)

三、創(chuàng)建Demo測(cè)試類(lèi)和方法
直接復(fù)制官網(wǎng)中的simple:

package com.demo.apitest.testcase;
import org.testng.annotations.*;
public class DemoTest {
@BeforeClass
public void setUp() {
// code that will be invoked when this test is instantiated
}
@Test(groups = {"fast"})
public void aFastTest() {
System.out.println("Fast test");
}
@Test(groups = {"slow"})
public void aSlowTest() {
System.out.println("Slow test");
}
}
四、兩種方式運(yùn)行(直接運(yùn)行、xml方式運(yùn)行)
4.1、直接運(yùn)行

直接運(yùn)行
4.2、xml方式運(yùn)行
IDEA創(chuàng)建的項(xiàng)目默認(rèn)不會(huì)生成testng.xml(用于控制測(cè)試執(zhí)行的執(zhí)行)文件,就需要在根目錄手動(dòng)創(chuàng)建該文件,同時(shí)需要在pom.xml文件中關(guān)聯(lián)設(shè)置testng.xml。testng.xml寫(xiě)法參考官網(wǎng):
官網(wǎng)中testng.xml
基本格式如下:
- 每一個(gè)xml文件只能有一個(gè)suite,代表的是一個(gè)測(cè)試集;
- 一個(gè)suite中可包含多個(gè)test,默認(rèn)情況下,多個(gè)test會(huì)順序執(zhí)行。若希望多個(gè)test以不可預(yù)知的順序運(yùn)行,可將preserve-order 屬性設(shè)置為false;
- 每一個(gè)test里邊可以寫(xiě)需要運(yùn)行的測(cè)試用例的class。如果不寫(xiě),默認(rèn)會(huì)跑所有的測(cè)試用例;
- 每個(gè)class可以指定要執(zhí)行哪些用例,不執(zhí)行哪些用例。如果不寫(xiě)method,則默認(rèn)本類(lèi)里的全部用例都執(zhí)行。

新建testng.xml

pom文件中關(guān)聯(lián)testng.xml

xml方式運(yùn)行
五、實(shí)際應(yīng)用中的常見(jiàn)用例寫(xiě)法
常見(jiàn)項(xiàng)目結(jié)構(gòu)
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com.demo.apitest # 框架公共服務(wù)模塊
│ │ │ └── annotations # 注釋
│ │ │ └── api # 后端接口定義
│ │ │ └── enums # 枚舉
│ │ │ └── model # Model
│ │ │ └── service # 公共方法
│ │ │ └── utils # 公共工具方法
│ │ └── resources
│ │ ├── driver # selenium的chrome驅(qū)動(dòng),用于本地登陸獲取cookie
│ │ └── application.yml # 配置文件
│ └── test
│ ├── java
│ │ ├── com.demo.apitest # 框架公共服務(wù)模塊
│ │ │ └── testcase # 接口測(cè)試腳本
│ │ └── MyBaseTestNg.java # testng基礎(chǔ)測(cè)試類(lèi),所有測(cè)試腳本的父類(lèi)
│ └── resources
│ └── testdata # 接口測(cè)試數(shù)據(jù)
└── testng.xml # testng測(cè)試套件配置
延伸下,在src.main.resources 目錄下可創(chuàng)建一個(gè) application .yml文件,用于配置公共參數(shù),普通類(lèi)型參數(shù)可使用 @value注解獲取,list類(lèi)型參數(shù)可使用@ConfigurationProperties注解獲取
六、擴(kuò)展:TestNG的常見(jiàn)測(cè)試場(chǎng)景
- 預(yù)期異常測(cè)試
- 忽略測(cè)試
- 超時(shí)測(cè)試
- 分組測(cè)試
- 套件測(cè)試(一起運(yùn)行多個(gè)測(cè)試類(lèi))
- 依賴(lài)測(cè)試
- 參數(shù)化測(cè)試
- 參數(shù)測(cè)試實(shí)例