unit-testing - 编译器输出的单元测试

标签 unit-testing compiler-construction haskell

作为大学项目的一部分,我们必须为玩具语言编写编译器。为了对此进行一些测试,我正在考虑如何最好地编写单元测试之类的东西。由于编译器是用 haskell 编写的,因此 Hunit 和 quickcheck 都可用,但可能不太合适。

我们如何进行任何类型的非手动测试?
我唯一的想法就是有效地编译到haskell,查看输出是什么,并使用一些shell脚本将其与编译程序的输出进行比较——这是一项相当多的工作,而且不太优雅任何一个。

单元测试是为了帮助我们,而不是评估工作本身的一部分。

最佳答案

这实际上取决于您正在编写的编译器的哪些部分。如果您可以保持不同的阶段以帮助隔离问题,那就太好了,但是,在任何阶段,甚至在集成级别,拥有由成对的源代码和手动编译的代码组成的单元测试是完全合理的。您可以从最简单的合法程序开始,并确保您的编译器输出与手动编译相同的内容。

随着复杂性的增加和手工编译变得笨拙,编译器保留某种类型的日志来记录它所做的事情是有帮助的。然后,您可以查阅此日志以确定是否为给定的源程序触发了特定的转换或优化。

根据您的语言,您可能会考虑从程序片段集合中生成随机程序(在 QuickCheck 脉络中)。这个生成器可以测试你的编译器的稳定性,以及处理潜在不可预见的输入的能力。

关于unit-testing - 编译器输出的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4233630/

相关文章:

c# - 假货比 Mocks 好吗?

python - 模拟 ec2.describe_regions() (AWS) 的代理

haskell - Haskell中重叠模式的含义

haskell - 如何处理 IO 操作中的非 ASCII 字符?

qt - cmake找不到Qt4

list - 在 Haskell 中表示 2D 矢量的正确方法是什么?

c# - 您是否需要使用 RemoteWebDriver 运行 Selenium 服务器才能在 TFS 2017 vnext 构建中执行步骤 "Run Functional Tests"?

javascript - Jest 测试 Mongoose 模型实例化

compiler-construction - 解释器和动态类型语言

c++ - 前向声明中的 "using typedef-name ... as class"