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

Racket 动态生成rackunit测试套件:测试通过并引发异常,racket,rackunit,Racket,Rackunit,我试图动态生成一组测试用例 基本上,我想用不同的值运行相同的测试几次。也许有更好的方法,如果有,请告诉我,我还没有找到 我找到了maketestsuite,它说您可以向它传递一个测试用例实例列表 所以我做了一个for/fold循环,它将为每组值生成的测试用例收集到一个平面列表中 我不明白的是,它似乎成功地运行了所有测试,同时也引发了一个异常: tests->test-suite-action received #<void> in list of tests (#<voi

我试图动态生成一组测试用例

基本上,我想用不同的值运行相同的测试几次。也许有更好的方法,如果有,请告诉我,我还没有找到

我找到了
maketestsuite
,它说您可以向它传递一个
测试用例
实例列表

所以我做了一个
for/fold
循环,它将为每组值生成的测试用例收集到一个平面列表中

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

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
(我正在使用
fixture
库)

更新:

实际上,我认为我的测试用例中的
writeln
是在定义时打印的。。。i、 e.它们运行得太早,因为它们不在
测试套件
上下文中

我猜每个
测试用例中的尾部
检查
都返回
#
,因此我用测试结果(无效)而不是测试用例本身填充了一个列表,并将其提供给测试套件,因此出现了错误


但我不知道如何实际使用
生成测试套件

最终找到了一种简单的方法来实现这一点

我的问题是试图将我的测试用例的几个变体都动态地生成到一个
测试套件中。我没有找到一种方法让它工作,我怀疑我必须写一个宏

相反,简单的方法是动态定义多个
测试套件
实例,然后循环它们的列表以运行它们:

(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))
更新:

我还找到了一种实际使用
maketestsuite
的方法:

(define all-tests (make-test-suite "db-test-suites" db-test-suites))

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

我在原始问题中遇到的所有问题都是试图在
测试套件
容器之外预先定义一组
测试用例
实例。但是这里我们传递了
maketestsuite
一个
testsuite
实例的列表,允许其中的测试推迟运行,直到我们稍后调用
runtests

(define all-tests (make-test-suite "db-test-suites" db-test-suites))

(run-tests all-tests)