gpt4 book ai didi

unit-testing - 对 Racket 中的许多不同文件使用一组单元测试

转载 作者:行者123 更新时间:2023-12-04 02:56:40 27 4
gpt4 key购买 nike

我正在寻找关于如何构建我的 Racket 程序的建议。目前,我有大约 5 个不同版本的程序,每个程序都有相同的单元测试 (RackUnit),只是添加到每个文件的末尾。这很难维护。

我想做的是将测试提取到一个单独的文件中,并要求 RackUnit 为每个程序运行一次测试。但我不确定该怎么做。有什么建议吗?

谢谢!

最佳答案

在这种情况下,也许我们可以通过使用 Racket 的 reflection system 来做一些高度动态的事情。 .

比方说,我们要确保一组模块都提供一个函数 f,它看起来是一个单调递增的函数。我们如何编写一个框架来使用相同的一组测试来测试一组实现?

我们可以编写一个线束:

  • 构造一个模块,该模块需要一个有问题的实现模块,并且
  • 对其运行一组测试。

代码可能是这样的:

(define (test-module-with-monotonic-f module-path-name)
(define ns (make-base-namespace))
(printf "testing ~s\n" module-path-name)
(eval `(begin (module a-test-module racket/base
(require rackunit
(file ,(path->string module-path-name)))
(check-true (> (f 1) (f 0))
(format "~a fails to provide monotonic f" ,module-path-name))
(check-true (> (f 3) (f 2))
(format "~a fails to provide monotonic f" ,module-path-name)))
(require 'a-test-module))
ns))

它构建测试模块,并使用动态 eval 运行它。 eval 通常被认为是邪恶的,但在这种特殊情况下,我认为它是一个合适的工具。

一旦我们有了这个助手,我们就可以在一组文件上运行它,比如在 impls 子目录中:

(for ([mod-name (in-directory "impls")]
#:when (equal? (filename-extension mod-name) #"rkt"))
(test-module-with-monotonic-f mod-name))

你可以试试 complete running example (https://github.com/dyoo/monotonic-f-example)查看所有片段。

(顺便说一下,应该清楚上面的测试严重不足。)

关于unit-testing - 对 Racket 中的许多不同文件使用一组单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16571447/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com