1. 程式人生 > 其它 >TestNG學會了,Java單元測試你就掌握了一半

TestNG學會了,Java單元測試你就掌握了一半

每天進步一點點,關注我們哦,每天分享測試技術文章

本文章出自【碼同學軟體測試】

碼同學公眾號:自動化軟體測試,領取資料可加:Matongxue_8

碼同學抖音號:小碼哥聊軟體測試

 

01   TestNG

01   簡介

 

在日常測試工作中,經常需要用寫程式碼和指令碼來完成一些測試任務,比如自動化測試,介面測試,單元測試等。當寫完若干指令碼後,需要對這些指令碼進行組織、管理和結果統計,這個時候就需要有一個工具來負責這些事情,於是TestNG就出現了。

 

TestNG是Java體系中的一個測試框架,可以用於做單元測試、整合測試等。在TestNG之前,有一個類似的框架早就出現了,那就是Junit。TestNG借鑑了Junit的一些特點,然後增加了很多更強大的功能。成為Java體系裡使用最廣泛的測試框架。

 

需要注意的是,很多人理解TestNG是一個介面測試框架,其實並不是的,TestNG本身不能做介面測試,它主要用來管理你的介面測試。類似於Python裡的pytest框架。今天我們就來詳細介紹下TestNG的使用。

 

02   環境安裝

 

建立一個Maven工程,引入TestNG的依賴包

<dependency> 

   <groupId>org.testng</groupId>
   <artifactId>testng</artifactId>

   <version>6.8</version>

</dependency>

 

一個簡單的小例子

寫一個簡單的計算器類

//一個簡單的加減乘除計算器
public class Calculator {
    // 加法
    public int add(int a, int b){
        return a + b;
    }
    // 減法
    public int subtract(int a, int b){
        return a - b;
    }
    // 乘法
    public int multiply(int a, int b){
        return a * b;
    }
    // 除法
    public int divide(int a, int b){
        return a / b;
    }
}

 

接下來對這個計算器進行單元測試,建立一個測試類,並對加法運算編寫了一個測試方法

// 計算器測試類
public class CalculatorTest {
    // 加法測試
    @Test
    public void testAdd(){
        System.out.println("開始執行testAdd");
        Calculator calculator = new Calculator();
        int result = calculator.add(1, 1);
        Assert.assertEquals(2, result);
    }
    // 減法測試
    @Test
    public void testSubtract(){
        System.out.println("開始執行testSubtract");
        Calculator calculator = new Calculator();
        int result = calculator.subtract(2, 1);
        Assert.assertEquals(1, result);
    }
}

注意:

在上面程式碼中,testAdd方法上添加了一個@Test註解,這個是TestNG提供的一個註解(可以理解成一個標記),改註解標明此方法需要TestNG來執行,@Test註解也是最常使用的註解。

Assert是TestNG中的斷言類,assertEquals是最常用的一個方法,用於判斷期望值和實際值是否一致。如果一致,測試通過;如果不一致,測試不通過。

 

03   TestNG的執行

 

IntelliJ IDEA中內建了TestNG的支援,因此直接在方法名上右鍵,選擇"run testAdd"即可,並且會在控制檯上列印用例的執行結果。

 

 

 

控制檯列印,如果都顯示為綠色,就代表執行成功了

 

 

也可以在類上右鍵執行,TestNG中會執行整個類中所有帶@Test註解的測試方法

 

 

02    套件測試

01   套件定義

 

一個測試類裡會編寫若干個測試方法。如果某個場景需要執行多個測試類,就需要用到套件測試。套件是一組測試類的集合。在TestNG中,需要使用一個xml檔案來定義一個套件,套件裡可以包含1個或多個測試類。在xml中還可以很多靈活的配置,實現一些精細化的執行策略。

 

在Maven工程的resource目錄下建立一個testng.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="TestAll">  <!--執行整個類-->    <test name="calculator_all_class">
        <classes>
             <!-- 指定類名,可以新增多個-->            <class name="com.mtx.CalculatorTest"></class>
        </classes>
    </test>
    <!--僅執行某個方法-->    <test name="calculator_one_method">
        <classes>
            <class name="com.mtx.CalculatorTest">
                <methods>
                       <!--指定方法名,可以新增多個-->                    <include name="testAdd"></include>
                </methods>
            </class>
        </classes>
    </test>
