首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Racket中的许多不同文件上使用一组单元测试

在Racket中的许多不同文件上使用一组单元测试
EN

Stack Overflow用户
提问于 2013-05-16 01:31:25
回答 2查看 333关注 0票数 3

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

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

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-16 04:57:25

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

例如,假设我们正在确保一组模块都提供一个函数f,该函数看起来是一个单调递增函数。我们如何编写一个框架,用相同的测试电池测试一组实现?

我们可以编写一个线束:

  • 构建了一个模块,该模块requires一个有问题的实现模块,
  • 在该模块上运行一组测试。

代码可能如下所示:

代码语言:javascript
复制
(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子目录中:

代码语言:javascript
复制
(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)来查看所有部分。

(顺便说一句,上面的测试显然是不充分的。)

票数 3
EN

Stack Overflow用户

发布于 2013-05-16 06:13:50

我不知道这有多健壮,但这里有一个使用破坏卫生的宏的解决方案。(尽管丹尼比我聪明:)所以也许你会想要听从他的建议。)

文件f1.rkt

代码语言:javascript
复制
#lang racket
(define (f x) (displayln "f1's f") (+ x 1))
(define (g x) (displayln "f1's g") (+ x 2))
(require "f-tests.rkt")
(tests)

文件f2.rkt

代码语言:javascript
复制
#lang racket
(define (f x) (displayln "f2's f") (+ 1 x))
(define (g x) (displayln "f2's g") (+ 2 x))
(require "f-tests.rkt")
(tests)

文件f-tests.rkt

代码语言:javascript
复制
#lang racket
(provide tests)
(define-syntax (tests stx)
  (syntax-case stx ()
    [(_)
     (datum->syntax 
      stx
      '(begin
         (require rackunit)
         (check-equal? (f 10) 11)
         (check-equal? (g 20) 22)))]))

datum->syntax指出tests宏应该在stx的上下文中使用标识符,即宏被调用的地方(通常,宏将在定义宏时使用标识符)。运行文件f1.rktf2.rkt都将运行测试。(打印结果只是为了证明调用的函数是正确的。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16571447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档