首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态生成rackunit测试套件:测试通过并引发异常

动态生成rackunit测试套件:测试通过并引发异常
EN

Stack Overflow用户
提问于 2020-08-09 16:25:19
回答 1查看 67关注 0票数 1

我正在尝试动态地生成一组测试用例。

基本上,我想用不同的值多次运行相同的测试。也许有更好的方法,如果是这样的话,我还没找到。

我找到了make-test-suite,它说您可以传递一个test-case实例的列表。

因此,我创建了一个for/fold循环,它将为每组值生成的测试用例收集到一个平面列表中。

我不明白的是,它似乎成功地运行了所有的测试,同时也引发了一个异常:

代码语言:javascript
复制
tests->test-suite-action received #<void> in list of tests (#<void> #<void> #<void> #<void> #<void> #<void> #<void> #<void>), which is not a test.
  context...:
   /usr/share/racket/pkgs/rackunit-lib/rackunit/private/test-suite.rkt:139:7
   /usr/share/racket/pkgs/rackunit-lib/rackunit/private/test-suite.rkt:136:2
   /usr/share/racket/pkgs/rackunit-lib/rackunit/private/test-suite.rkt:61:0: apply-test-suite
   /usr/share/racket/pkgs/rackunit-lib/rackunit/text-ui.rkt:91:0: run-tests
   "/write-thru-hash/tests.rkt": [running body]
   temp35_0
   for-loop
   run-module-instance!
   /usr/share/racket/pkgs/compiler-lib/compiler/commands/test.rkt:179:16

...

1 1 write-thru-hash/tests.rkt
8 tests passed
rkt-write-thru-hash_tests_1 exited with code 1

我在我的每个测试用例中都放了一个writeln,我看到了上面用...缩写的那些行。所以我知道测试真的在进行中。

(在我将测试与for/fold循环相乘并将它们构建在test-suite中之前,测试也运行得很好。)

我的tests.rkt代码看起来如下:

代码语言:javascript
复制
(define test-cases-list
  (for/fold ([test-cases (list)])
            ([db-type (list 'sqlite 'postgres)])
    (append test-cases
      (list
        (test-case/fixture "basic operations" ... )
        (test-case/fixture "complex serializable keys and values" ... )
        (test-case/fixture "custom table-name" ... )
        (test-case/fixture "use initial src-hash" ... )))))

(define db-tests
  (make-test-suite "db-tests" test-cases-list))

(我正在使用fixturehttps://docs.racket-lang.org/fixture/)

更新:

实际上,我认为我的测试用例中的writeln正在定义时打印.也就是说,它们运行得太早了,因为它们不在test-suite上下文之外。

我猜每个test-case中的尾部test-case返回#<void>,所以我已经用测试结果(空洞)填充了一个列表,而不是测试用例本身,并给出了测试套件,因此出现了错误。

但我不明白如何真正使用make-test-suite.?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-09 18:40:29

最终找到了一个简单的方法来做这件事。

我的问题是尝试将我的测试用例的几个变体都动态生成到一个test-suite中。我没有找到办法让它工作,我怀疑我将不得不写一个宏。

相反,简单的方法是动态定义多个test-suite实例,然后循环它们的列表来运行它们:

代码语言:javascript
复制
(define db-test-suites
  (for/list ([db-type (list 'sqlite 'postgres)]
             [db-conn-fixture (list sqlite-connection-delete-after-use
                                    postgres-connection)])
    (define suite-name (format "db-tests: ~a" db-type))
    (test-suite suite-name
      (test-case/fixture "basic operations"
        #:fixture db-conn-fixture
        (define db-conn (fixture-value db-conn-fixture))
        ...)
      (test-case/fixture "complex serializable keys and values"
        #:fixture db-conn-fixture
        (define db-conn (fixture-value db-conn-fixture))
        ...))))

(for ([current-test-suite db-test-suites])
  (run-tests current-test-suite))

更新:

我还找到了一种实际使用make-test-suite的方法

代码语言:javascript
复制
(define all-tests (make-test-suite "db-test-suites" db-test-suites))

(run-tests all-tests)

这利用了测试套件可以包含其他嵌套测试套件这一事实。我认为这个表单(单个run-tests调用)比上面的(一个for循环中的多个run-tests调用)更好。

在最初的问题中,我遇到的所有问题都是试图在test-case容器之外预先定义一组test-suite实例。但是在这里,我们向make-test-suite传递一个test-suite实例列表,允许它们中的测试推迟运行,直到我们稍后调用run-tests

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

https://stackoverflow.com/questions/63328739

复制
相关文章

相似问题

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