作者 David Lattimore 一直在写一个名为 Wild 的链接器,并介绍了其测试方法。
- 测试目标属性:希望测试能在重构时发现错误,运行快速,易于诊断失败原因,易于维护。这些优先级有时相互冲突,如合并测试可提高整体速度但增加诊断难度,作者会根据情况选择拆分或合并集成测试。
- 一般测试流程:先专注于集成测试,再用单元测试填补不足,然后构建工具辅助诊断和维护集成测试。
Wild 集成测试具体示例:
- 最初的集成测试是用 GCC 编译小 C 程序,用 GNU ld 和 Wild 链接,运行并确保输出相同。可利用缓存节省时间,如在 C 程序和参数不变时跳过重新编译 GCC 和 GNU ld。
- Rust 的集成测试通常放在单独的
tests
目录,作者一般只有一个集成测试文件。Wild 集成测试编译多种语言程序并链接运行,通过特殊格式的注释提供测试指令。 - 早期调试失败测试需用调试器,现在使用 linker-diff 工具对比 GNU ld 的输出,diff 内容包括很多头部字段值、全局函数指令等,虽文件布局不同但可找出差异。linker-diff 集成到集成测试中,若 Wild 输出与 GNU ld 或 lld 不同则报告错误。
- 当 GNU ld 行为不佳时,作者对比 Wild 输出与 GNU ld 和 lld 的输出,只要匹配其中之一就认为正确。
- 为帮助诊断,linker 可将布局信息写入.layout 文件,linker-diff 利用此信息找到指令来源,还可关联追踪日志语句与输出文件中的地址。
- 测试失败时可打印命令行以便在测试外重新运行,还可将 linker-diff 集成到 Wild 中,设置环境变量
WILD_REFERENCE_LINKER
来调用参考链接器进行对比。
- 未来计划:目前主要关注正常路径测试,接下来可能测试错误条件,未来感兴趣尝试模糊测试和突变测试,模糊测试可发现未覆盖的角落情况,突变测试可找出测试漏洞和不必要的代码,并可用于评估测试的有效性。
- 感谢与讨论:感谢 github 赞助商的支持,讨论线程在Reddit。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。