文章目录

Scheme 测试:rackunit 框架

发布于 2026-04-12 02:14:53 · 浏览 9 次 · 评论 0 条

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 来捕获异常。

理解其参数:

  1. 预测器:通常是一个函数,用于判断异常类型(如 exn:fail?)。
  2. 表达式:预期会抛出异常的代码块(通常包裹在 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

系统会自动扫描执行文件中的所有测试用例,最后汇总显示结果。

评论 (0)

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

扫一扫,手机查看

扫描上方二维码,在手机上查看本文