什麼被認爲是單元測試複雜單元(如編譯器)的最佳方法?單元測試編譯器
多年來我已經編寫了一些編譯器和解釋器,而且我發現這種代碼很難以很好的方式進行測試。
如果我們採取類似抽象語法樹的生成。你如何使用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'ing這樣的複雜場景的最佳戰術?
這只是單元測試爲什麼無用和劣質的衆多例子之一,應該集中在集成測試上。 TDD適用於CRUD,不適用於嚴重的問題。對於編譯器來說,隨機生成的代碼測試是迄今爲止最好的方法。例如:http://www.cs.utah.edu/~regehr/papers/pldi11-preprint.pdf – 2013-03-14 10:11:06
您可能還對安全編譯器構造的優秀方法感興趣:http://compcert.inria.fr/doc /index.html - 形式化規範絕對比任何可能的測試更能保證質量。 – 2013-03-14 10:12:54
@peer,你在說什麼「方法」?如果生成一個解析器(比如'bison'等),你將會擁有一個單一的語法和一堆生成的代碼。除了語法作爲一個整體外,沒有什麼可以測試的。如果它是一個手寫遞歸下降解析器,則更難以進行單元測試(例如,參見Clang源代碼並嘗試考慮如何模擬ASTContext和每個微小解析器條目的輸入流)。對於任何複雜的代碼,單元測試都是毫無意義的。 – 2013-03-14 10:19:24