2008-10-24 32 views
10

Cách tốt nhất để kiểm tra đơn vị bộ dữ liệu lớn là gì? Một số mã di sản mà tôi đang duy trì có cấu trúc của một trăm thành viên trở lên; các phần khác của mã mà chúng tôi đang làm việc để tạo hoặc phân tích bộ dữ liệu của hàng trăm mẫu.Kiểm tra đơn vị bộ dữ liệu lớn?

Cách tiếp cận tốt nhất mà tôi đã tìm thấy là sắp xếp các cấu trúc hoặc tập dữ liệu từ đĩa, thực hiện các thao tác đang thử nghiệm, tuần tự hóa kết quả vào đĩa, sau đó phân biệt các tệp có chứa kết quả được tuần tự hóa đối với các tệp có chứa kết quả mong đợi. Đây không phải là khủng khiếp nhanh chóng, và nó vi phạm nguyên tắc "không chạm vào đĩa" của thử nghiệm đơn vị. Tuy nhiên, sự thay thế duy nhất tôi có thể nghĩ đến (viết mã để khởi tạo và kiểm tra hàng trăm thành viên và các điểm dữ liệu) dường như không thể chịu nổi tẻ nhạt.

Có giải pháp nào tốt hơn không?

+0

Nếu bạn đang thử nghiệm dữ liệu, tôi cho rằng bạn phải chạm vào đĩa. – MrBoJangles

+0

Nếu bạn có thể giả mạo dữ liệu, bạn có thể tạo dữ liệu trong bộ nhớ - nhưng nếu đó là dữ liệu thực mà bạn muốn kiểm tra thì bạn sẽ phải đọc nó từ đĩa. Tôi không biết bạn đang mô tả loại dữ liệu nào, nhưng bạn có thể đọc nó thành một tệp văn bản và biên dịch nó với mã của bạn, trong bộ nhớ, có lẽ. – pc1oad1etter

Trả lời

1

Đây vẫn là phương pháp khả thi. Mặc dù, tôi sẽ phân loại này như là một bài kiểm tra chức năng, hoặc không phải là một bài kiểm tra đơn vị thuần túy. Một bài kiểm tra đơn vị tốt sẽ là lấy một bản mẫu của những hồ sơ đó cho phép phân phối tốt các trường hợp cạnh mà bạn có thể gặp phải và viết chúng lên. Sau đó, bạn có thử nghiệm "chấp nhận" hoặc "chức năng" cuối cùng của mình với thử nghiệm hàng loạt trên tất cả dữ liệu.

Tôi đã sử dụng phương pháp này khi kiểm tra lượng lớn dữ liệu và tôi thấy nó hoạt động đủ tốt vì các đơn vị nhỏ có thể duy trì và sau đó tôi biết rằng thử nghiệm hàng loạt hoạt động và tất cả đều tự động.

3

Nếu những gì bạn đang cố gắng đạt được là, trên thực tế, một thử nghiệm đơn vị bạn nên giả lập các cấu trúc dữ liệu cơ bản và mô phỏng dữ liệu. Kỹ thuật này cho phép bạn kiểm soát hoàn toàn các đầu vào. Ví dụ, mỗi bài kiểm tra bạn viết có thể xử lý một điểm dữ liệu duy nhất và bạn sẽ có một tập hợp rất ngắn gọn các bài kiểm tra cho từng điều kiện. Có một số khung mocking nguồn mở ra khỏi đó, cá nhân tôi khuyên bạn nên Rhino Mocks (http://ayende.com/projects/rhino-mocks/downloads.aspx) hoặc NMock (http://www.nmock.org).

Nếu bạn không thể giả lập cấu trúc dữ liệu, tôi khuyên bạn nên tái cấu trúc để bạn có thể :-) Giá trị của nó! Hoặc bạn cũng có thể thử dùng TypeMock (http://www.typemock.com/) cho phép chế nhạo các lớp cụ thể.

Nếu, tuy nhiên, nếu bạn đang thực hiện các thử nghiệm đối với các tập dữ liệu lớn, bạn thực sự đang chạy thử nghiệm chức năng chứ không phải kiểm tra đơn vị. Trong trường hợp tải dữ liệu vào cơ sở dữ liệu hoặc từ đĩa là một hoạt động điển hình. Thay vì tránh nó, bạn nên làm việc để làm cho nó chạy song song với phần còn lại của quá trình xây dựng tự động của bạn để tác động hiệu suất không giữ bất kỳ nhà phát triển nào của bạn.

1

Cách tiếp cận tốt nhất mà tôi đã tìm thấy là sắp xếp tuần tự các cấu trúc hoặc tập dữ liệu từ đĩa, thực hiện các hoạt động đang thử nghiệm, tuần tự hóa kết quả vào đĩa, sau đó phân biệt các tệp có chứa kết quả được tuần tự hóa các kết quả.

Tôi đã viết mã sử dụng kỹ thuật trên ngoại trừ thay vì nối tiếp từ đĩa trong thử nghiệm, tôi đã chuyển đổi dữ liệu tuần tự thành mảng byte mà trình biên dịch có thể đặt vào tệp thực thi cho bạn.

Ví dụ, dữ liệu đăng của bạn có thể được chuyển đổi thành:

unsigned char mySerialisedData[] = { 0xFF, 0xFF, 0xFF, 0xFF, ... }; 

test() 
{ 
    MyStruct* s = (MyStruct*) mySerialisedData; 

} 

Đối với một ví dụ tiết hơn (trong C#) thấy unit test này. Nó cho thấy một ví dụ về việc sử dụng một số dữ liệu tuần tự được mã hóa cứng làm đầu vào cho các thử nghiệm, kiểm tra việc ký kết lắp ráp.