Saya telah menerapkan metode dan unit test berikut:
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);
}
Saya menjalankan tes unit dengan cara ini:
rustc --test app.rs; ./app
Saya juga bisa menjalankan ini
cargo test
Saya mendapatkan pesan kembali yang mengatakan bahwa tes telah lulus tetapi println!
tidak pernah ditampilkan di layar. Kenapa tidak?
--nocapture
opsi untukcargo test
, tetapi kargo tidak mengenali bendera ini untuk saya (menggunakan nightly terbaru dari rustup.sh). Apakah Anda yakin itu akan berhasil?cargo test -- --nocapture
, itu harus bekerja.cargo test [--] --bench
untuk bekerja juga!nocapture
, bukanno-capture
.TL; DR
Dengan kode berikut:
Kemudian jalankan yang berikut ini:
Dan Anda harus melihatnya
sumber
cargo test -- --no-capture
tidak lagi berfungsi. Saya mendapatkan kesalahan berikut:thread '<main>' panicked at '"Unrecognized option: \'no-capture\'."', ../src/libtest/lib.rs:249
--nocapture
tidak--no-capture
. Namun, itu adalah kesalahan yang sangat jelas untuk membuat sebagian besar konvensi baris perintah yang cenderung kita temui. Saya hanya menggunakan opsi ini persis seperti yang dijelaskan dalam jawaban ini di karat 1.1 (kargo 0.2.0) dan bekerja persis seperti yang diiklankan.Untuk menyertakan hasil cetak dengan
println!()
dan menyimpan warna untuk hasil pengujian, gunakan tandacolor
dannocapture
masukcargo test
.(versi kargo: 0.13.0 setiap malam)
sumber
Saat pengujian, output standar tidak ditampilkan. Jangan gunakan pesan teks untuk pengujian tetapi
assert!
,assert_eq!
, danfail!
sebagai gantinya. Sistem pengujian unit Rust dapat memahami hal ini tetapi tidak mengirim pesan teks.Tes yang Anda tulis akan lulus bahkan jika ada masalah. Mari kita lihat mengapa:
read_to_end
Tanda tangan adalahfn read_to_end(&mut self) -> IoResult<Vec<u8>>
Mengembalikan tanda
IoResult
untuk menunjukkan keberhasilan atau kesalahan. Ini hanya tipe def untukResult
nilai kesalahan yang merupakanIoError
. Terserah Anda untuk memutuskan bagaimana kesalahan harus ditangani. Dalam hal ini, kami ingin tugas gagal, yang dilakukan dengan memanggilunwrap
padaResult
.Ini akan berhasil:
unwrap
seharusnya tidak digunakan secara berlebihan.sumber