Thực hành tốt nhất cho các chương trình thử nghiệm với hành vi ngẫu nhiên là gì?


14

Làm công việc R & D, tôi thường thấy mình viết các chương trình có một mức độ ngẫu nhiên lớn trong hành vi của họ. Ví dụ, khi tôi làm việc trong Lập trình di truyền, tôi thường viết các chương trình tạo và thực thi mã nguồn ngẫu nhiên tùy ý.

Một vấn đề với việc kiểm tra mã như vậy là các lỗi thường không liên tục và có thể rất khó tái tạo. Điều này vượt xa việc chỉ đặt một hạt giống ngẫu nhiên cho cùng một giá trị và bắt đầu thực hiện lại.

Ví dụ, mã có thể đọc một tin nhắn từ bộ đệm vòng kernal, và sau đó thực hiện các bước nhảy có điều kiện trên nội dung tin nhắn. Đương nhiên, trạng thái của bộ đệm vòng sẽ thay đổi khi một lần sau đó cố gắng tái tạo vấn đề.

Mặc dù hành vi này là một tính năng, nó có thể kích hoạt mã khác theo những cách không mong muốn và do đó thường phát hiện ra các lỗi mà đơn vị kiểm tra (hoặc người kiểm tra) không tìm thấy.

Có thiết lập thực hành tốt nhất cho các hệ thống thử nghiệm loại này? Nếu vậy, một số tài liệu tham khảo sẽ rất hữu ích. Nếu không, bất kỳ đề nghị khác đều được chào đón!


5
Bạn có thể chế giễu bộ đệm vòng nhân không? Và các khía cạnh ngẫu nhiên khác của mã của bạn?
Jonathan Merlet

1
@JonathanMerlet Có khả năng, nhưng vấn đề là, khi được triển khai, mã sẽ có quyền truy cập vào bộ đệm vòng thực (thực sự, đến một hệ điều hành thực). Vì vậy, nếu tôi chỉ thử nghiệm trên một phiên bản giả, thì tôi sẽ trì hoãn việc phát hiện ra các lỗi này cho đến sau này.
John Doucette

Dường như với tôi rằng vấn đề không liên quan đến hành vi ngẫu nhiên của chương trình (vì điều này có thể được kiểm soát bởi hạt giống ngẫu nhiên) mà là các trạng thái cụ thể của 'bộ đệm vòng nhân' này. Vì vậy, câu hỏi của bạn thực sự là 'làm thế nào để tôi kiểm tra một chương trình phụ thuộc vào trạng thái bên ngoài', phải không?
AakashM

@AakashM, yeah, đó là một cách tốt hơn để diễn đạt nó. Cụ thể hơn, một chương trình có trạng thái bên ngoài, có thể truy cập hoặc thay đổi trạng thái bên ngoài một cách ngẫu nhiên.
John Doucette

Câu trả lời:


7

Nó rất hữu ích để thêm móc, như được đề xuất, để tạo lại trạng thái chính xác. Đồng thời cung cấp cho hệ thống để nó có thể đổ "hạt giống" của mình (trong trường hợp của bạn, bao gồm cả hạt PRNG cũng như bộ đệm vòng nhân và bất kỳ nguồn đầu vào không xác định nào khác.)

Sau đó chạy thử nghiệm của bạn với cả đầu vào ngẫu nhiên thực và kiểu hồi quy với bất kỳ trường hợp thú vị nào được phát hiện trước đó.

Trong trường hợp cụ thể về quyền truy cập của bạn vào kernel, tôi khuyên bạn nên tạo một bản giả trong mọi trường hợp. Sử dụng giả để buộc các lớp tương đương ít có khả năng hiển thị trong thực tế, theo tinh thần "trống rỗng" và "đầy đủ" cho các thùng chứa, hoặc "0, 1, 2 ^ n, 2 ^ n + 1, nhiều" cho những thứ đáng kể Sau đó, bạn có thể kiểm tra bằng giả và với thực tế, biết rằng bạn đã xử lý và kiểm tra các trường hợp bạn nghĩ đến cho đến nay.

Về cơ bản, những gì tôi đề xuất là một sự pha trộn giữa các yếu tố đầu vào xác định và không xác định, với những yếu tố quyết định là sự pha trộn của những thứ bạn có thể nghĩ đến và những thứ bạn ngạc nhiên.


6

Một điều hợp lý để làm là chọn trình tạo số ngẫu nhiên với giá trị không đổi cho các bài kiểm tra, để bạn có được một hành vi xác định.


1
điều này; hoặc chế nhạo hoàn toàn prng
jk.

1
Cám ơn vì sự gợi ý! Tôi làm điều này để kiểm tra đơn vị, nhưng tôi không thể kiểm tra tất cả các chương trình có thể bằng tay.
John Doucette

2
nhưng điều này có nghĩa là bạn không thể kiểm tra xem tính ngẫu nhiên có hoạt động tốt không ..
Louis Rhys

2

Tôi nghĩ kiểm tra thống kê là cách duy nhất. Giống như các số ngẫu nhiên được "kiểm tra" tính ngẫu nhiên bằng các kiểm tra thống kê, do đó cần phải là các thuật toán sử dụng hành vi ngẫu nhiên.

Đơn giản chỉ cần chạy thuật toán nhiều lần với đầu vào giống hoặc khác nhau và so sánh nó với nhau. Vấn đề với phương pháp này là sự gia tăng lớn về thời gian tính toán cần thiết để hoàn thành thử nghiệm.


Không nhất thiết, bởi vì bạn có thể chọn một bộ đầu vào "kéo dài" nhỏ và chạy nhiều lần trên chúng - số lượng đầu vào cần thiết để xác định độ tin cậy có thể nhỏ hơn. Bộ "kéo dài" này sẽ nhập mọi nhánh của mã, khởi tạo tất cả các đối tượng, v.v.
Daniel Moskovich

2

Tôi không phải là chuyên gia trong lĩnh vực này, nhưng có một nghiên cứu khoa học liên quan đến thử nghiệm chương trình ngẫu nhiên.

Nếu bạn không thể dễ dàng tạo các lớp kiểm tra, một bài kiểm tra thống kê có thể được sử dụng, như #Euphoric đã nói. Borning et al. so sánh một cách tiếp cận truyền thống và một cách thống kê. Một khái quát về các bài kiểm tra thống kê được đề xuất bởi @Euphoric có thể là bài kiểm tra được Whittaker thảo luận. Ông đề nghị tạo ra một mô hình ngẫu nhiên về hành vi mong muốn (ngẫu nhiên, trong trường hợp của bạn) và sau đó tạo ra các trường hợp thử nghiệm cụ thể từ mô hình này (xem bài viết chuyên dụng của ông ).


Cảm ơn! Có vẻ rất hữu ích. Đối với những người bên ngoài các tổ chức học thuật, có thể lấy phiên bản in lại của bài báo từ kho lưu trữ mã google của tác giả tại đây: team4model.googlecode.com/svn/trunk/resource/apers/ trộm
John Doucette
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.