在 Catch1.x 中,测试用例的全局初始化和清理可以通过以下方式实现:
---
## 方法 1:通过全局对象的构造函数和析构函数
这是最简单的方式,通过定义一个全局对象,并在其构造函数中实现初始化逻辑,在析构函数中实现清理逻辑。
### 示例代码:
```cpp
#include
#include
struct GlobalInitializer {
GlobalInitializer() {
std::cout << "Global initialization..." << std::endl;
// 初始化逻辑
}
~GlobalInitializer() {
std::cout << "Global cleanup..." << std::endl;
// 清理逻辑
}
};
// 全局对象
GlobalInitializer globalInit;
TEST_CASE("Test case 1") {
REQUIRE(1 + 1 == 2);
}
TEST_CASE("Test case 2") {
REQUIRE(2 * 2 == 4);
}
```
### 输出:
```
Global initialization...
===============================================================================
All tests
-------------------------------------------------------------------------------
Test case 1
Test case 2
Global cleanup...
===============================================================================
```
---
## 方法 2:通过 `Catch::Session`
`Catch::Session` 是一个管理测试运行的类,可以通过它在测试运行的开始和结束时执行全局的初始化和清理操作。
### 示例代码:
```cpp
#include
#include
int globalSetup() {
std::cout << "Global initialization..." << std::endl;
return 0; // 返回 0 表示成功
}
void globalCleanup() {
std::cout << "Global cleanup..." << std::endl;
}
int main(int argc, char* argv[]) {
// 全局初始化
int result = globalSetup();
if (result != 0) {
return result; // 如果初始化失败,直接退出
}
// 创建 Catch Session 并运行测试
Catch::Session session;
int returnCode = session.run(argc, argv);
// 全局清理
globalCleanup();
return returnCode;
}
```
### 输出:
```
Global initialization...
===============================================================================
All tests
-------------------------------------------------------------------------------
Test case 1
Test case 2
Global cleanup...
===============================================================================
```
---
## 方法 3:通过共享上下文的 Fixture 模式
使用 Catch 的 `TestCaseMethod` 机制,可以为一组测试用例提供共享的初始化和清理逻辑。
### 示例代码:
```cpp
#include
#include
struct SharedFixture {
SharedFixture() {
std::cout << "Global setup..." << std::endl;
}
~SharedFixture() {
std::cout << "Global cleanup..." << std::endl;
}
};
TEST_CASE_METHOD(SharedFixture, "Test case 1") {
REQUIRE(1 + 1 == 2);
}
TEST_CASE_METHOD(SharedFixture, "Test case 2") {
REQUIRE(2 * 2 == 4);
}
```
### 输出:
```
Global setup...
===============================================================================
All tests
-------------------------------------------------------------------------------
Test case 1
Test case 2
Global cleanup...
===============================================================================
```
---
## 方法 4:使用 `SCENARIO` 和 `GIVEN`/`WHEN`/`THEN`(如果适用)
如果你使用的是 Catch 的行为驱动开发(BDD)模式,可以在 `GIVEN` 中初始化全局环境。
### 示例代码:
```cpp
#include
#include
SCENARIO("Global setup using BDD") {
GIVEN("A global setup") {
std::cout << "Global initialization..." << std::endl;
WHEN("Tests run") {
THEN("Perform test case 1") {
REQUIRE(1 + 1 == 2);
}
THEN("Perform test case 2") {
REQUIRE(2 * 2 == 4);
}
}
std::cout << "Global cleanup..." << std::endl;
}
}
```
---
## 方法选择指南
| 方法 | 优点 | 缺点 | 适用场景 |
|---------------------|-------------------------------|-------------------------------|------------------------------|
| 全局对象初始化 | 简单直接,易于实现 | 初始化和清理过程难以控制 | 小型项目或简单初始化逻辑 |
| `Catch::Session` | 灵活,可控制启动和清理顺序 | 需要手动修改 `main` 函数 | 复杂初始化逻辑 |
| `TestCaseMethod` | 支持多组测试共享上下文 | 每个测试运行时会重复初始化 | 多个测试用例需共享资源 |
| BDD 模式 | 语义化,适合描述复杂场景 | 仅适用于行为驱动的测试风格 | BDD 风格的项目 |
如果你的项目需要复杂的初始化和清理操作,推荐使用 `Catch::Session`,这样能够很好地控制整个测试流程。
0 Comments latest
No comments.