2011-09-02 38 views
35

Xin lưu ý rằng đây không phải là bản sao của How write a unit test for verifying compiling error? vì tôi không quan tâm đến việc kiểm tra tính chính xác của các thư viện bên ngoài hoặc trình biên dịch.Làm thế nào để đơn vị kiểm tra lỗi biên dịch cố ý của mã mẫu

Nó là điển hình trong C++, đặc biệt khi xử lý mẫu, sử dụng các kỹ thuật ngăn chặn một đoạn mã cụ thể không được biên dịch. Vì chúng có thể phức tạp, cách tốt nhất để đảm bảo rằng các đoạn mã cụ thể nào thực sự tạo ra lỗi trình biên dịch?

Vì thử nghiệm thậm chí không được biên soạn, bạn không thể dựa vào những thứ như , vì vậy tôi đoán nó nên được tích hợp trong hệ thống xây dựng? Những vấn đề này thường được tiếp cận như thế nào?

+0

Tôi không hiểu .. bạn có thể cung cấp ví dụ cho điều bạn muốn kiểm tra không? –

+0

Ví dụ một lớp mẫu không nên được instanced nếu không có chuyên môn có sẵn cho một loại nhất định, hoặc một phương pháp cụ thể không có sẵn nếu một loại không đáp ứng yêu cầu nhất định, hoặc nói chung kiểm tra hiệu quả của 'boost :: enable_if', vv – UncleZeiv

+0

Cũng chỉ cần viết một trường hợp thử nghiệm mà không nên biên dịch, sau đó kiểm tra xem nó đã không biên dịch .. có thể tìm kiếm thông báo lỗi thích hợp để đảm bảo rằng nó không biên dịch cho quyền * * lý do. –

Trả lời

10

làm nó theo cách tương tự như các bài kiểm tra trình biên dịch được viết. Bạn sẽ có một chút mã thử nghiệm trong một số ngôn ngữ kịch bản (shell, perl, tcl, vv) sẽ chạy trình biên dịch trên các đoạn mã đã cho và kiểm tra xem các mã phải được biên dịch và đúng không.

  • gcc sử dụng DejaGnu, được xây dựng trên đầu trang expect, được xây dựng trên đầu trang của Tcl.
  • Nếu bạn sử dụng tập lệnh shell (có thể dễ dàng hơn, DejaGnu có lẽ là quá mức cần thiết), bạn có thể muốn xem shUnit2.
  • Hệ thống của 01lcủa Perl dễ sử dụng nhất. Sau khi tất cả, nó không phải là nhiều công việc để chạy quá trình từ C + +, do đó, viết một chức năng để cố gắng gọi trình biên dịch trên một chuỗi nhất định và kiểm tra xem nó ra lỗi cho dòng nơi bạn mong đợi nó sẽ không được khó khăn hơn bạn có thể tích hợp nó vào các bài kiểm tra dựa trên boost.test khác.
3

Bạn sẽ phải dựa vào khung bên ngoài để chạy một tập hợp các bài kiểm tra biên dịch, ví dụ: các công việc makefiles hoặc hudson và kiểm tra đầu ra trình biên dịch hoặc các tạo phẩm trình biên dịch. Nếu trình biên dịch được cho là không thành công thì không nên có một tệp đối tượng cho tệp trong biên dịch. Tôi đoán bạn có thể viết một plugin cho hudson để làm điều đó hoặc một tập lệnh lô đơn giản chạy một tệp makefile biên dịch tất cả các tệp thử nghiệm sẽ thất bại hoặc thành công và gắn cờ thành công hoặc thất bại tương ứng. Trong trường hợp đơn giản nhất bạn chỉ cần kiểm tra sự tồn tại của tập tin '.o' để xem thử nghiệm của bạn có thành công hay không, trong các trường hợp phức tạp hơn, bạn có thể muốn xem đầu ra của trình biên dịch và kiểm tra xem lỗi đó có được tạo ra hay không. đồng ý với lỗi mà bạn đang mong đợi. Điều đó sẽ phụ thuộc vào trình biên dịch mà bạn đang sử dụng.

Đi thêm một mức độ sâu hơn có lẽ sẽ có nghĩa là viết một phần mở rộng trình biên dịch để làm điều đó (LLVM có thể có thể xử lý những gì bạn đang yêu cầu)

+0

Chắc chắn không phải riêng biệt [Jenkins] (http://jenkins-ci.org/) (tên "Hudson" bị mắc kẹt tại Oracle) Chúng tôi đang nói về 10 đoạn mã. –

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