2010-11-20 38 views
6

Là một phần của dự án đại học, chúng ta phải viết trình biên dịch cho ngôn ngữ đồ chơi. Để làm một số thử nghiệm cho điều này, tôi đã xem xét cách tốt nhất để đi về viết một cái gì đó giống như các bài kiểm tra đơn vị. Khi trình biên dịch được viết bằng haskell, Hunit và quickcheck đều có sẵn, nhưng có lẽ không hoàn toàn thích hợp.Thử nghiệm đơn vị cho đầu ra trình biên dịch

Làm cách nào để chúng tôi có thể thực hiện bất kỳ loại thử nghiệm phi thủ công nào? Ý tưởng duy nhất tôi đã có là biên dịch hiệu quả để haskell quá, nhìn thấy những gì đầu ra là, và sử dụng một số kịch bản shell để so sánh này với đầu ra của chương trình biên dịch - đây là khá một chút công việc, và không phải là quá thanh lịch hoặc.

Thử nghiệm đơn vị là để giúp chúng tôi và không phải là một phần của bản thân công việc được đánh giá.

+0

Bạn không cần phải biên dịch sang Haskell - bạn cũng có thể chỉ cần viết thực hiện tham chiếu đơn giản của trình thông dịch. – sclv

Trả lời

4

Điều này thực sự phụ thuộc vào phần nào của trình biên dịch bạn đang viết. Thật tuyệt nếu bạn có thể giữ các giai đoạn riêng biệt để giúp cô lập các vấn đề, nhưng, ở bất kỳ giai đoạn nào, và thậm chí ở cấp độ tích hợp, nó là hoàn toàn hợp lý để có các bài kiểm tra đơn vị bao gồm các cặp mã nguồn và mã được biên dịch bằng tay. Bạn có thể bắt đầu với các chương trình pháp lý đơn giản nhất có thể, và đảm bảo rằng trình biên dịch của bạn xuất ra cùng một thứ mà bạn sẽ làm nếu biên dịch bằng tay.

Khi độ phức tạp tăng lên và việc biên dịch thủ công trở nên khó sử dụng, sẽ giúp trình biên dịch lưu giữ một số loại nhật ký về những gì nó đã làm. Sau đó, bạn có thể tham khảo nhật ký này để xác định xem các biến đổi hoặc tối ưu hóa cụ thể có được kích hoạt cho một chương trình nguồn đã cho hay không.

Tùy thuộc vào ngôn ngữ của bạn, bạn có thể xem xét trình tạo chương trình ngẫu nhiên từ tập hợp các đoạn chương trình (trong tĩnh QuickCheck). Máy phát điện này có thể kiểm tra độ ổn định của trình biên dịch của bạn và khả năng xử lý các đầu vào có khả năng không lường trước được.

3

Các bài kiểm tra đơn vị sẽ kiểm tra đoạn mã nhỏ, thường là một lớp hoặc một hàm. Phân tích từ vựng và ngữ nghĩa sẽ có các bài kiểm tra đơn vị của họ. Trình tạo trung gian Represetation cũng sẽ có các thử nghiệm riêng của nó.

Kiểm tra đơn vị bao gồm một trường hợp thử nghiệm đơn giản: nó gọi hàm được kiểm tra trong môi trường được kiểm soát và xác minh (khẳng định) kết quả thực hiện hàm. Một đơn vị kiểm tra thường kiểm tra chỉ có một hành vi và có cấu trúc sau đây, được gọi là AAA:

  • Sắp xếp: tạo môi trường các chức năng sẽ được gọi trong
  • Đạo luật: gọi hàm
  • Khẳng định: xác minh kết quả
0

Thử nghiệm trở nên khó khăn hơn khi đầu ra của chương trình của bạn chuyển sang bàn điều khiển (chẳng hạn như đầu ra tiêu chuẩn). Sau đó, bạn phải sử dụng một số công cụ bên ngoài, như grep hoặc expect để kiểm tra kết quả.

Giữ giá trị trả về từ các hàm của bạn trong cấu trúc dữ liệu càng lâu càng tốt. Nếu đầu ra của trình biên dịch của bạn, ví dụ, mã assembly, xây dựng một chuỗi trong bộ nhớ (hoặc một danh sách các chuỗi) và xuất nó ở thời điểm cuối cùng có thể. Bằng cách đó bạn có thể kiểm tra nội dung của các chuỗi trực tiếp và nhanh chóng hơn.

0

Một tùy chọn là cách tiếp cận this guy is doing để kiểm tra trình biên dịch thực: kết hợp với nhiều người như bạn có thể nói vào nó và mỗi bạn biên dịch và chạy cùng một bộ chương trình và sau đó so sánh kết quả đầu ra. Hãy chắc chắn thêm mọi trường hợp thử nghiệm mà bạn sử dụng khi có nhiều đầu vào hơn khiến cho nó hiệu quả hơn. Một chút vui vẻ với tự động hóa và kiểm soát nguồn và bạn có thể làm cho nó khá dễ dàng để duy trì.

Hãy chắc chắn để làm cho nó OK bởi prof đầu tiên, nhưng như bạn sẽ chỉ được chia sẻ các trường hợp thử nghiệm và kết quả đầu ra tôi không thấy nơi ông sẽ có nhiều chỗ để đối tượng.

Các vấn đề liên quan