Các chiến lược để thử nghiệm đơn vị và phát triển dựa trên thử nghiệm


16

Tôi là một người ủng hộ rất lớn cho sự phát triển dựa trên thử nghiệm trong điện toán khoa học. Tiện ích của nó trong thực tế chỉ là đáng kinh ngạc, và thực sự làm giảm bớt những rắc rối kinh điển mà các nhà phát triển mã biết. Tuy nhiên, có những khó khăn cố hữu trong việc kiểm tra các mã khoa học không gặp phải trong lập trình chung, vì vậy các văn bản TDD không hữu ích lắm khi làm hướng dẫn. Ví dụ:

  • Nói chung, bạn không biết câu trả lời chính xác cho một vấn đề phức tạp nhất định, vì vậy làm thế nào bạn có thể viết một bài kiểm tra?

  • Mức độ thay đổi song song; Gần đây tôi đã gặp một lỗi trong đó sử dụng các tác vụ MPI làm bội số của 3 sẽ thất bại, nhưng bội số của 2 đã hoạt động. Ngoài ra, các khung kiểm tra phổ biến dường như không thân thiện với MPI do bản chất của MPI - bạn phải thực hiện lại một nhị phân thử nghiệm để thay đổi số lượng tác vụ.

  • Mã khoa học thường có rất nhiều bộ phận liên kết chặt chẽ, phụ thuộc lẫn nhau và có thể thay thế lẫn nhau. Tất cả chúng ta đều đã thấy mã kế thừa và chúng ta biết nó hấp dẫn đến mức nào khi từ bỏ thiết kế tốt và sử dụng các biến toàn cục.

  • Thông thường một phương pháp số có thể là một "thử nghiệm" hoặc người viết mã không hiểu đầy đủ về cách thức hoạt động của nó và đang cố gắng hiểu nó, vì vậy dự đoán kết quả là không thể.

Một số ví dụ về các bài kiểm tra mà tôi viết cho mã khoa học:

  • Đối với các nhà tích hợp thời gian, sử dụng ODE đơn giản với một giải pháp chính xác và kiểm tra xem nhà tích hợp của bạn giải quyết nó trong một độ chính xác nhất định và thứ tự chính xác là chính xác bằng cách thử nghiệm với các kích cỡ bước khác nhau.

  • Kiểm tra độ ổn định bằng không: kiểm tra xem một phương thức có 0 điều kiện biên / điều kiện ban đầu vẫn ở mức 0.

  • Kiểm tra nội suy: đưa ra một hàm tuyến tính, đảm bảo rằng phép nội suy là chính xác.

  • Xác thực kế thừa: cô lập một đoạn mã trong ứng dụng cũ được biết là chính xác và kéo một số giá trị riêng biệt ra để sử dụng để thử nghiệm.

Nó vẫn thường xuất hiện rằng tôi không thể tìm ra cách kiểm tra chính xác một đoạn mã nhất định, ngoài việc dùng thử và lỗi thủ công. Bạn có thể cung cấp một số ví dụ về các bài kiểm tra bạn viết cho mã số và / hoặc các chiến lược chung để kiểm tra phần mềm khoa học không?


Bạn có thể, xin vui lòng, làm rõ những gì bạn có ý nghĩa bằng các bài kiểm tra nội suy?
Dmitry Kabanov

Câu trả lời:


8

Phương pháp sản xuất giải pháp .

Xác minh thông qua các nghiên cứu sàng lọc rằng phương pháp đạt được thứ tự lý thuyết về độ chính xác.

Bảo tồn câu trả lời. Tái tạo bit-khôn ngoan và thông thường của các giải pháp.


Tôi muốn đề cập đến MMS trong bài viết gốc; nó tốt cho việc xác minh mã, nhưng từ góc độ thử nghiệm đơn vị thì nó hoàn toàn vô giá trị. Nếu những thử nghiệm đó thất bại, nó không cung cấp manh mối về việc tại sao hoặc tại sao.
Aurelius

3
2×2×2

Rất nhiều tài liệu tôi đã thấy trên MMS về cơ bản là các giải pháp toàn cầu, ví dụ như đối với các vấn đề CFD, một giải pháp được sản xuất có thể là phân tích vận tải hàng không. Khi thử nghiệm này thất bại, tốt nhất là bạn đã thu hẹp thủ phạm xuống còn 5.000 dòng mã, do đó, nó khá vô dụng đối với TDD - bạn không biết nơi thất bại thực sự xảy ra. Tôi đồng ý rằng một vấn đề 2x2x2 là vô cùng quý giá và cá nhân tôi sử dụng chúng rất nhiều. Nhưng điều khá phổ biến là tôi gặp phải các vấn đề chỉ xuất hiện với các hệ thống lớn hơn; Tôi thực sự tìm thấy một lỗi trình biên dịch ifort gần đây chỉ xuất hiện trong các vấn đề lớn.
Aurelius

