1. 程式人生 > 其它 >Junit5 + YAML 輕鬆實現引數化和資料驅動,讓 App 自動化測試更高效(一)

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

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

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

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

public MainPage login(String username, String password) {
        sendKeys(inputUsername,username);
        sendKeys(inputPassword,password);
        click(loginBtn);
        return new MainPage();
}

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

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

-
 - 洗衣液
-
 - 帽子
-
 - 手套

總結下來:

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

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

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

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

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

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

  1. 測試資料的資料驅動
  2. 測試步驟的資料驅動
  • 定位符
  • 行為流
  1. 斷言的資料驅動
  • 不同資料格式檔案的對比

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

yaml 的語法

  • 大小寫敏感
  • 使用縮排表示層級關係
  • 縮排時不允許使用Tab鍵,只允許使用空格。
  • 縮排的空格數目不重要,只要相同層級的元素左側對齊即可
  • 表示註釋

yaml 支援的三種資料結構

  • 純量(scalars):單個的、不可再分的值,例如數字、字串、布林值等
  • 物件:鍵值對的集合,又稱為對映(mapping)/ 雜湊(hashes) / 字典(dictionary)
#鍵值對形式
key: value
#行內物件
person: { name: allen, age: 25 }

#以-開頭表示為一個數組裡的值
- 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

把一個檔案資料通過型別建立關聯,並創建出一個類的例項,反之也可以把一個物件寫入檔案中。
先來看jackson-databind對json檔案的操作
新增 maven 依賴

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.9.3</version>
</dependency>


  • 寫 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/jackson-databind

再來看jackson-dataformats-text,這是一個可以對YAML、CSV、Properties和XML檔案進行操作的庫,也是目前最常用的,不過這裡我們只重點關注其對YAML檔案的操作

  • 新增maven依賴
<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-yaml</artifactId>
    <version>2.9.8</version>
</dependency>

  • 讀 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<String,Object> map = new HashMap<String, Object>(){
        {
        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"

參考連結jackson-dataformats-text GitHub地址:
https://github.com/FasterXML/jackson-dataformats-text

同樣是做自動化測試,在測試高手和普通小白的世界裡,完全是不一樣的風景。

對於想系統進階提升測試開發技能的同學,推薦霍格沃茲測試學院出品的 《測試開發從入門到高階實戰》系統進階班課程。

4 個月由淺入深,強化集訓,測試大咖思寒領銜親授,通過 8+ 企業級專案實戰演練,帶你一站式掌握 BAT 測試開發工程師必備核心技能(對標阿里巴巴P6+,挑戰年薪50W+)!學員直推 BAT 名企測試經理,普遍漲薪 50%+!

閱讀

閱讀

閱讀

原文連結

⬇️ 點選“下方連結”,提升測試核心競爭力!https://qrcode.ceba.ceshiren.com/link?name=article&project_id=qrcode&from=bokeyuan&timestamp=1650529085

>>更多技術文章分享和免費資料領取