如何通过文件名/扩展名限制raco test仅执行指定测试文件?
问题描述
使用Rackunit编写单元测试时,执行raco test .命令会递归查找并运行所有Racket文件,包括大量不含测试代码的实现文件。由于需要为同一规范的多个实现共享单元测试,采用了单独编写测试文件的架构,但raco test的全量扫描导致效率低下,希望让该命令仅运行名称匹配*.test.rkt、*.spec.rkt、test-*.rkt等模式的文件(类似Jest或Pytest的行为)。曾尝试info.rkt中的test-include-paths,但发现它不适用于指定Racket文件白名单,询问是否可行。
可行方案
1. 直接通过命令行指定测试文件模式
raco test支持直接传入文件名通配符,无需扫描所有文件:
# 匹配当前目录及子目录下符合模式的测试文件 raco test **/*.test.rkt **/*.spec.rkt **/test-*.rkt
如果使用Windows Cmd,可改用PowerShell执行:
Get-ChildItem -Recurse -Include *.test.rkt,*.spec.rkt,test-*.rkt | ForEach-Object { raco test $_.FullName }
2. 用脚本或Makefile简化命令
为避免重复输入长命令,可封装为脚本或Makefile:
- Makefile示例:
test: raco test **/*.test.rkt **/*.spec.rkt **/test-*.rkt
执行时只需运行make test。
- Shell脚本示例(test.sh):
#!/bin/bash raco test **/*.test.rkt **/*.spec.rkt **/test-*.rkt
赋予执行权限后运行./test.sh即可。
3. 反向排除非测试文件(备选)
info.rkt的test-omit-paths可以排除不需要测试的文件或目录,虽然不如直接指定测试文件直观,但适合实现文件集中存放的场景:
在项目根目录的info.rkt中添加:
#lang info ; 排除src、lib目录下的所有文件,仅运行其他目录中的测试文件 (test-omit-paths (list "src" "lib"))
4. 编写主测试入口文件
创建一个主测试文件,导入所有单独的测试模块,然后仅运行这个主文件:
#lang rackunit ; 导入所有测试文件 (require "./math.test.rkt" "./string.spec.rkt" "./test-io.rkt")
执行raco test main-test.rkt即可运行所有测试,无需扫描其他文件。
内容的提问来源于stack exchange,提问作者NPN328
相关产品推荐
相关产品推荐

