您當前的位置:首頁 > 繪畫

Junit5 + YAML 輕鬆實現引數化和資料驅動,讓 App 自動化測試更高效(一)

作者:由 測吧 發表于 繪畫時間:2022-05-11

本文為霍格沃茲測試學院優秀學員課程學習筆記。

1. 何為資料驅動

什麼是引數化?什麼又是資料驅動?經常有人會搞不明白他們的關係,淺談一下個人的理解,先來看兩個測試中最常見的場景:

登入:不同的使用者名稱,不同的密碼,不同的組合都需要做登入場景的測試,正常的排列組合下可能會產生多個用例

搜尋:不同的搜尋條件產生不同的搜尋結果,搜尋也是常見的測試項,單個搜尋引數或者多種搜尋引數的組合;同樣也會產生多個用例。

以上兩種場景都有一個共同點,就是測試的執行步驟不變,變的只是輸入的測試資料,那麼引出兩個概念——引數化和資料驅動

引數化:我們在寫自動化用例的時候會有很多方法,一般我們都會把資料透過引數來傳遞給方法,而不會直接在方法中寫“死”,所以方法之間的資料傳遞都是透過引數化來進行,利用引數化進行資料與變數的對應;比如我們的登入賬號密碼設定在引數中,再將引數傳遞到方法中。

public MainPage login(String username, String password) {

sendKeys(inputUsername,username);

sendKeys(inputPassword,password);

click(loginBtn);

return new MainPage();

}

資料驅動

:將引數化中的資料來源變成從外部讀取,引數有一個存放資料的地方,在用例執行的時候去去資料;這個資料儲存的地方可以是我們定義的陣列、hashmap,也可以是從外部檔案中(excel、csv、xml、yaml等)讀取。

例如上述的搜尋案例,我們可以將搜尋條件放入外部檔案中,每次執行搜尋用例時,去檔案中獲取資料,根據獲取到的資料執行不同的搜尋測試即可。

-

- 洗衣液

-

- 帽子

-

- 手套

總結下來

資料驅動

為自動化測試框架的一種設計思想,而引數化是實現資料驅動的一種手段,我們利用引數化來完成資料驅動,從而將資料與指令碼分離,增加了框架的可維護性和指令碼的複用性。

2. 為什麼要做資料驅動

2。1 測試資料

在執行測試工作過程中,有很多過程是需要動態變化的,如果每一次的變化都需要編碼部署,那麼整個執行的流程就會邊長;

對於業務測試工程師來說,維護自動化程式碼有一定的門檻,需要熟悉程式語言和測試框架的結構;

定義好了資料驅動,將變化的資料放入配置檔案中進行維護,既便捷(無需找到對應程式碼修改部署),也降低了維護的門檻(業務測試只需要在配置檔案中修改資料即可)

2。2 測試步驟

與測試資料的資料驅動大致相同,主要也是方便業務測試維護,降低維護門檻和程式碼修改部署出錯的風險;修改配置檔案,整個業務行為和抽象是不用改變的,當然,在UI自動化中配合PO一起使用會“風味更佳”。

2。3 動態生成測試步驟

手工錄製測試步驟,直接生成程式碼比較困難,可以生成步驟的配置檔案,讓程式碼去讀配置檔案,完成自動化的回放;(此方面本人暫時僅瞭解過,還未實踐落地,理論上是可以實現的。)

3. 在哪裡做資料驅動

3。1 不要在哪裡做資料驅動

不要在測試用例內完成大量的資料驅動:

用例透過PO的呼叫是能夠非常清晰展現出業務執行場景的,業務才是用例的核心;一旦在用例裡使用了大量資料驅動,如呼叫各種yaml、csv等資料檔案,會造成用例可讀性變差,維護複雜度變高;

3。2 可以在哪裡做資料驅動

1。 測試資料的資料驅動

2。 測試步驟的資料驅動

定位符

行為流

3。 斷言的資料驅動

4. 如何做資料驅動

4。1 資料格式的選擇

我們要將資料存入檔案中,不同的檔案有著不同的資料格式,那麼作何選擇呢?

不同資料格式檔案的對比

Junit5 + YAML 輕鬆實現引數化和資料驅動,讓 App 自動化測試更高效(一)

從上述對比結果中,Json 和 YAML 對於資料結構的支援和書寫程度是較好的;但是, YAML 的寫法更簡潔,並且還可以註釋,因此最推薦使用的就是(從表格中的所處都位置也可猜到~)…位於C位的

YAML

那麼到底什麼是

YAML

,又如何使用,下面簡單來了解一下

4。2 YAML 檔案的使用

yaml 的語法

大小寫敏感

使用縮排表示層級關係

縮排時不允許使用Tab鍵,只允許使用空格。

縮排的空格數目不重要,只要相同層級的元素左側對齊即可

#

表示註釋

yaml 支援的三種資料結構

純量(scalars):單個的、不可再分的值,例如數字、字串、布林值等

物件:鍵值對的集合,又稱為對映(mapping)/ 雜湊(hashes) / 字典(dictionary)

#鍵值對形式

key: value

#行內物件

person: { name: allen, age: 25 }

陣列:一組按次序排列的值,又稱為序列(sequence) / 列表(list)

#以-開頭表示為一個數組裡的值

- A

- B

- C

#陣列內巢狀子陣列,用一個空格縮排表示

-

- a

- aa

-

- b

- bb

物件和陣列可以結合使用,形成複合結構

languages:

- Ruby

- Perl

- Python

websites:

YAML: yaml。org

Ruby: ruby-lang。org

Python: python。org

Perl: use。perl。org

4。3 資料讀取-jackson

既然有了資料儲存的地方,那麼就要對資料進行讀取,這裡就要介紹另一位幫手,Java的jackson庫

