在我的编译器中编写单元测试(生成IL)

Osc*_*ros 9 c# compiler-construction unit-testing compilation tiger

我正在编写一个Tiger编译器C#,我将把Tiger代码翻译成IL.

在实现AST中每个节点的语义检查时,我为此创建了许多单元测试.这很简单,因为我的CheckSemantic方法看起来像这样:

public override void CheckSemantics(Scope scope, IList<Error> errors) {
...
}
Run Code Online (Sandbox Code Playgroud)

所以,如果我想为某个节点的语义检查编写一些单元测试,我所要做的就是构建一个AST,然后调用该方法.然后我可以这样做:

Assert.That(errors.Count == 0);
Run Code Online (Sandbox Code Playgroud)

要么

Assert.That(errors.Count == 1);
Assert.That(errors[0] is UnexpectedTypeError);
Assert.That(scope.ExistsType("some_declared_type"));
Run Code Online (Sandbox Code Playgroud)

但是我现在正在开始代码生成,而且我不知道在为该阶段编写单元测试时可能是一个好的做法.

我正在ILGenerator上课.我考虑过以下几点:

  • 生成我想测试的示例程序的代码
  • 保存该可执行文件
  • 执行该文件,并将输出存储在文件中
  • 断言该文件

但我想知道是否有更好的方法呢?

Eri*_*ert 14

这正是我们在C#编译器团队中测试我们的IL生成器所做的.

我们还通过ILDASM运行生成的可执行文件,并验证IL是否按预期生成,并通过PEVERIFY运行它以确保我们生成可验证的代码.(当然,除非我们故意生成无法验证的代码.)

  • @OscarMederos:如果性能不够好,那么(1)进行分析以找出什么是慢的并且如果可以的话修复它,或者(2)改变你的测试策略以便在每次检查时运行一些测试,一些测试运行一夜之间,有些人在周末跑步.通过这种方式,您可以快速发现问题并进行全面测试. (3认同)