跳到主要内容
版本:Next 🚧

测试库

  • 开始日期:2023-06-03
  • 目标主要版本:3.x
  • 参考问题:无
  • 实现 PR:无

概括

一个简单的测试库,用于统计测试用例执行结果和耗时,以友好的格式输出测试结果。

基本示例

#include <ctest.h>

void test_stdio(void)
{
int num = 0;

ctest_equal_int("the string \"100\" should be converted to 100",
sscanf("100", "%d", &num), 100);
}

int main(void)
{
ctest_describe("stdio.h", test_stdio);
return ctest_finish();
}

运行后输出:

  stdio.h
✓ the string "100" should be converted to 100

1 passing (0ms)

动机

  • 命名规范化: describe()print_test_result()it_i() 命名比较随意,不太容易看出它们同属一个库。
  • 减少依赖: ctest 的 it_rectf()it_rect() 等函数依赖图形库和 UI 库的数据类型,其它用到 ctest 的库会因此依赖这些库。
  • 适应更多的数据类型: 内置的 it_s()it_b()it_i() 不够用,而且它们的大部分实现代码是一样的,应该优化。

详细设计

调整命名

命名都以 ctest_ 开头。

it_开头的测试函数改为以 ctest_equal_ 开头,并将 s、i、b 改为更完整的单词:str、int、bool。

提升扩展性

新增 ctest_equal() 函数,接收字符串转换函数 to_str 和自定义数据的指针。

bool ctest_equal(const char *name, int (*to_str)(void *, char *, unsigned),
void *actual, void *expected);

原有的 it_s()it_int() 等函数改为基于 ctest_equal() 实现,例如:

int ctest_int_to_str(void *data, char *str, unsigned max_len)
{
return snprintf(str, max_len, "%d", *(int *)data);
}

bool ctest_euqal_int(const char *name, int actual, int expected)
{
return ctest_equal(name, ctest_int_to_str, &actual, &expected);
}

减少依赖

内部移除 it_rect()it_rectf(),由 UI 库和图形库内部提供这些数据类型值的测试函数,例如:

int ui_rect_to_str(ui_rect_t *rect, char *str, unsigned max_len)
{
return snprintf(str, max_len, "(%g, %g, %g, %g)", rect->x, rect->y,
rect->width, rect->height);
}

static inline bool ctest_euqal_ui_rect(const char *name, ui_rect_t *actual,
ui_rect_t *expected)
{
return ctest_equal(name, (ctest_to_str_func_t)ui_rect_to_str, actual, expected);
}

缺点

无。

备选方案

无。

采用策略

全局替换。