如何在Zig中测试多个文件?导入模块测试未执行问题解决
问题
我在main.zig中导入了包含测试代码的lexer.zig文件,代码如下:
const lxr = @import("lexer"); some code test { std.testing.refAllDecls(@This()); }
但运行zig build test时,lexer.zig中的测试被忽略。以下是build.zig文件中的相关代码:
const exe = b.addExecutable("main", "src/main.zig"); exe.addPackagePath("lexer", "src/lexer.zig"); const exe_tests = b.addTest("src/main.zig"); exe_tests.addPackagePath("lexer", "src/lexer.zig"); const test_step = b.step("test", "Run unit tests"); test_step.dependOn(&exe_tests.step);
请问如何配置才能让Zig执行多个文件中的测试?
解决方法
要让Zig执行多个文件的测试,有两种实用方案:
方案1:为每个模块单独创建测试目标
修改build.zig,为lexer.zig单独添加测试目标,并将所有测试目标关联到test_step:
const exe = b.addExecutable("main", "src/main.zig"); exe.addPackagePath("lexer", "src/lexer.zig"); // 主模块测试 const exe_tests = b.addTest("src/main.zig"); exe_tests.addPackagePath("lexer", "src/lexer.zig"); // lexer模块单独测试 const lexer_tests = b.addTest("src/lexer.zig"); const test_step = b.step("test", "Run unit tests"); // 关联所有测试任务 test_step.dependOn(&exe_tests.step); test_step.dependOn(&lexer_tests.step);
运行zig build test时,会依次执行两个模块的所有测试,输出结果会按模块区分,便于定位问题。
方案2:在主模块中显式引用子模块测试
无需修改build.zig,直接在main.zig的测试块中添加对子模块测试的引用:
const lxr = @import("lexer"); const std = @import("std"); some code test { std.testing.refAllDecls(@This()); // 显式引用lexer模块的所有测试 std.testing.refAllDecls(lxr); }
这样运行原有的zig build test命令时,lexer.zig中的测试会被一同执行,适合模块数量较少的场景。
内容的提问来源于stack exchange,提问作者user20654379
相关产品推荐
相关产品推荐

