Điều gì được coi là phương pháp tốt nhất để kiểm tra đơn vị một đơn vị phức tạp như trình biên dịch?Đơn vị thử nghiệm một trình biên dịch
Tôi đã viết một vài trình biên dịch và thông dịch viên qua nhiều năm và tôi thấy loại mã này khá khó để kiểm tra theo cách tốt.
Nếu chúng ta lấy một cái gì đó như thế hệ Cây cú pháp trừu tượng. làm thế nào bạn sẽ kiểm tra điều này bằng cách sử dụng TDD?
Cấu trúc nhỏ có thể dễ dàng kiểm tra. ví dụ: một cái gì đó dọc theo dòng:
string code = @"public class Foo {}";
AST ast = compiler.Parse(code);
Vì điều đó sẽ không tạo ra nhiều nút ast.
Nhưng nếu tôi thực sự muốn kiểm tra rằng trình biên dịch có thể tạo ra một AST cho một cái gì đó giống như một phương pháp:
[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);
Những gì bạn sẽ khẳng định trên? Xác định thủ công AST đại diện cho mã đã cho và xác nhận rằng AST được tạo ra phù hợp với AST được xác định thủ công có vẻ khó chịu và thậm chí có thể bị lỗi.
Vậy các chiến thuật tốt nhất cho TDD'ing các tình huống phức tạp như thế này là gì?
Nó chỉ là một trong rất nhiều ví dụ về lý do tại sao các bài kiểm tra đơn vị là vô ích và kém hơn, và trọng tâm phải được kiểm tra tích hợp. TDD là dành cho CRUD, không phải cho những thứ nghiêm trọng. Đối với các trình biên dịch, thử nghiệm mã được tạo ngẫu nhiên là cách tiếp cận tốt nhất có thể. Ví dụ: http://www.cs.utah.edu/~regehr/papers/pldi11-preprint.pdf –
Bạn cũng có thể quan tâm đến cách tiếp cận vượt trội để xây dựng trình biên dịch an toàn: http://compcert.inria.fr/doc /index.html - đặc tả chính thức chắc chắn là một đảm bảo tốt hơn về chất lượng hơn bất kỳ thử nghiệm có thể nào. –
@peer, bạn đang nói về "phương pháp" nào? Nếu một trình phân tích cú pháp được tạo ra (nghĩ 'bison' và giống nhau), bạn sẽ có một ngữ pháp nguyên khối và một đống mã không thể đọc được. Không có gì để kiểm tra bên cạnh ngữ pháp nói chung. Nếu đó là một trình phân tích cú pháp đệ quy viết tay, thì việc kiểm thử đơn vị thậm chí còn khó hơn (xem mã nguồn Clang và cố gắng nghĩ về cách giả lập ASTContext và luồng đầu vào cho mỗi mục trình phân tích cú pháp nhỏ). Kiểm thử đơn vị thực sự vô nghĩa đối với bất kỳ mã phức tạp nào. –