@Aurelius: Không có tranh luận ở đây. Bạn nên có một loạt các bài kiểm tra và chạy tất cả chúng thường xuyên.
Bill Barth

@Aurelius Ở mệnh giá, MMS không phải là thử nghiệm đơn vị, mà là thử nghiệm chức năng hoặc chấp nhận (nghĩa là của toàn bộ hệ thống). Tuy nhiên, mã thường có các giai đoạn riêng biệt (hoặc có thể được chia thành chúng). ví dụ: sự tiến bộ, áp lực, độ nhớt. Sau đó, người ta chỉ có thể kiểm tra một trong các giai đoạn này (một "đơn vị"). Tương tự, một mã có thể được kiểm tra mà không cần BC, và sau đó với một mã. Một người bạn đã làm bằng tiến sĩ về thử nghiệm đơn vị, và anh ta cho rằng lợi ích lớn nhất là nó buộc bạn phải chia chương trình của mình thành các đơn vị, vì vậy nó có thể được thử nghiệm đơn vị ... có lẽ điều này được áp dụng ở đây nhiều hơn lúc đầu (và theo những cách khác tôi không biết).
hyperpallium

6

Bill đã liệt kê một vài phương pháp giải quyết mối quan tâm của bạn.

Giải quyết điểm thứ ba của bạn, không, không có lý do để giới thiệu khớp nối mạnh mẽ giữa các bộ phận. Ngược lại: nếu các chức năng hoặc các lớp của bạn có các giao diện được xác định rõ, việc trao đổi ví dụ là một bộ giải tuyến tính cho một bộ khác hoặc sơ đồ bước thời gian sẽ dễ dàng hơn nhiều. Chỉ cần chống lại nó, và sau đó bạn sẽ có thể kiểm tra các thành phần này một cách riêng biệt. Chúng tôi đã làm điều này với deal.II trong nhiều thập kỷ.

Đến điểm thứ tư của bạn: nếu phương pháp của bạn là một thử nghiệm, thì các thử nghiệm của bạn với phương pháp đó sẽ tạo thành một thử nghiệm. Miễn là bạn không có phân tích, bạn sẽ phải lấy các kết quả kiểm tra này là tốt nhất có sẵn. Nhưng thông thường, bạn có một kỳ vọng ví dụ cho thứ tự của một phương thức, hoặc bạn sẽ biết nó chính xác cho một loại giải pháp nhất định, ví dụ như đa thức đến một mức độ nhất định. Xác minh những điều này nên là một phần trong các thử nghiệm của bạn và khi phân tích được cải thiện, các thử nghiệm có thể được thêm vào.


1
Để thêm vào câu trả lời của Guido, kinh nghiệm mà anh ấy nói đến được mã hóa trong ~ 3.000 bài kiểm tra mà chúng tôi thực hiện theo thỏa thuận.II sau mỗi thay đổi: dealii.org/developer/development/ . Về câu hỏi phải làm gì nếu bạn không biết câu trả lời chính xác: dù sao hãy viết một bài kiểm tra và để nó so sánh câu trả lời hôm nay với câu trả lời hôm qua (hoặc bất cứ khi nào bạn viết bài kiểm tra). Có một cách để phát hiện các thay đổi trong đầu ra của mã là có giá trị ngay cả khi bạn không biết liệu họ đã trả lời sai hay sửa một câu trả lời sai trước đó.
Wolfgang Bangerth

3

Gần đây tôi đã tìm thấy luận án này về TDD trong Khoa học tính toán. Tôi chưa đọc nó vì vậy tôi không biết nó có tốt không, nhưng hy vọng nó có thể giúp ích được gì đó.

http://cyber.ua.edu/files/2014/12/u0015_0000001_0001551.pdf


1
Tôi đã lướt qua một số phần giới thiệu và kết luận, và giả sử mức chất lượng ngang bằng với luận án tiến sĩ tiêu chuẩn, cả hai đều giải thích quá trình (theo cách thức cao) và đưa ra các phép đo thực tế về hiệu quả của nó. Tôi nghĩ rằng đây là một tìm kiếm khá.
Godric Seer

Liên kết đã chết. Ý của bạn là: Nanthaamornphong, A. Hiện Hiệu quả của các kỹ thuật tái phát triển và tái cấu trúc dựa trên thử nghiệm trong khoa học tính toán và phát triển phần mềm kỹ thuật. Tiến sĩ Diss., Uni. Alabama (2014).
AlQuemist
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.