Scheme 测试:rackunit 框架
rackunit 是 Racket 语言(Scheme 的一种主要方言)内置的轻量级单元测试框架。它提供了一套宏和函数,用于验证代码行为是否符合预期。
1. 基础环境准备
确认已安装 Racket 环境。Rackunit 随 Racket 标准发行版一同安装,无需额外下载。打开 DrRacket 编辑器或命令行终端即可开始。
2. 编写第一个测试
创建一个新文件,命名为 basic_test.rkt。输入以下代码以引入库并进行最简单的断言。
#lang racket
(require rackunit)
(check-equal? (+ 1 2) 3)
点击 DrRacket 的运行按钮,或在命令行执行该文件。如果控制台没有输出报错信息,说明测试通过。
3. 掌握核心断言
Rackunit 提供了多种断言宏来检查不同类型的条件。以下是常用的断言对照表。
| 断言函数 | 功能描述 | 适用场景 |
|---|---|---|
check-equal? |
检查两个值是否相等(使用 equal? 判断) |
数值、字符串、列表的比较 |
check-eqv? |
检查两个值是否在内存上等价(使用 eqv? 判断) |
符号、精确数值的比较 |
check-true |
检查表达式结果是否为 #t |
布尔逻辑判断 |
check-false |
检查表达式结果是否为 #f |
布尔逻辑判断 |
check-not-exn |
检查代码执行时是否未抛出异常 | 验证代码块能正常运行 |
check-exn |
检查代码执行时是否抛出指定类型的异常 | 验证错误处理逻辑 |
使用 check-equal? 处理大多数通用数据对比。使用 check-true 处理逻辑谓词。
修改 basic_test.rkt,尝试更多断言:
#lang racket
(require rackunit)
(check-true (> 5 3))
(check-false (= 1 2))
(check-equal? (string-append "Hello" "World") "HelloWorld")
4. 组织测试用例
当测试数量增加时,使用 test-case 将相关断言打包。这帮助在失败时定位具体是哪个环节出错。
编写如下代码结构:
#lang racket
(require rackunit)
(test-case
"字符串拼接测试"
(check-equal? (string-append "a" "b") "ab")
(check-equal? (string-append "" "x") "x"))
(test-case
"算术运算测试"
(check-equal? (* 2 3) 6)
(check-equal? (/ 10 2) 5))
注意:仅仅定义 test-case 不会自动运行测试。它们是惰性的,需要被显式调用或通过测试套件运行。
5. 构建测试套件
使用 test-suite 将多个 test-case 组合成一个更大的测试集合。结合 run-tests 函数执行整个套件。
创建文件 suite_test.rkt 并输入:
#lang racket
(require rackunit)
(define math-suite
(test-suite
"数学运算套件"
(test-case
"基本加法"
(check-equal? (+ 1 1) 2))
(test-case
"基本减法"
(check-equal? (- 5 3) 2))))
(define string-suite
(test-suite
"字符串处理套件"
(test-case
"字符串长度"
(check-equal? (string-length "abc") 3))))
(run-tests math-suite)
(run-tests string-suite)
运行该文件。控制台将输出每个测试套件的名称以及通过/失败的统计信息。
6. 验证异常情况
在编程中,验证函数是否在错误输入下抛出异常至关重要。使用 check-exn 来捕获异常。
理解其参数:
- 预测器:通常是一个函数,用于判断异常类型(如
exn:fail?)。 - 表达式:预期会抛出异常的代码块(通常包裹在
thunk即无参数函数中)。
编写异常测试代码:
#lang racket
(require rackunit)
(test-case
"除零异常测试"
;; 预期抛出 exn:fail? 类型的异常
(check-exn exn:fail? (lambda () (/ 1 0))))
执行代码。如果 (/ 1 0) 没有抛出异常,或者抛出的类型不匹配,测试将失败。
7. 命令行批量测试
为了在自动化脚本或 CI/CD 流水线中使用,调用 raco test 命令。这比在 DrRacket 中手动运行更高效。
确保测试文件以 #lang racket 开头,且其中定义了 test-case。打开终端,切换到文件所在目录。执行:
raco test basic_test.rkt suite_test.rkt
系统会自动扫描并执行文件中的所有测试用例,最后汇总显示结果。

暂无评论,快来抢沙发吧!