軟體測試丨基於Junit4,用xUnit框架讓測試用例可維護性大幅提升

測試人666 發佈 2022-12-14T09:10:47.852050+00:00

xUnit是一系列測試框架的統稱,最開始來源於一個叫做Smalltalk的SUnit框架。現在各種面向對象的語言,如Java、Python的鼻祖就是Smalltalk,後來這些語言都藉助了Sunit框架的理念,有很多通用的規範和特徵,也就統稱為xUnit。

xUnit是一系列測試框架的統稱,最開始來源於一個叫做Smalltalk的SUnit框架。

現在各種面向對象的語言,如java、python的鼻祖就是Smalltalk,後來這些語言都藉助了Sunit框架的理念,有很多通用的規範和特徵,也就統稱為xUnit。

xUnit是什麼

xUnit之框架與體系

很多我們已知的單元測試框架,比如 python 的 UnitTest、PyTest 以及Java的JUnit、TestNG 他們通用體系結構統稱為「 xUnit」。

而xUnit的architecture(體系結構)通常都是由以下的結構組成: Test Runner :測試的運行器 Test Case :測試用例 Test Fixtures : 測試夾具/治具,用來管理測試用例的執行 Test Suites :測試套件,用來編排測試用例 Test Execution:測試執行,以何種順序執行 Test Result Formatter:測試結果,具備相同的格式,可被整合 Assertions:斷言

從Junit4開啟xUnit框架之旅

Why Junit4?

在目前的行業中,Junit4仍然是99%的研發工程師的首選框架,所以可以方便測試工程師與研發工程師交流(偷偷拉個關係~)。而且TestNG的使用多用於測試工程師。

Junit5還未大規模普及(但是從使用上面來說最推薦的框架,成熟、好用、研發測試通用),而很多框架依然基於Junit4定製,所以我們還無法從Junit4轉換到Junit5中。

測試用例之核心元素

一個測試用例到底應該有哪些核心的元素? 測試用例的名字:特性方法名 測試用例的描述與標籤:註解 測試用例的容器:類或者套件

  • 測試過程: 單元測試 Web自動化測試 Selenium App自動化測試 Appium 接口自動化測試 RestAssured
  • 測試斷言

基本demo的運行

1)創建maven工程XUnit,pom.xml中添加Junit依賴

2)src/test/java下創建測試類Junit4DemoTest 註:

測試類要以Test開頭或者結尾 maven auto-import src/main/java 存放應用實現代碼 src/test/java 存放單元測試 單元測試的原則之一:用例可以獨立運行

基本測試demo運行:

運行結果:

用例間的執行順序

Junit4的執行順序:

  • Default 取決於反射方法獲得的列表,順序固定(不保險)
  • @FixMethodOrder(MethodSorters.JVM) 順序可能變化
  • @FixMethodOrder(MethodSorters.NAME_ASCENDING) 按照名字ASCII順序(穩定常用,建議使用)

TestNG、Junit5的執行順序:

  • 可以通過註解設置順序Order

順序演示:

運行結果:

測試套件的執行順序支持

Junit4:

  • @BeforeClass、@AfterClass
  • @Before、@After

TestNG:

  • @BeforeClass
  • @BeforeMethod
  • BeforeGroup、@BeforeSuite

Junit5:

  • @BeforeClass
  • @BeforeEach

實操演示1:

在用例執行前後增加@Before和@After:

運行結果:

實操演示2:

再增加@BeforeClass和@AfterClass

運行結果:

App自動化測試用例管理

基類的@BeforeClass:

  • 配置讀取、配置Capability、初始化driver、安裝App,PageObject初始化

集成的子類執行流程:

  • @Before:啟動並進入特定界面
  • @Test:測試用例執行
  • @After:回退到入口
  • @BeforeClass:進圖特定的tab子功能頁面
  • @AfterClass:關閉app

基類的@AfterClass

  • driver.quit

繼承關係下的測試流程

流程順序:

  • 父類@BeforeClass
  • 子類@BeforeClass
  • 父類@Before
  • 子類@Before
  • 子類@Test
  • 父類@Test
  • 子類@After
  • 父類@After
  • 子類@AfterClass
  • 父類@AfterClass

實操演示1:

現在創建一個子類Junit4DemoChildrenTest,繼承Junit4DemoTest,然後實現和父類一樣的方法並運行子類:

運行結果:

從運行結果中我們可以看到,子類會將與父類中一樣的方法進行覆蓋,只執行子類中的方法

實操演示2:

現在將子類中的方法名進行修改,使其與父類方法名不同,再運行子類:

運行結果:

如何使用測試套件

測試套件有如下三種類型

  • RunWith
  • SuiteClasses
  • class

實操演示:

新建一個子類Junit4DemoChildren2Test,繼承Junit4DemoTest

再建一個測試類SuitesTest,寫上註解@RunWith(Suite.class),表明這是一個測試套件,是多個測試類的一個集合,一個容器;

然後利用註解@Suite.SuiteClasses來設置測試類集合,設置測試類執行的順序

運行結果:

由測試結果可以看到使用套件後,測試過程為Junit4DemoChildren2Test、Junit4DemoTest、Junit4DemoChildrenTest的順序執行。

關鍵字: