IDEA,Java + Maven + TestNG編寫(xiě)接口自動(dòng)化測(cè)試用例腳本

寫(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注解獲取

\color{red}{//TODOLIST 待補(bǔ)充}


六、擴(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í)例
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容