왜 프린트하지 않습니까! 녹 단위 시험에서 일합니까?
다음 방법과 단위 테스트를 구현했습니다.
use std::fs::File;
use std::path::Path;
use std::io::prelude::*;
fn read_file(path: &Path) {
let mut file = File::open(path).unwrap();
let mut contents = String::new();
file.read_to_string(&mut contents).unwrap();
println!("{}", contents);
}
#[test]
fn test_read_file() {
let path = &Path::new("/etc/hosts");
println!("{:?}", path);
read_file(path);
}
이 방법으로 단위 테스트를 실행합니다.
rustc --test app.rs; ./app
나는 또한 이것을 실행할 수있다
cargo test
테스트가 통과되었다는 메시지가 다시 나타나지만 println!
화면에는 표시되지 않습니다. 왜 안돼?
이는 Rust 테스트 프로그램이 테스트 출력을 깔끔하게하기 위해 성공적인 테스트의 표준을 숨기기 때문에 발생합니다. --nocapture
옵션을 테스트 바이너리 또는 다음 으로 전달하여이 동작을 비활성화 할 수 있습니다 cargo test
.
#[test]
fn test() {
println!("Hidden output")
}
테스트 호출 :
% rustc --test main.rs; ./main
running 1 test
test test ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured
% ./main --nocapture
running 1 test
Hidden output
test test ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured
% cargo test -- --nocapture
running 1 test
Hidden output
test test ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured
그러나 테스트에 실패하면이 옵션이 있는지 여부에 관계없이 stdout이 인쇄됩니다.
TL; DR
$ cargo test -- --nocapture
다음 코드로
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum PieceShape {
King, Queen, Rook, Bishop, Knight, Pawn
}
fn main() {
println!("Hello, world!");
}
#[test]
fn demo_debug_format() {
let q = PieceShape::Queen;
let p = PieceShape::Pawn;
let k = PieceShape::King;
println!("q={:?} p={:?} k={:?}", q, p, k);
}
그런 다음 다음을 실행하십시오.
$ cargo test -- --nocapture
그리고 당신은 볼 수
Running target/debug/chess-5d475d8baa0176e4
running 1 test
q=Queen p=Pawn k=King
test demo_debug_format ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured
테스트하는 동안 표준 출력이 표시되지 않습니다. 테스트하지만 문자 메시지를 사용하지 마십시오 assert!
, assert_eq!
그리고 fail!
대신. Rust의 단위 테스트 시스템은 문자 메시지가 아닌 이러한 내용을 이해할 수 있습니다.
어떤 문제가 있어도 작성한 시험은 통과합니다. 이유를 보자 :
read_to_end
의 서명은 fn read_to_end(&mut self) -> IoResult<Vec<u8>>
IoResult
성공 또는 오류를 나타 내기 위해 를 반환합니다 . 이것은 Result
오류 값이에 대한 유형 def입니다 IoError
. 오류 처리 방법을 결정하는 것은 사용자의 책임입니다. 이 경우, 우리는 호출하여 수행됩니다 실패 작업, 원하는 unwrap
온을 Result
.
이것은 작동합니다 :
let contents = File::open(&Path::new("message.txt"))
.read_to_end()
.unwrap();
unwrap
그래도 남용해서는 안됩니다.
println!()
테스트 결과에 인쇄물을 포함 하고 색상을 유지하려면 color
및의 nocapture
플래그를 사용하십시오 cargo test
.
$ cargo test -- --color always --nocapture
(화물 버전 : 야간 0.13.0)
참고 URL : https://stackoverflow.com/questions/25106554/why-doesnt-println-work-in-rust-unit-tests
'IT story' 카테고리의 다른 글
"android.R.layout.simple_list_item_1"은 무엇입니까? (0) | 2020.04.17 |
---|---|
Git에서 오리진 / 마스터와 오리진 마스터의 차이점은 무엇입니까? (0) | 2020.04.17 |
컨텍스트를 전달하는 동안 expressjs로 리디렉션하려면 어떻게해야합니까? (0) | 2020.04.17 |
부울 연산자 && 및 || (0) | 2020.04.17 |
객체 지향 프로젝트를 어떻게 디자인합니까? (0) | 2020.04.17 |