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)