Bộ thử nghiệm cho các ứng dụng số trong C ++?


13

Gần đây, tôi đã thúc đẩy nhóm của mình bao gồm nhiều thử nghiệm hơn khi viết mã của họ. Có một số lỗi lớn cần nhiều thời gian để bắt hơn là có thể nói là cần thiết, bởi vì chúng tôi không có chế độ kiểm tra tốt.

Tuy nhiên, tôi nghi ngờ rằng việc có các công cụ thích hợp để tự động hóa (hoặc giúp hợp lý hóa quy trình), chắc chắn sẽ hữu ích. Mặt khác, tôi không biết các tùy chọn khác nhau cho các bộ thử nghiệm C ++ và cách quyết định giữa chúng?

Có hướng dẫn nào cho những gì cần tìm kiếm và có bất kỳ hướng cụ thể nào hướng tới các ứng dụng số không?

Câu trả lời:


11

Vấn đề với việc kiểm tra mã số là (i) bạn có thể không phải lúc nào cũng biết đầu ra chính xác và bạn sẽ chỉ có thể lưu kết quả tính toán ngay bây giờ để so sánh với sau này - tức là, để thực hiện kiểm tra hồi quy và (ii) kết quả đó có thể khác nhau bởi một lượng nhỏ trên các máy khác nhau do làm tròn khác nhau.

Để xem cách deal.II thực hiện, hãy xem tại đây: http://www.dealii.org/developer/development/testsuite.html#regression_tests


Điểm tốt về những hạn chế của thử nghiệm đơn vị. Kiểm tra hồi quy là một điều tốt (chắc chắn tốt hơn là không kiểm tra tất cả vì đầu ra không rõ; nó có thể đưa ra các dấu hiệu cảnh báo về lỗi). Đối với vấn đề làm tròn máy, có giảm thiểu việc chọn một dung sai tốt thông qua thử và sai không?
Geoff Oxberry

2
Đó là một nỗi đau liên tục. Trong hơn 10 năm thử nghiệm, chúng tôi chưa bao giờ đưa ra một chiến lược thực sự tốt để đối phó với nó. Sử dụng numdiff thay vì diff có thể giúp ích, nhưng cuối cùng bạn cần chỉ định một máy mà bạn lưu trữ "0,3987" thay vì "0,3988" bạn nhận được trên một máy khác khi số chính xác là 0,38875. Bất kể bạn đặt ngưỡng ở đâu, bạn sẽ luôn cắt một số khác ở vị trí sai.
Wolfgang Bangerth

@WolfgangBangerth. Có một số cờ cụ thể của trình biên dịch làm cho hành vi dấu phẩy động trở nên xác định hơn. Ví dụ: / fp: nghiêm ngặt | chính xác và / Qimf-arch-tính nhất quán: true (trình biên dịch Intel) hoặc -fnounsafe-tối ưu hóa toán học, -ffloat-store (GCC) có thể làm cho mã của bạn phù hợp hơn và có thể tái tạo trên các nền tảng với chi phí hiệu năng . Với một số điều chỉnh, điều này cung cấp một bản dựng "tái tạo" đặc biệt, có thể được sử dụng riêng để thử nghiệm.
André

@Andre - oh vâng, chúng tôi đã thử tất cả những thứ này. Vẫn còn khó khăn :-)
Wolfgang Bangerth

10

Gần đây tôi đã sử dụng googletest để thử nghiệm một vài thư viện số mà tôi làm việc và đã rất hài lòng với nó. Bạn có thể viết các bài kiểm tra khá đơn giản rất nhanh hoặc bạn có thể viết các bài kiểm tra phức tạp yêu cầu khởi tạo dữ liệu, v.v. Nó cũng cung cấp (như tôi chắc chắn nhiều người khác làm) cách dễ dàng thực hiện so sánh dấu phẩy động hơn là theo bitwise.


Một điều thú vị về googletest là chúng giúp dễ dàng đưa mã nguồn của nó vào một ứng dụng, vì vậy bạn không cần phải biến nó thành một phụ thuộc.
Geoff Oxberry

4

Nếu bạn đang xây dựng mã của mình bằng CMake, thì cơ chế ctest sẽ là lựa chọn rõ ràng. Nó cho phép bạn kiểm tra mã của mình theo cách thủ công thông qua lệnh ctestvà cũng hỗ trợ kiểm tra mở rộng hàng đêm qua CDash .


1

Đối với thư viện C ++ sinh học tính toán ( Hương vị ), chúng tôi sử dụng http://cxxtest.com/ . Điều này khá đơn giản để sử dụng, hoạt động tốt, nó cung cấp một vài macro để thử nghiệm với các assert()câu lệnh kiểu. Đối với tính toán khoa học, đây thường là những so sánh trực tiếp đơn giản với TS_ASSERT_EQUALS(a,b)hoặc so sánh bằng số với TS_ASSERT_DELTA(a,b,tolerance).

Các macro bổ sung có thể dễ dàng được viết bằng cách sử dụng các macro cơ bản này để so sánh các vectơ / ma trận của riêng bạn. Sử dụng một cách hiệu quả, bạn cũng có thể kiểm tra xem mã của bạn có đưa ra các cảnh báo và thông báo lỗi phù hợp trong các tình huống cụ thể không. Bạn có thể duyệt một số ví dụ trong các testthư mục của mã nguồn của chúng tôi tại đây: https://chaste.cs.ox.ac.uk/trac/browser/trunk

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.