拓冰建站拓冰建站
首页 / 资讯中心 / 正文

build2 测试完整指南:用 Testscript 语言编写跨平台自动化测试

build2 测试完整指南用 Testscript 语言编写跨平台自动化测试【免费下载链接】build2build2 build system项目地址: https://gitcode.com/gh_mirrors/bu/build2build2 测试怎么做才专业本文是一份面向新手的 build2 测试完整指南带你认识 Testscript 语言——一套专为跨平台自动化测试设计的领域专用语言。无论你是在 Linux、macOS 还是 Windows 上开发都能用同一份 testscript 文件写出简洁、可并行、可维护的自动化测试告别 Bash 脚本不可移植的烦恼。为什么 build2 需要一门专门的测试语言build2 是一个现代化的 C 构建系统它的test模块本身就能运行简单的单次测试通过test.stdin、test.stdout、test.options等目标变量传入输入、期望输出和命令行参数。但真实世界的测试往往需要多次运行、输入各不相同分析并比较 stdout/stderr 输出创建临时文件作为测试前置条件在 Windows、Linux、macOS 之间保持行为一致传统方案是用 Bash 或 Python 写测试脚本但存在三个痛点不可移植Windows 开箱即用环境下没有 Bash 和 Python难以并行每个测试单独写脚本还要自制测试框架难以阅读通用脚本语言写测试容易失控测试套件逐渐变得没人敢动Testscript 语言正是为解决这些问题而生。它由 build2 的test模块实现核心代码位于 libbuild2/test/风格类似 Bash 但经过专门优化聚焦于简洁描述测试 快速执行。快速上手写出你的第一个 testscript 测试 假设我们有一个hello程序buildfile是这样写的exe{hello}: cxx{hello}要开始测试只需做两件事创建一个名为testscript的空文件并把它声明为目标的先决条件exe{hello}: cxx{hello} testscript现在往testscript文件里加一行内容。假如hello在缺少名字参数时会打印错误并返回非零退出码我们可以这样测试失败场景$* 2- ! 0这一行看起来很神秘拆开解读就清楚了$*是测试目标命令行自动绑定被测试程序路径、选项和参数2-是丢弃 stderr的重定向等价于可移植版的2/dev/null! 0是退出码检查默认期望是 0运行测试只需一条命令b test就这么简单你已经拥有了一个跨平台自动化测试。Testscript 语法速查表 语法含义$*测试目标命令行路径 选项 参数$0被测试程序路径Hellohere-string期望 stdout 输出EOO...EOOhere-document多行期望 stdout2EOEhere-document多行期望 stderr~修饰符期望输出按正则匹配EOI向 stdin 提供输入file注册文件自动清理?file/!file存在才清理 / 永不清理;把下一条命令并入同一个测试{{ }}测试分组组cmd/-cmd组级 setup / teardown 命令if / else / ife / ifn条件分支\|、、\|\|管道、逻辑与、逻辑或输出比较从精确匹配到正则匹配 Testscript 最强大的能力之一就是输出验证。来看完整一点的失败场景测试$* 2EOE ! 0 error: missing name usage: $0 name EOE注意几个细节引号包裹的EOE表示 here-document 内容支持变量展开$0会被替换成真实程序路径不引号或单引号的结束标记则按字面处理这一点与 Bash 不同程序名会随路径变化因此用$0动态拼进期望输出如果输出中某部分实在无法精确预测比如系统错误消息随 errno 和本地化变化就用正则。给重定向加上~修饰符并以/作为正则引入符$* 2~/EOE/ ! 0 error: missing name /usage: . name/ EOE以引入符开头的行会被当作正则表达式处理。单行输出还可以用 here-string 形式$* World Hello, World!一目了然。用 stdin 输入和复合命令测试完整流程 很多程序需要从 stdin 读取输入。Testscript 用重定向提供输入同时可以一并验证输出$* - EOI EOO : stdin-names Jane John EOI Hello, Jane! Hello, John! EOO如果测试需要先准备配置文件就涉及多条命令。用分号;把它们并入同一个测试cat EOI hello.conf; John Howdy Jane Good day EOI $* -c hello.conf Jane Good day, Jane! : config-greet这里出现了一个关键内置命令cat——Testscript 内置了一组可移植的 POSIX 工具子集包括echo、touch、mkdir、rm、cp、diff、env、sleep等。它们进程内实现Windows 上也能用如果非要用系统版本在命令名前加^前缀即可如^cat --squeeze-blank。自动清理与测试分组让测试套件保持整洁 测试产生的临时文件无需手动删除。Testscript 会自动为测试工作目录中创建的文件注册清理也可以用显式声明$* ... hello.log ! 0 # 无论成败都清理 $* ?a # 存在才清理 $* !a # 永不清理这些精细的清理语义在 build2 自己的测试里就有完整示范见 tests/test/script/runner/cleanup.testscript。当多个测试需要共享前置条件时用{{ }}测试分组配合开头的 setup 命令和-开头的 teardown 命令: config {{ conf $~/hello.conf cat EOI $conf John Howdy Jane Good day EOI $* -c $conf John Howdy, John! : custom-greet $* -c $conf Jack Hello, Jack! : default-greet }}$~是当前作用域工作目录变量在作用域内生效组级 setup 在组内所有测试前执行给组起个 id如config后还能单独运行组内测试条件分支一套脚本适配多个平台 跨平台自动化测试离不开条件逻辑。Testscript 支持作用域级和命令级两种if-else。变量查找会延续到 buildfile所以可以直接引用$cxx.target.class判断平台if ($cxx.target.class ! windows) { $* -c /dev/null Jane Hello, Jane! } else { $* -c nul Jane Hello, Jane! }更推荐的做法是把平台判断放在 buildfile 里用目标特定变量传给 testscript保持测试脚本更干净# buildfile exe{hello}: cxx{hello} testscript testscript{*}: windows ($cxx.target.class windows)# testscript if! $windows conf /dev/null else conf nul条件判断还有ife判断变量是否为空、ifn判断变量是否为空或 null等变体以及!取反配合求值表达式($windows ? nul : /dev/null)可以写出非常简洁的平台适配代码。与构建系统深度集成传递选项与参数 ⚙️Testscript 与 buildfile 通过标准的目标-先决条件机制集成并约定了一组test.*变量变量作用test被测试目标路径可自动从目标名转换test.options附加命令行选项test.arguments附加命令行参数test.redirects附加重定向test.cleanups附加清理项test.target交叉测试时的目标平台这些变量拼成测试目标命令行$*、$0、$N就是它的便捷别名。典型用法是把测试放到独立目录指向别的目录里的可执行文件# tests/buildfile hello ../hello/exe{hello} ./: $hello testscript ./: test $hello include ../hello/交叉测试比如在 Linux 上用 Wine 跑 Windows 程序时在build/root.build中设置test.target $cxx.target即可。并行执行与测试隔离快而不乱 ⚡每个测试都在out_base下的独立临时工作目录中执行结构如下$out_base/ └── test-hello/ ├── command-name/ ├── stdin-names/ ├── config/ │ ├── hello.conf │ ├── custom-greet/ │ └── default-greet/ └── missing-name/全部通过后目录自动删除有失败则保留现场含 diff 文件供你排查下次运行前自动清理。因为每个测试互不干扰顶层测试和组内测试都能并行执行充分利用多核 CPU 加速测试套件。去哪里学习更多实战写法想写出地道的 Testscript 测试最好的老师就是 build2 项目自己的测试套件官方语言规范doc/testscript.cli完整语法、语义与编码风格指南测试模块实现libbuild2/test/真实用例tests/test/script/ 目录下的 parser、runner 等大量 testscript 文件比如 test-runner.testscript、if.testscript、cleanup.testscript求值与条件表达式示例tests/eval/comma.testscript动手实践时可以先克隆项目再本地运行git clone https://gitcode.com/gh_mirrors/bu/build2进入tests/目录执行b test亲眼看看测试是如何组织、并行和报告的。写在最后 ✨Testscript 语言把测试这件事从通用脚本中解放出来可移植的内置命令、精确到字节的输出比较、正则兜底、自动清理、分组复用、并行隔离再加上与 build2 构建系统的无缝集成让你用最少的代码写出最可靠的跨平台自动化测试。从今天第一行$* 2- ! 0开始你的测试之路会越走越顺。【免费下载链接】build2build2 build system项目地址: https://gitcode.com/gh_mirrors/bu/build2创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门