1. 程式人生 > >Java自動化測試框架-07 - TestNG之Factory篇 - 歡快暢遊夢幻工廠(詳細教程)

Java自動化測試框架-07 - TestNG之Factory篇 - 歡快暢遊夢幻工廠(詳細教程)

簡介

  最近忙著裝修部落格園,沒時間更新文章,今天終於抽出時間把上次寫的一半的文章給寫完了,新的部落格園風格,希望大家喜歡。今天繼續介紹testng的相關知識--工廠。

工廠允許你動態的建立測試。例如,假設你需要建立一個測試方法,並用它來多次訪問一個web頁面,而且每次都帶有不同的引數:

@Factory註解從字面意思上來講就是採用工廠的方法來建立測試資料並配合完成測試,其主要應對的場景是:對於某一個測試用例或方法,我們需要輸入多個測試資料進行測試,並且這些測試資料可以是有一定關係(可以通過程式碼控制),此時,我們就可以把自動化或者手動測試時的遇到的只因測試資料不同的多個測試用例合併成一個測試用例,來進行更方便和快捷的測試。

對編寫自己主動化測試程式碼人員節省了非常多時間

策略:一般我們會在標有@Factory註解的方法中對測試類進行呼叫,這時TestNg會自動呼叫測試類中帶有@Test註解的方法

配置檔案:只需要配置帶有@Factory註解的類即可

@Factory必須放在一個返回物件陣列的頂部,所有的這些物件都包含測試類的例項,testng會確保@Factory只被呼叫一次。

@Factory方法是首先被呼叫的,在@Test方法和配置方法之前,只有當所有的@Factory方法被呼叫之後,testng才開始執行配置和測試方法。

@Factory允許在執行時動態測試。

 上邊說了這麼多是不是把大家說的雲裡霧裡,暈頭轉向的,接下來通過具體的例子給小夥伴和同學們分享一下。

例項

為什麼要使用@Factory註解呢,先來看下面這個例子

被測試類Person:

 參考程式碼:

package hongge;
/**
 * @author 北京-巨集哥
 * 
 * Java自動化測試框架-07 - TestNG之Factory篇
 *
 * 2019年11月6日
 */
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

public class Person {
    String name;
    int age;
    
    @Parameters({"name","age"})
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    @Test()
    public void say() {
        System.out.print("我是"+name+" ");
        if(age<18){
            System.out.println("我未成年");
        }else if(age>=18&&age<=45){
            System.out.println("我是青年人");
        }else if(age>45&&age<=60){
            System.out.println("我是中年人");
        }else if(age>60){
            System.out.println("我是老年人");
        }
    }
}

該類的say()方法中有四個判斷分支,為了測試充分,必須執行四次這個方法,如果不使用@Factory註解,在TestNG配置檔案中必須這樣配置:

TestNG配置檔案

 參考程式碼

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
  <test name="Test1">
        <parameter name="name" value="小明" />
        <parameter name="age" value="10" />
        <classes>
            <class name="hongge.Person" />
        </classes>
    </test>
    <test name="Test2">
        <parameter name="name" value="巨集哥" />
        <parameter name="age" value="20" />
        <classes>
            <class name="hongge.Person" />
        </classes>
    </test>
    <test name="Test3">
        <parameter name="name" value="劉創" />
        <parameter name="age" value="50" />
        <classes>
            <class name="hongge.Person" />
        </classes>
    </test>
    <test name="Test4">
        <parameter name="name" value="爺爺" />
        <parameter name="age" value="70" />
        <classes>
            <class name="hongge.Person" />
        </classes>
    </test><!-- Test -->
</suite> <!-- Suite -->

從上邊我們可以清楚地看出來:引數一旦多起來,就難以管理了,所以應該使用工廠來做

工廠

Factory註解

如果使用@Factory註解,就比較簡單,而且方便擴充套件,示例如下。

不需改動原有類,新增一個新類PersonFactory

新類PersonFactory

 參考程式碼

package hongge;

import java.util.ArrayList;

import org.testng.annotations.Factory;

/**
 * @author 北京-巨集哥
 * 
 * Java自動化測試框架-07 - TestNG之Factory篇
 *
 * 2019年11月6日
 */
public class PersonFactory {
    @Factory
    public Object[] factory() {
        ArrayList<Person> testList = new ArrayList<>();
        Person tp = new Person("明明",10);
        testList.add(tp);
        Person tp2 = new Person("巨集哥",20);
        testList.add(tp2);
        Person tp3 = new Person("劉創",50);
        testList.add(tp3);
        Person tp4 = new Person("朱爺爺",70);
        testList.add(tp4);
        return testList.toArray();
    }
}

執行時,可以在Eclipse中,在這個factory類(PersonFactory)上點選右鍵,Run As-> TestNg test執行,

也可以配置在testng.xml中,只需要配置factory類即可,原類不用管。

testng.xml

參考程式碼

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
  <test name="Test1">
        <classes>
            <class name="hongge.PersonFactory" />
        </classes>
    </test><!-- Test -->
</suite> <!-- Suite -->

執行結果

你的testng.xml 只需要引用包含工廠方法的類,而測試例項自己會在執行時建立:

<class name="WebTestFactory"/>

工廠方法可以接受諸如 @Test 和 @Before/After 所標記的引數,並且會返回 Object[]。這些返回的物件可以是任何類(不一定是跟工廠方法相同的類),並且他們甚至都不需要TestNG註解(在例子中會被TestNG忽略掉)

使用@Factory的執行原理

1、如果不使用@Factory,執行普通的被@Test標註的方法時,實際上是TestNG框架呼叫了該類的建構函式構造出一個物件,然後再執行物件的這個方法。

2、使用了@Factory後,可以看到被@Factory標註的方法返回了一個Object陣列,陣列中每一個元素是一個被測試類的物件。也就是說@Factory構造了多個被測試類物件,然後把每一個物件都傳遞給了TestNG框架,然後TestNG框架在分別執行這些物件中被@Test標註的方法。
通過上面的描述,我們就知道了@Factory可以幫助我們實現簡單的資料驅動測試(根據測試資料,執行對應的程式)。

小結

  好了,今天關於工廠的知識就分享這麼