Appearance
构建选项
Anvil 支持在测试文件末尾通过注释指定编译选项,实现「测试即配置」。
语法格式
在测试文件末尾添加特殊注释:
c
// 测试代码...
// includes: -I../../include -I../../src/module
// flags: -Wall -Wextra -O2
// links: -lm -lpthread
// sources: ../common/mock_db.c
// timeout: 5s可用选项
includes
头文件搜索路径,传递给编译器的 -I 选项。
c
// includes: -I../include -I../src路径相对于测试文件
路径是相对于测试文件所在目录的。例如,如果测试文件在 tests/module/test_foo.c,则 ../include 指向 tests/include。
flags
传递给编译器的其他标志。
c
// flags: -Wall -Wextra -O2 -DDEBUG常用标志:
| 标志 | 说明 |
|---|---|
-Wall | 启用常用警告 |
-Wextra | 启用额外警告 |
-O0 | 禁用优化(便于调试) |
-O2 | 优化级别 2 |
-DDEBUG | 定义 DEBUG 宏 |
-g | 生成调试信息 |
links
链接器选项,用于链接外部库。
c
// links: -lm -lpthread -lssl常用库:
| 选项 | 说明 |
|---|---|
-lm | 数学库 |
-lpthread | POSIX 线程库 |
-lssl | OpenSSL |
-lcrypto | 加密库 |
sources
额外的 C 源文件,通常用于 Mock 或 Stub 文件。
c
// sources: ../common/mock_db.c ../common/mock_logger.c注意
这些源文件会与测试文件一起编译,但不会被自动发现为测试。
timeout
单个测试的超时时间,覆盖全局配置。
c
// timeout: 5s支持的格式:
| 格式 | 示例 |
|---|---|
| 秒 | 5s, 30s |
| 毫秒 | 500ms, 1500ms |
| 分钟 | 1m, 2m |
| 混合 | 1m30s |
完整示例
c
#include "database.h"
#include "logger.h"
/*
* 设计说明:测试数据库连接功能
* 预期结果:使用 Mock 数据库,应返回成功
*/
__attribute__((test_method))
int test_db_connect(void) {
return db_connect("localhost", 3306) == 0;
}
/*
* 设计说明:测试日志记录功能
* 预期结果:日志写入应成功
*/
__attribute__((test_method))
int test_log_write(void) {
return log_write("test message") == 0;
}
// 头文件路径
// includes: -I../../include -I../../src/database
// 编译标志
// flags: -Wall -DTEST_MODE
// 链接库
// links: -lpthread
// Mock 文件
// sources: ../mocks/mock_database.c ../mocks/mock_logger.c
// 超时设置(数据库操作可能较慢)
// timeout: 10s多行选项
如果选项很长,可以使用多个注释行:
c
// includes: -I../../include
// includes: -I../../src/module1
// includes: -I../../src/module2
// sources: ../mocks/mock_a.c
// sources: ../mocks/mock_b.c
// sources: ../mocks/mock_c.c选项优先级
| 优先级 | 来源 |
|---|---|
| 1(最高) | 测试文件注释 |
| 2 | .anvil 配置文件 |
| 3(最低) | 命令行参数 |
覆盖规则
测试文件中的选项会追加到全局配置,而不是替换。例如,全局 flags: -Wall,测试文件 flags: -O2,最终使用 -Wall -O2。
调试构建选项
使用 -c 选项保留生成的文件,查看实际的编译命令:
bash
anvil -c test_module
cat anvil-compile.log