jackson

是Java的一個庫,用的最多的是

jackson-databind

jackson-dataformats-text

,分別用來處理

json

yaml

資料格式,它可以將檔案中的資料和Java中的物件建立一種對映關係,

把一個檔案資料透過型別建立關聯,並創建出一個類的例項,反之也可以把一個物件寫入檔案中。

4。3。1 jackson-databind

先來看

jackson-databind

json

檔案的操作

新增 maven 依賴

com。fasterxml。jackson。core

jackson-databind

2。9。9。3

寫 json 檔案

1)先建立一個類,包含變數name,age

public class TestFileSource {

public String name;

public int age;

}

2)建立單元測試,建立

ObjectMapper

物件,呼叫

writeValue

json

檔案進行寫操作

@Test

void writeJson() throws IOException {

ObjectMapper mapper = new ObjectMapper();

TestFileSource testFileSource = new TestFileSource();

mapper。writeValue(new File(“。。\\demo。json”),testFileSource);

}

3)得到

demo。json

檔案的結果,從結果可以看到

TestFileSource

類中的變數已經被寫入的

json

檔案中

{“name”:null,“age”:0}

讀 json 檔案

1)建立單元測試,建立

ObjectMapper

物件,呼叫

readValue

方法對

json

檔案進行資料讀取

@Test

void readJson() throws IOException {

ObjectMapper mapper = new ObjectMapper();

TestFileSource testFileSource = mapper。readValue(TestFileSource。class。getResourceAsStream(“/demo。json”), TestFileSource。class);

System。out。println(testFileSource);

System。out。println(testFileSource。age);

}

2)讀取結果

ApiDemos。testcase。TestFileSource@4562e04d

0

輸出漂亮的

json

格式

1)建立單元測試,建立

ObjectMapper

物件,呼叫

writerWithDefaultPrettyPrinter()。writeValueAsString

方法可對指定物件進行

json

資料格式的輸出

@Test

void prettyPrintJson() throws JsonProcessingException {

ObjectMapper mapper = new ObjectMapper();

// pretty print

String json = mapper。writerWithDefaultPrettyPrinter()。writeValueAsString(new TestFileSource());

System。out。println(json);

}

2)列印結果

{

“name” : null,

“age” : 0

}

參考連結

jackson-databind

GitHub地址:

https://

github。com/FasterXML/ja

ckson-databind

4。3。2 jackson-dataformats-text

再來看

jackson-dataformats-text

,這是一個可以對

YAML

CSV

Properties

XML

檔案進行操作的庫,也是目前最常用的,不過這裡我們只重點關注其對

YAML

檔案的操作

新增maven依賴

com。fasterxml。jackson。dataformat

jackson-dataformat-yaml

2。9。8

讀 YAML 檔案

想要讀取 YAML 檔案,最主要的是在

new ObjectMapper

物件的時候加入

new YAMLFactory()

,這樣就成功切換至 yaml 操作的狀態,然後利用

readValue

方法就可以完成對

yaml

檔案的資料讀取了

1)建立 YAML 檔案

name: allen

age: 11

2)建立

ObjectMapper

物件,設定

new YAMLFactory()

@Test

void readYaml() throws IOException {

ObjectMapper mapper = new ObjectMapper(new YAMLFactory());

TestFileSource testFileSource = mapper。readValue(TestFileSource。class。getResourceAsStream(“/demo2。yaml”), TestFileSource。class);

System。out。println(testFileSource);

System。out。println(testFileSource。age);

}

列印結果

ApiDemos。testcase。TestFileSource@ba2f4ec

11

readValue

的方法中可以看到,第一個引數填的是檔案地址,第二個引數就是精髓所在!我們可以給定一個物件型別,或者一個二維陣列等,用來產生對映關係,將檔案資料和我們的物件繫結,方便資料的讀取。

如上述例子中我們透過

TestFileSource

的例項化物件來呼叫

age

變數。

輸出漂亮的 YAML 格式

與json輸出的方式基本一致,只需要在

new ObjectMapper

物件的時候加入

new YAMLFactory()

即可

1)建立類和類的成員變數,包含純量、陣列和雜湊

public class TestFileSource {

public String name = “tester”;

public int age = 2;

public Object[][] arr= {{1,2,3,},{“a”,“b”,“c”}};

public HashMap map = new HashMap(){

{

put(“name”,“tester”);

put(“sex”,“男”);

}

};

}

2)建立單元測試,建立

ObjectMapper

物件,加入

new YAMLFactory()

引數,呼叫

writerWithDefaultPrettyPrinter()。writeValueAsString

方法可對指定物件進行

yaml

資料格式的輸出

@Test

void prettyPrintYaml() throws JsonProcessingException {

ObjectMapper mapper = new ObjectMapper(new YAMLFactory());

// pretty print

String json = mapper。writerWithDefaultPrettyPrinter()。writeValueAsString(new TestFileSource());

System。out。println(json);

}

3)列印結果

——-

name: “tester”

age: 2

arr:

- - 1

- 2

- 3

- - “a”

- “b”

- “c”

map:

sex: “男”

name: “tester”

--福利福利:

一線名企大廠內推通道 >>>

史上最全軟體測試資料文件下載 >>>

如何從一個只會點滑鼠的手工測試變成測試開發 >>>

更多技術乾貨請關注霍格沃茲測試學院官方機構號:

測吧@測吧

——推薦閱讀:

測試開發是什麼?為什麼現在那麼多公司都要招聘測試開發?

軟體測試的崗位會越來越少嗎?

軟體測試真的幹到35就幹不動了嗎?

二十五歲零基礎轉行做軟體測試怎麼樣?測吧:軟體測試如何獲得高薪?