</suite>

在xml中,一個test標籤就代表了一個執行用例,可以執行一個或多個類,或者指定一個或多個方法(見註釋)

 

02   套件執行

 

在xml上右鍵run即可執行整個套件,執行結果

 

 

 

免費領取 碼同學軟體測試 課程筆記+超多學習資料+完整視訊+最新面試題,可加:Matongxue_8/關注碼同學公眾號:自動化軟體測試

 

03   資料驅動

 

在很多測試用例中,對於同一套邏輯,需要使用大量不同的資料進行驗證,這個情況下可以使用TestNG的@DataProvider註解來提供資料,並驅動測試用例執行

 

在測試類中定義一個數據驅動方法,並新增@DataProvider註解

// 加法測試
@Test(dataProvider = "testAddData")
public void testAdd(int a, int b, int expect){
    System.out.println("開始執行testAdd");
    Calculator calculator = new Calculator();
    int result = calculator.add(a, b);
    Assert.assertEquals(expect, result);
}
// 提供了三組測試資料:{數字1, 數字2, 期望值}
// 因為返回型別的Object,所以陣列中也可以寫其他資料型別,String、int、char、float等
@DataProvider(name = "testAddData")
public Object[][] testAddData(){
    Object[][] data = new Object[][]{{1, 1, 2}, {2, 2, 4}, {3, 3, 5}};
    return data;
}

注意:

提供資料的providerData方法必須添加註解@DataProvider,並且執行name為testAddData。方法返回的資料型別必須為Object二維陣列

使用資料的testAdd方法上,必須制定對應的dataprovider name,並且方法上定義對應數量和型別的入參,用於接受資料

 

 

 

執行testAdd方法後,發現執行了三次,每次分別傳入不同的引數,第三組資料執行因為實際和預期不一致,執行結果為失敗

 

 

 

04   其他註解

 

除了@Test註解,還有一些其他的註解也經常使用,具體如下:

註解

描述

@BeforeSuite

在套件測試執行前執行,僅執行一次

@AfterSuite

在套件測試執行後執行,僅執行一次

@BeforeClass

在整個測試類執行前執行,僅執行一次

@AfterClass

在整個測試類執行後執行,僅執行一次

@BeforeTest

在@Test註解的方法執行前執行,每個@Test方法都執行一次

@AfterTest

在@Test註解的方法執行後執行,每個@Test方法都執行一次

@BeforeSuite
public void suiteInit(){
    System.out.println("套件執行前測試");
}
@AfterSuite
public void suiteEnd(){
    System.out.println("套件執行後測試");
}
@BeforeClass
public void classInit(){
    System.out.println("類執行前測試");
}
@AfterClass
public void classEnd(){
    System.out.println("類執行後測試");
}
@BeforeTest
public void testInit(){
    System.out.println("測試方法執行前測試");
}
@AfterTest
public void testEnd(){
    System.out.println("測試方法執行後測試");
}

執行結果:

 

 

 

05   命令列執行

 

除了在idea中執行TestNG測試方法外,另外一種更實用的執行方法是命令列執行,使用命令列執行更容易和其他外部工具進行整合,比如Jenkins。然而TestNG自身提供的命令列執行方式並不好用。比較簡單的方法是和Maven整合,實用maven的方式來呼叫TestNG。

 

在工程的pom檔案裡,新增外掛:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <testFailureIgnore>true</testFailureIgnore>
                <suiteXmlFiles>
                    <suiteXmlFile>src/main/resources/testng.xml</suiteXmlFile>
                </suiteXmlFiles>
            </configuration>
        </plugin>
    </plugins>
</build>

在suiteXmlFile標籤裡,指定testng.xml檔案的相對位置。

然後在cmd下,進入到工程的目錄下,執行命令:mvn test,可以看到,最終在控制檯裡打印出了測試結果

 

 

END

免費領取碼同學軟體測試課程筆記+超多學習資料+學習完整視訊,可加:Matongxue_8/關注碼同學公眾號:自動化軟體測試

本文著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。