コンパイラなどの複雑なユニットを単体テストするための最良のアプローチと考えられるものは何ですか?
私は何年にもわたっていくつかのコンパイラーとインタープリターを作成してきましたが、この種のコードを適切にテストするのは非常に難しいと感じています。
抽象構文木生成のようなものを取り上げるとします。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化するための最良の戦術は何でしょうか?