C# 在我的编译器中编写单元测试(生成IL)
我正在用C# 在我的编译器中编写单元测试(生成IL),c#,unit-testing,compiler-construction,compilation,tiger,C#,Unit Testing,Compiler Construction,Compilation,Tiger,我正在用C#编写Tiger编译器,我将Tiger代码翻译成IL 在实现AST中每个节点的语义检查时,我为此创建了许多单元测试。这非常简单,因为我的CheckSemantic方法如下所示: public override void CheckSemantics(Scope scope, IList<Error> errors) { ... } 或 但是我现在开始代码生成,我不知道在为那个阶段编写单元测试时,什么是好的实践 我正在使用ILGenerator类。我考虑过以下几点: 生成我
C#
编写Tiger
编译器,我将Tiger
代码翻译成IL
在实现AST中每个节点的语义检查时,我为此创建了许多单元测试。这非常简单,因为我的CheckSemantic
方法如下所示:
public override void CheckSemantics(Scope scope, IList<Error> errors) {
...
}
或
但是我现在开始代码生成,我不知道在为那个阶段编写单元测试时,什么是好的实践
我正在使用ILGenerator
类。我考虑过以下几点:
test.exe
text.exe
并将输出存储在results
结果进行断言
但我想知道是否有更好的方法来实现它?这正是我们在C#编译器团队中测试IL生成器所做的
我们还通过ILDASM运行生成的可执行文件,并验证IL是否按预期生成,并通过PEVERIFY运行它以确保生成可验证的代码。(当然,在我们有意生成无法验证的代码的情况下除外。)您可以将测试视为做两件事:
我还就如何在中扩展集成测试给出了一些想法。知道这一点很好。那我就那样做。我只是有点担心磁盘上运行的大量测试的性能,以及创建、读取和删除文件的性能。@OscarMederos:如果性能不够好,那么要么(1)进行分析,找出慢的地方,如果可以的话进行修复,要么(2)更改测试策略,以便在每次签入时都运行一些测试,有些测试在夜间运行,有些测试在周末运行。这样,您可以在快速发现问题和继续进行彻底测试之间取得良好的平衡。
Assert.That(errors.Count == 0);
Assert.That(errors.Count == 1);
Assert.That(errors[0] is UnexpectedTypeError);
Assert.That(scope.ExistsType("some_declared_type"));