TestNG 中 BeforeTest 和 BeforeMethod 的區別
1. 概述
在 Java 中使用 TestNG 時,有效管理測試設定和拆卸對於建立乾淨、隔離和可維護的測試至關重要。兩個常用的註解@BeforeTest
和@BeforeMethod
透過在測試生命週期的不同階段運行設定程式碼來實現此目的。
了解這些註釋之間的差異並知道何時使用它們可以極大地提高我們測試案例的組織和效率。
在本教程中,我們將詳細探討這些註釋,檢查它們的不同之處,並討論每種註釋最合適的場景。
2.Maven依賴
在深入研究註解之前,讓我們確保已將TestNG新增為 Maven 專案的pom.xml
檔案中的依賴項:
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.10.2</version>
<scope>test</scope>
</dependency>
3.什麼是@BeforeTest
?
@BeforeTest
註解在我們的測試類別中使用@Test
的任何測試方法之前執行一次方法。
這非常適合設定共用資源,例如初始化應用程式上下文、操作物件或在同一類別中存在多個測試方法時設定資料庫連線。
讓我們來看一個例子。在建立測試類別之前,讓我們先建立一個名為Counter
類別:
public class Counter {
private int totalCount;
public Counter(int totalCount) {
this.totalCount = totalCount;
}
public int getTotalCount() {
return totalCount;
}
public void addCounter(int number) {
this.totalCount = totalCount + number;
}
public void subtractCounter(int number) {
this.totalCount = totalCount - number;
}
public void resetTotalCount() {
this.totalCount = 0;
}
}
讓我們建立第一個名為BeforeTestAnnotationTest
的測試類別:
public class BeforeTestAnnotationTest {
private static final Logger log = LoggerFactory.getLogger(BeforeTestAnnotationTest.class);
Counter counter;
@BeforeTest
public void init() {
log.info("Initializing ...");
counter = new Counter(0);
}
@Test
public void givenCounterInitialized_whenAddingValue_thenTotalCountIncreased() {
log.info("total counter before added: {}", counter.getTotalCount());
counter.addCounter(2);
log.info("total counter after added: {}", counter.getTotalCount());
}
@Test
public void givenCounterInitialized_whenSubtractingValue_thenTotalCountDecreased() {
log.info("total counter before subtracted: {}", counter.getTotalCount());
counter.subtractCounter(1);
log.info("total counter after subtracted: {}", counter.getTotalCount());
}
}
現在,讓我們運行BeforeTestAnnotationTest
:
Initializing ...
total counter before added: 0
total counter after added: 2
total counter before subtracted: 2
total counter after subtracted: 1
以下是範例中的註解和方法如何協同工作:
- 當
givenCounterInitialized_whenAddingValue_thenTotalCountIncreased()
運行時,它首先將totalCount
設為0
,由@BeforeTest
初始化。 - 當
givenCounterInitialized_whenSubtractingValue_thenTotalCountDecreased()
運行時,它使用先前測試留下的totalCount
值給givenCounterInitialized_whenAddingValue_thenTotalCountIncreased
()
,而不是重置為0
。這解釋了為什麼儘管@BeforeTest
將其初始設為0
,但沒有為givenCounterInitialized_whenSubtractingValue_thenTotalCountDecreased
()
重新初始化totalCount
。
4.什麼是@BeforeMethod
?
@BeforeMethod
註解在測試類別中的每個測試方法之前執行一個方法。它用於在每次測試之前需要重置或重新初始化的任務,例如重置變數、清除資料或設定隔離條件。這確保每個測試獨立於其他測試運行,避免交叉測試依賴。
在下面的範例中,我們將在每個測試方法之前使用@BeforeMethod
重置counter
物件中的totalCount
值。
讓我們建立第二個測試類,名為BeforeMethodAnnotationTest
:
public class BeforeMethodAnnotationTest {
private static final Logger log = LoggerFactory.getLogger(BeforeMethodAnnotationTest.class);
Counter counter;
@BeforeTest
public void init() {
log.info("Initializing ...");
counter = new Counter(0);
}
@BeforeMethod
public void givenCounterInitialized_whenResetTotalCount_thenTotalCountValueReset() {
log.info("resetting total counter value ...");
counter.resetTotalCount();
}
@Test
public void givenCounterInitialized_whenAddingValue_thenTotalCountIncreased() {
log.info("total counter before added: {}", counter.getTotalCount());
counter.addCounter(2);
log.info("total counter after added: {}", counter.getTotalCount());
}
@Test
public void givenCounterInitialized_whenSubtractingValue_thenTotalCountDecreased() {
log.info("total counter before subtracted: {}", counter.getTotalCount());
counter.subtractCounter(2);
log.info("total counter after subtracted: {}", counter.getTotalCount());
}
}
現在,讓我們運行BeforeMethodAnnotationTest:
Initializing ...
resetting total counter value ...
total counter before added: 0
total counter after added: 2
resetting total counter value ...
total counter before subtracted: 0
total counter after subtracted: -2
以下是範例中的註解和方法如何協同工作:
-
init()
方法:此方法使用@BeforeTest
進行註釋,因此它在所有單元測試之前運行一次,將totalCount 初始化為0 以在計數器中使用。 -
givenCounterInitialized_whenResetTotalCount_thenTotalCountValueReset()
方法:使用@BeforeMethod
註釋,此方法在每次測試之前立即執行。它在每次測試執行之前將totalCount
重設為0
。 - 測試方法
givenCounterInitialized_whenAddingValue_thenTotalCountIncreased()
和givenCounterInitialized_whenSubtractingValue_thenTotalCountDecreased()
:當這些測試運行時,totalCount
總是從0
開始,因為@BeforeMethod
會在每次測試之前重置它。
5. 主要差異
了解@BeforeTest
和@BeforeMethod
之間的主要差異可以幫助我們決定何時有效地使用每個註解。下面詳細介紹了它們的差異以及為什麼兩者在我們的測試中都很有價值:
方面 | @BeforeTest |
@BeforeMethod |
---|---|---|
執行範圍 | ||
在任何測試方法之前運行一次 |
|
在類別中的每個測試方法之前運行
|
| 使用案例 |
非常適合設定配置、啟動跨多個測試共享的物件或資源
|
非常適合為每次測試重置或準備條件
|
| 典型用法 |
環境設置,初始化稍後操作的對象,初始化資料庫等資源
|
重置變量,準備特定於測試的配置
|
6. 何時使用每個註釋
以下是如何根據用例在@BeforeTest
和@BeforeMethod
之間做出決定:
- 我們在跨多個測試設定配置或共用資源時使用
@BeforeTest
,例如初始化應用程式上下文、啟動物件或設定共用資料庫。 - 我們在設定隔離條件或重置每個測試需要獨立的狀態時使用
@BeforeMethod
,例如在每次測試之前重置物件值、重置資料庫或設定變數的預設值。
七、結論
在 TestNG 中, @BeforeTest
和@BeforeMethod
提供了在 Java 測試套件中組織測試設定的強大工具。透過了解它們的差異,我們可以使用@BeforeTest
來運行一次的共享配置,並使用@BeforeMethod
來重置或設定特定於每個測試方法的條件。這有助於我們在 Java 中實現高效可靠的測試,尤其是在 Spring 應用程式等複雜環境中。
程式碼範例可在 GitHub 上取得。