XUnit 测试框架 - GS语言版本
一个基于GS语言的现代化单元测试框架,参考.NET xunit框架的设计理念,支持TestSuite结构化管理和基准测试。
主要特性
- 🔍 自动测试发现:基于命名约定自动发现测试用例
- 📁 TestSuite结构:使用TestSuite包装测试,每个测试代码文件对应一个TestSuite
- 🧩 弱化Suite概念: 每个测试用例都有suite属性,默认为空字符串
- 📊 多种测试类型:支持Fact、Theory(参数化)、Benchmark测试
- 🛠️ 自动Setup/Teardown:基于命名约定自动绑定suite级别的setup/teardown函数
- ⚡ 高性能:支持并行测试执行(可选)
- 📈 基准测试:内置基准测试支持,包含性能分析
- 🎯 灵活配置:丰富的配置选项和命名约定
快速开始
1. 基本测试用例
// 定义测试套件名称列表(可选)
public array get_suite_names()
{
return ["用户管理", "产品管理", "系统工具"];
}
// 自动归类到 "user" suite
public void test_user_creation()
{
// 测试用例实现
string username = "testuser";
xassert.not_empty(username, "用户名不能为空");
}
// 没有明确suite的测试(suite为空字符串)
public void test_utility_functions()
{
// 测试用例实现
string result = helper_function("test");
xassert.equal("TEST", result, "应该转换为大写");
}
2. Suite级别的Setup/Teardown
// 用户suite的setup函数
public void user_setup()
{
printf("初始化用户测试数据\n");
// 准备测试数据
}
// 用户suite的teardown函数
public void user_teardown()
{
printf("清理用户测试数据\n");
// 清理测试数据
}
3. 参数化测试
// 自动归类到 "login" suite
public void theory_login_validation(string username, string password, bool expected)
{
bool result = validate_login(username, password);
xassert.equal(expected, result, "登录验证结果不匹配");
}
// 测试数据提供者
public array theory_login_validation_data()
{
return [
["admin", "password123", true],
["user", "wrongpass", false],
["", "password", false]
];
}
4. 基准测试
// 自动归类到 "performance" suite
public void bench_performance_string_operations()
{
string result = "";
for (int i = 0; i < 1000; i++)
{
result += "test";
}
}
// 指定迭代次数的基准测试
public void benchmark_performance_array_ops_iter_5000()
{
array data = [];
for (int i = 0; i < 100; i++)
{
data.push_back(i);
}
}
5. 运行测试
// 在你的测试文件中
void create()
{
// 配置测试框架
xunit.configure({"verbose": true});
// 自动发现测试用例
int count = xunit.discover_tests_by_naming_convention(this_object());
printf("发现 %d 个测试用例\n", count);
// 运行所有测试
map results = xunit.run_all_tests({});
// 显示结果
printf("通过: %d, 失败: %d, 跳过: %d\n",
results["summary"]["passed"],
results["summary"]["failed"],
results["summary"]["skipped"]);
}
TestSuite结构
TestSuite概念
- TestSuite:包装一个测试套件,对应一个测试代码文件
- TestCase:每个测试用例都有suite属性,默认为空字符串
- TestSuite执行:测试以TestSuite为单位依次执行
- names属性:TestSuite中存在names属性,用于定义当前套件的名称列表
TestSuite结构图
TestSuite (test_file.gs)
├── names: ["用户管理", "产品管理"]
├── test_cases: [
│ ├── TestCase { name: "test_user_login", suite: "user" }
│ ├── TestCase { name: "test_product_search", suite: "product" }
│ └── TestCase { name: "test_utility_func", suite: "" }
└── ]