gpt4 book ai didi

unit-testing - Racket 中的单元测试宏

转载 作者:行者123 更新时间:2023-12-04 04:44:39 26 4
gpt4 key购买 nike

我目前正在努力完成“美丽的 Racket ”,尝试一边写单元测试。

单元测试宏的最佳方式是什么?例如,如果我有一个宏 infix:

(define-macro (infix [A B C]) #'(B A C))

测试模式匹配和转换的最明智的方法是什么?我想做类似的事情:

(check equal? (infix '(3 - 2)) '(- 3 2))

最佳答案

通过测试宏的扩展来对宏进行单元测试几乎总是不是您想要的。这有点像用模拟来测试所有东西——你最终会得到很多测试,这些测试与某些东西的实现耦合得太多,甚至不一定保证它的行为

因此,当您测试一个宏时,您几乎总是只想通过验证它确实做了正确的事情来测试它,而不是它扩展到什么。对于您的宏,我只需要编写一些这样的测试用例:

(check-equal? (infix (3 - 2)) 1)
(check-equal? (infix (4 / 2)) 2)

对于做更复杂事情的宏,我仍然建议不要对扩展进行断言。如果必须,请在此处使用现有的单元测试工具包。即使在测试宏时,同样的原则也适用:使用依赖注入(inject)来替换难以测试的东西,如果需要,为你的单元测试提供一个稍微低级的接口(interface),而不是与其合作者紧密耦合。

如果您确实觉得需要更细粒度的单元测试,phase1-eval来自 syntax/macro-testing可能会有帮助,因为它允许您评估您在编译时在测试套件中定义的函数。也就是说,我敦促您尽可能少地这样做。在使用 Racket 期间,我写了一些非常复杂的宏,并且我已经设法在不查看它们扩展的情况下对它们进行了所有行为测试。

关于unit-testing - Racket 中的单元测试宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51196340/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com