2008-09-19 43 views
5

Tôi đang chạy một số kiểm tra JUnit trên các ứng dụng của mình. Mỗi thử nghiệm có vòng lặp for gọi phương thức tương ứng 10000 lần. Các phương pháp thử nghiệm tạo ra rất nhiều nhật ký. Các nhật ký này cũng được JUnit thu thập tự động làm kết quả kiểm tra. Tình huống này sẽ xảy ra với OutOfMemoryError vì bộ đệm chuỗi trong đó JUnit giữ đầu ra trở nên quá lớn. Tôi không cần những bản ghi này trong khi thử nghiệm, vì vậy nếu có cách nào để nói với JUnit "đừng giữ đầu ra chương trình" thì nó sẽ là đủ. Bất kỳ ý tưởng nào?Đầu ra Junit và OutOfMemoryError

Trả lời

3

Bạn đang sử dụng loại ghi nhật ký nào? Có cách nào bạn có thể ghi đè lên hành vi đăng nhập mặc định để bỏ qua tất cả các thông điệp tường trình không?

1

Một số tùy chọn:

  1. Thay đổi đăng nhập của bạn để nó bãi vào một tập tin thay vì đầu ra tiêu chuẩn.
  2. Tăng kích thước heap tối đa với -Xmx <some number>M, như -Xmx 256M.
0

Tôi chỉ tăng bộ nhớ khả dụng .. Hãy thử thêm -Xmx256m -Xmx256m vào máy ảo của bạn.

0

Giải pháp là ghi đè thuộc tính ghi nhật ký. Bây giờ tôi vô hiệu hóa đăng nhập và tất cả dường như làm việc (kiểm tra vẫn đang chạy). Nếu nó hoạt động, tôi sẽ cấu hình một cách để đăng nhập vào một tập tin. Xin cảm ơn tất cả mọi người (và chúc mừng Jeff & bạn bè cho trang này).

0

Tôi thấy rằng một câu trả lời đã được chấp nhận, nhưng đây là những gì tôi đã nộp nếu tôi đã nhận được nó gõ lên và thử nghiệm nhanh hơn:

Nếu bằng cách "khai thác gỗ" bạn có nghĩa là System.out.println() hoặc System.err.println() và nếu bạn chắc chắn rằng thử nghiệm của mình thực sự không cần nhật ký, thì bạn có thể chuyển hướng stdout và stderr theo chương trình.

// Save the original stdout and stderr 
PrintStream psOut = System.out; 
PrintStream psErr = System.err; 
PrintStream psDevNull = null; 
try 
{ 
    // Send stdout and stderr to /dev/null 
    psDevNull = new PrintStream(new ByteArrayOutputStream()); 
    System.setOut(psDevNull); 
    System.setErr(psDevNull); 
    // run tests in loop 
    for (...) 
    { 
    } 
} 
finally 
{ 
    // Restore stdout and stderr 
    System.setOut(psOut); 
    System.setErr(psErr); 
    if (psDevNull != null) 
    { 
     psDevNull.close(); 
     psDevNull = null; 
    } 
} 

Bằng cách này, sản lượng thử nghiệm của bạn sẽ bị vô hiệu, nhưng sản lượng khác từ JUnit sẽ không được, vì nó sẽ được nếu bạn sử dụng chuyển hướng trên dòng lệnh như thế này:

ant test &> /dev/null 

Các chuyển hướng dòng lệnh làm cho tất cả đầu ra của Ant/JUnit được chuyển hướng, không chỉ là những gì đến từ lớp bạn đang thử nghiệm, vì vậy đó có thể không phải là những gì bạn muốn. Việc chuyển hướng có lập trình chỉ làm cho các bản in/ghi vào System.out và System.err trong chương trình của bạn được chuyển hướng, và bạn vẫn sẽ nhận được kết quả từ Ant và JUnit.

0

Nếu có bất kỳ trợ giúp nào, hãy đặt outputtoformatters = "no" giải quyết tất cả các vấn đề bộ nhớ của tôi (trong Ant 1.7.1 điều này ngăn cản đầu ra được tạo ra bởi các kiểm tra được gửi đến các trình kiểm tra).

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