什么被认为是对复杂单元(如编译器)进行单元测试的最佳方法?
多年来,我编写了一些编译器和解释器,我确实发现这种代码很难以一种好的方式进行测试。
如果我们采用抽象语法树生成之类的东西。您将如何使用 TDD 进行测试?
小型结构可能很容易测试。例如:
string code = @"public class Foo {}";
AST ast = compiler.Parse(code);
因为这不会产生很多 ast 节点。
但是,如果我真的想测试编译器是否可以为类似方法的东西生成 AST:
[TestMethod]
public void Can_parse_integer_instance_method_in_class ()
{
string code = @"public class Foo { public int method(){ return 0;}}";
AST ast = compiler.Parse(code);
你会断言什么?手动定义一个表示给定代码的 AST 并断言生成的 AST 符合手动定义的 AST 似乎非常麻烦,甚至可能容易出错。
那么对于这样的复杂场景进行 TDD 处理的最佳策略是什么?