2012-02-07 26 views
37

Trong tuần qua tôi đã tạo ra hai lớp mà nhóm của tôi đã bày tỏ một số lo ngại về hiệu suất của họ. Để đánh giá mã của tôi, tôi đã viết một số bài kiểm tra JUnit đơn giản thực hiện các lớp này bằng cách xây dựng các bộ dữ liệu thử nghiệm phong phú, sau đó cho dữ liệu đó thông qua các phương thức có liên quan cho hàng nghìn lần lặp. Tôi ghi lại thời gian chạy của mỗi lần lặp lại sau đó ghi lại thời gian cao, thấp và trung bình bằng cách sử dụng vòng lặp và System.nanoTime(). Cuối cùng tôi đã có JUnit khẳng định rằng thời gian cao và trung bình nằm trong giới hạn chấp nhận được. Cách tiếp cận thử nghiệm này đã giúp nhóm của tôi tự tin vào mã này.JUnit là công cụ thích hợp để viết các bài kiểm tra hiệu suất?

JUnit có đúng công cụ để kiểm tra hiệu suất theo cách này không? Có công cụ tốt hơn để kiểm tra hiệu suất ở cấp độ đơn vị (phương pháp và lớp) không?

Trả lời

37

Có thể có các cách tiếp cận tốt hơn, nhưng cũng có một số khung công tác giúp thực hiện đo điểm chuẩn với JUnit. Một số thực hành hữu ích là các hoạt động khởi động, các đánh giá thống kê. Hãy nhìn vào JUnitBenchmarksJUnitPerf

EDIT trông giống như JUnitBenchmarks đã bị phản đối kể từ khi câu hỏi đã được nêu. Những người bảo trì của dự án khuyên bạn nên chuyển sang số JMH. Cảm ơn bạn, Barry NL cho người đứng đầu.

+1

Tôi chấp nhận điều này vì tôi và nhóm của tôi có mối quan hệ mạnh mẽ đối với việc tích hợp JUnit với các tùy chọn này. @Pangea đã có một câu trả lời tuyệt vời cho điểm chuẩn w/o hội nhập Junit. – Freiheit

+1

Dự án của chúng tôi đã triển khai JUnit cho tất cả các bài kiểm tra đơn vị của chúng tôi. Mở rộng chúng thành thử nghiệm hiệu suất với khung công tác JUnitPerf rất dễ dàng và có ý nghĩa. –

+0

Tuyệt vời, vui mừng câu trả lời này vẫn hữu ích :) – kostja

21

No. JUnit được thiết kế để kiểm tra đơn vị. Có rất nhiều thứ cần phải được chăm sóc trong khi viết các bài kiểm tra hiệu năng trong Java. Sử dụng Google Caliper được thiết kế đặc biệt để viết thử nghiệm micro-benchmark.

Nhìn vào How do I write a correct micro-benchmark in Java?

+0

Chính xác những gì tôi định giới thiệu :) – Brice

+0

Google Caliper dường như không phải là một dự án thành công. Họ vẫn đang trong giai đoạn thử nghiệm từ 2 năm nay. – JeanValjean

6

Bài kiểm tra của bạn nên được xác định tốt hơn làm bài kiểm tra điểm chuẩn. Có, JUnit có thể được sử dụng theo cách này mặc dù nó không phải là sự lựa chọn tốt nhất. Nhưng bạn có thể ví dụ: xác định max. thời gian đánh giá để kiểm tra, do đó, nếu thuật toán được thay đổi gây ra sự xuống cấp hiệu suất thì thử nghiệm không thành công. Sử dụng @Test(timeout=12345) để định cấu hình.

Nếu bạn cần thử nghiệm hiệu năng thực sự, hãy nghĩ về JMeter.

-5

JUnit được thiết kế nhiều hơn cho kiểm tra đơn vị, có lẽ TestNG sẽ là một lựa chọn tốt hơn trong trường hợp này, đặc biệt là tính năng @Dataprovider của nó:

//This method will provide data to any test method that declares that its Data Provider 
//is named "test1" 
@DataProvider(name = "test1") 
public Object[][] createData1() { 
return new Object[][] { 
    { "Cedric", new Integer(36) }, 
    { "Anne", new Integer(37)}, 
}; 
} 

//This test method declares that its data should be supplied by the Data Provider 
//named "test1" 
@Test(dataProvider = "test1") 
public void verifyData1(String n1, Integer n2) { 
System.out.println(n1 + " " + n2); 
} 

Đây là specific doc.

+2

JUnit hỗ trợ rất giống @Parameterized. – nes1983

Các vấn đề liên quan