Tôi đang viết trình biên dịch Tiger
trong C#
và tôi sẽ dịch mã số Tiger
thành IL
.Kiểm tra đơn vị viết trong trình biên dịch của tôi (tạo IL)
Trong khi thực hiện kiểm tra ngữ nghĩa của mọi nút trong AST của tôi, tôi đã tạo nhiều thử nghiệm đơn vị cho việc này. Đó là khá đơn giản, bởi vì phương pháp CheckSemantic
của tôi trông như thế này:
public override void CheckSemantics(Scope scope, IList<Error> errors) {
...
}
như vậy, nếu tôi muốn viết một số bài kiểm tra đơn vị cho việc kiểm tra ngữ nghĩa của một số nút, tất cả tôi phải làm là xây dựng một AST, và cuộc gọi phương pháp đó. Sau đó, tôi có thể làm điều gì đó như:
Assert.That(errors.Count == 0);
hoặc
Assert.That(errors.Count == 1);
Assert.That(errors[0] is UnexpectedTypeError);
Assert.That(scope.ExistsType("some_declared_type"));
nhưng tôi bắt đầu thế hệ mã trong thời điểm này, và tôi không biết những gì có thể là một thói quen tốt khi viết unit tests cho giai đoạn đó.
Tôi đang sử dụng lớp ILGenerator
. Tôi đã nghĩ về những điều sau đây:
- Tạo mã của chương trình mẫu Tôi muốn thử nghiệm
- Save rằng thực thi
- Execute tập tin đó, và lưu trữ kết quả trong một file
- Khẳng định chống lại tệp đó
nhưng tôi tự hỏi liệu có cách nào tốt hơn để làm điều đó không?
Bạn nên biết điều đó. Tôi sẽ làm theo cách đó. Tôi chỉ là một chút lo lắng về hiệu suất của nhiều thử nghiệm đang chạy, và tạo, đọc và xóa (các) tệp trên đĩa. –
@OscarMederos: Nếu hiệu suất không đủ tốt thì (1) làm profiling để tìm ra cái gì là chậm và sửa nó nếu bạn có thể, hoặc (2) thay đổi chiến lược kiểm tra của bạn để một số thử nghiệm chạy trên mọi checkin, một số test chạy qua đêm, và một số chạy vào cuối tuần. Bằng cách đó, bạn sẽ có được sự cân bằng tốt trong việc phát hiện nhanh các vấn đề và vẫn đang thực hiện kiểm tra kỹ lưỡng. –