leo*_*ski 2 unit-testing racket
我正在努力通过"漂亮的球拍",试着在我去的时候编写单元测试.
单元测试宏的最佳方法是什么?例如,如果我有一个宏infix:
(define-macro (infix [A B C]) #'(B A C))
Run Code Online (Sandbox Code Playgroud)
测试模式匹配和转换的最明智的方法是什么?我想做点什么:
(check equal? (infix '(3 - 2)) '(- 3 2))
Run Code Online (Sandbox Code Playgroud)
通过测试扩展来对宏进行单元测试几乎总是不是你想要的.这有点像用模拟测试所有东西 - 你最终得到了很多测试,这些测试太过于与实现甚至不一定能保证其行为的东西相结合.
因此,当你测试一个宏时,你几乎总是只想通过验证它实际上做正确的事情来测试它,而不是它扩展到什么.对于你的宏,我只是写一些像这样的测试用例:
(check-equal? (infix (3 - 2)) 1)
(check-equal? (infix (4 / 2)) 2)
Run Code Online (Sandbox Code Playgroud)
对于执行更复杂操作的宏,我仍然建议不要对扩展进行断言.如果必须,请在此处使用现有的单元测试工具包.即使在测试宏时,也适用相同的原则:使用依赖注入来替换难以测试的东西,如果需要,为单元测试提供稍低级别的接口,而不是与其协作者紧密耦合.
在你真的觉得你需要更细粒度的单元测试的情况下phase1-eval从syntax/macro-testing可以是有益的,因为它可以让你评估你的测试套件,你在编译时定义功能.也就是说,我敦促你尽可能少地做到这一点.我在使用Racket期间编写了一些相当强烈的宏,并且我设法在没有查看扩展的情况下对它们进行了所有行为测试.