- Câu hỏi này không phải là về Khung kiểm tra đơn vị.
- Câu hỏi này không phải là về bài kiểm tra đơn vị.
- Câu hỏi này là về nơi để đặt mã UT được viết và cách / khi / nơi để biên dịch và chạy nó.
Khi làm việc hiệu quả với Bộ luật kế thừa , Michael Feathers khẳng định rằng
kiểm tra đơn vị tốt ... chạy nhanh
và đó
Một bài kiểm tra đơn vị mất 1/10 giây để chạy là một bài kiểm tra đơn vị chậm.
Tôi nghĩ rằng những định nghĩa này có ý nghĩa. Tôi cũng nghĩ rằng họ ngụ ý rằng bạn phải giữ một bộ Bài kiểm tra đơn vị và một bộ Bài kiểm tra mã đó mất nhiều thời gian hơn , nhưng tôi đoán đó là cái giá bạn phải trả khi chỉ gọi một bài kiểm tra đơn vị nếu nó chạy rất nhanh .
Rõ ràng vấn đề trong C ++ là để "chạy" ( các ) Bài kiểm tra đơn vị của bạn, bạn phải:
- Chỉnh sửa mã của bạn (sản xuất hoặc Kiểm tra đơn vị, tùy thuộc vào "chu kỳ" bạn đang ở)
- Biên dịch
- Liên kết
- Bắt đầu kiểm tra đơn vị thực thi ( s )
Chỉnh sửa (sau khi bỏ phiếu gần lạ) : Trước khi đi vào chi tiết, tôi sẽ thử tóm tắt điểm ở đây:
Làm thế nào để mã thử nghiệm đơn vị C ++ có thể được tổ chức một cách hiệu quả, sao cho vừa hiệu quả để chỉnh sửa mã (thử nghiệm) vừa chạy mã thử nghiệm?
Các đầu tiên vấn đề sau đó là quyết định nơi để đặt mã Unit Test để:
- đó là "tự nhiên" để chỉnh sửa và xem nó kết hợp với mã sản xuất được liên kết.
- thật dễ dàng / nhanh chóng để bắt đầu chu trình biên dịch cho đơn vị bạn đang thay đổi
Vấn đề thứ hai , liên quan, sau đó là những gì cần biên dịch để phản hồi là tức thời.
Tùy chọn cực đoan:
- Mỗi Đơn vị-Kiểm tra-Kiểm tra-Đơn vị sống trong một tệp cpp riêng và tệp cpp này được biên dịch + liên kết riêng (cùng với tệp đơn vị mã nguồn mà nó kiểm tra) thành một tệp thực thi duy nhất sau đó chạy một Kiểm tra đơn vị này.
- (+) Điều này giảm thiểu thời gian khởi động (biên dịch + liên kết!) Cho Đơn vị kiểm tra duy nhất.
- (+) Bài kiểm tra chạy siêu nhanh, vì nó chỉ kiểm tra một đơn vị.
- (-) Thực hiện toàn bộ bộ phần mềm sẽ cần bắt đầu một loạt các quy trình. Có thể là một vấn đề để quản lý.
- (-) Chi phí quá trình bắt đầu sẽ hiển thị
- Mặt khác sẽ có - một - một tệp cpp cho mỗi thử nghiệm, nhưng tất cả các tệp cpp thử nghiệm (cùng với mã mà chúng kiểm tra!) Được liên kết thành một tệp thực thi (mỗi mô-đun / mỗi dự án / chọn lựa của bạn).
- (+) Thời gian biên dịch vẫn ổn, vì chỉ mã được thay đổi sẽ biên dịch.
- (+) Thực hiện toàn bộ bộ phần mềm rất dễ dàng, vì chỉ có một exe để chạy.
- (-) Bộ sẽ mất nhiều thời gian để liên kết, vì mỗi lần biên dịch lại của bất kỳ đối tượng nào sẽ kích hoạt liên kết lại.
- (-) (?) Bộ đồ sẽ mất nhiều thời gian hơn để chạy, mặc dù nếu tất cả các Bài kiểm tra đơn vị đều nhanh, thời gian sẽ ổn.
Vì vậy, các bài kiểm tra đơn vị C ++ trong thế giới thực được xử lý như thế nào? Nếu tôi chỉ chạy công cụ đó hàng đêm / hàng giờ, phần thứ hai không thực sự quan trọng, nhưng phần đầu tiên, cụ thể là làm thế nào để "ghép" mã UT với mã sản xuất, để các nhà phát triển giữ nguyên cả hai Tôi luôn luôn tập trung vào vấn đề. (Và nếu các nhà phát triển tập trung vào mã UT, họ sẽ muốn chạy nó, điều này đưa chúng ta trở lại phần hai.)
Những câu chuyện và kinh nghiệm trong thế giới thực được đánh giá cao!
Ghi chú:
- Câu hỏi này cố tình rời khỏi nền tảng không xác định và hệ thống / dự án.
- Câu hỏi được gắn thẻ UT & C ++ là một nơi tuyệt vời để bắt đầu, nhưng thật không may, quá nhiều câu hỏi, và đặc biệt là câu trả lời, quá tập trung vào các chi tiết hoặc vào các khung cụ thể.
- Cách đây một thời gian, tôi đã trả lời một câu hỏi tương tự về cấu trúc để kiểm tra đơn vị boost. Tôi thấy cấu trúc này thiếu cho các bài kiểm tra đơn vị nhanh, "thực". Và tôi thấy câu hỏi khác quá hẹp, do đó câu hỏi mới này.
:-(
Bạn đang ở đâu để tìm câu trả lời cho những câu hỏi như vậy nếu không có trong diễn đàn này?
Pipeline<A,B>.connect(Pipeline<B,C>)
nên biên dịch trong khi Pipeline<A,B>.connect(Pipeline<C,D>)
không nên biên dịch: Loại đầu ra của giai đoạn đầu tiên không tương thích với loại đầu vào của giai đoạn thứ hai.