2015-05-11 16 views
9

Tôi có một thùng chứa mã sản xuất trong các bài kiểm tra thư mục và tích hợp src trong thư mục tests. Mã sản xuất sử dụng các macro log.Cách khởi tạo trình ghi nhật ký để kiểm tra tích hợp?

Tôi muốn bắt đầu trình ghi nhật ký toàn cầu khi chạy thử nghiệm tích hợp (ví dụ: env_logger::init().unwrap();) Có một số kiểm tra và thứ tự kiểm tra không được xác định, vì vậy tôi không biết thử nghiệm nào nên đặt lệnh khởi tạo.

Có cách nào để tôi có thể thực hiện điều này một cách độc đáo không? Có lẽ bằng cách ghi đè các chức năng main?

Trả lời

5

Không có cách nào tốt để thực hiện loại nội dung này được tích hợp ngay bây giờ.

Bạn có thể viết macro chèn một số loại cuộc gọi khởi tạo trước mỗi bài kiểm tra, nhưng điều đó gần như có.

1

Hiện tại, bạn chỉ có thể khởi tạo lại trình ghi nhật ký ở đầu mỗi thử nghiệm và bỏ qua lỗi. Nó không phải là một giải pháp khá nhưng nó hoạt động và hoàn toàn an toàn.

let _ = env_logger::init(); 

// your test code... 
4

Bạn có thể sử dụng một cái gì đó như thế này:

use std::sync::{Once, ONCE_INIT}; 

static INIT: Once = ONCE_INIT; 

/// Setup function that is only run once, even if called multiple times. 
fn setup() { 
    INIT.call_once(|| { 
     env_logger::init().unwrap(); 
    }); 
} 

Sau đó, chỉ cần gọi setup() vào đầu mỗi bài kiểm tra.

Được dựa trên this blogpost.

0

Tôi đã quan sát thấy cargo test chạy thử nghiệm theo thứ tự bảng chữ cái, vì vậy tôi đã tạo ra một hack rất bẩn để khởi tạo trình ghi nhật ký.

  1. Tôi đã tạo mô-đun gọi là aaa_testing nằm bên trong thư mục gốc của thùng.
  2. Bên trong mô-đun, tôi đã viết trình khởi tạo trình ghi nhật ký.

    #[test] 
    fn initialize_logger() { 
        env_logger::init(); 
    } 
    

Có, tôi đã tạo ra một bài kiểm tra đó sẽ luôn luôn vượt qua, nhưng nếu bạn muốn có một thử nghiệm cho khởi tạo logger, bạn có thể làm một assert!(env_logger::try_init().is_ok());


Shepmaster chỉ ra rằng cargo test chạy thử nghiệm không đồng bộ và có thể ghi nhật ký của một vài thử nghiệm đầu tiên không đáng tin cậy. Để ngăn chặn điều này, các bài kiểm tra có thể được chạy trong cùng một luồng. (Điều này sẽ gây ra vấn đề hiệu suất, nên câu trả lời này không nên được sử dụng nếu bạn cần nhiều chủ đề để kiểm tra dự án của bạn.)

Nếu bạn muốn kiểm soát số lượng test chạy đồng thời, thông qua các tùy chọn --test-threads đến chương trình thử nghiệm:

cargo test -- --test-threads=1 
+0

Đây là một ý tưởng rất xấu vì chở hàng chạy thử nghiệm song song theo mặc định. Điều này có khả năng sẽ giới thiệu flakiness thử nghiệm cho vài bài kiểm tra đầu tiên được chạy cùng một lúc như thế này. – Shepmaster

+0

Huh, tôi không biết điều đó, chúng không song đối với tôi. Cảm ơn các mẹo mặc dù. Ok tôi phát hiện ra từ 'kiểm tra hàng hóa - giúp đỡ 'rằng số lượng chủ đề thử nghiệm là số CPU mà tôi có. Tôi sẽ cập nhật câu trả lời cần lưu ý. –

+0

[Chúng chạy song song theo mặc định] (https://doc.rust-lang.org/stable/book/second-edition/ch11-02-running-tests.html#running-tests-in-parallel-or- liên tiếp), vì vậy trừ khi bạn đã vô hiệu hóa điều này một cách rõ ràng, nó vẫn sẽ ảnh hưởng đến các thử nghiệm. – Shepmaster

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