Pourquoi ne pas println! travailler dans la Rouille des tests unitaires?
J'ai implémenté la méthode suivante et de test de l'unité:
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);
}
Je lance le test de l'unité de cette façon:
rustc --test app.rs; ./app
Je pourrais également exécuter cette avec
cargo test
Je reçois un message disant que le test réussi, mais le println!
n'est jamais affiché sur l'écran. Pourquoi pas?
Vous devez vous connecter pour publier un commentaire.
Cela se produit parce que la Rouille des programmes de test de masquer le stdout de la réussite des tests en vue de la sortie d'un test pour être rangé. Vous pouvez désactiver ce comportement, en passant par la
--nocapture
option binaire de test ou decargo test
:Invoquant tests:
Si les tests échouent, toutefois, leurs stdout sera imprimé, peu importe si cette option est présente ou non.
--nocapture
option pourcargo test
, mais le fret ne pas reconnaître ce drapeau pour moi (à l'aide de la dernière nightly de rustup.sh). Êtes-vous sûr que cela devrait fonctionner?cargo test -- --nocapture
, il devrait fonctionner.cargo test [--] --bench
à trop de travail!cargo test -- --no-capture
ne fonctionne plus. J'obtiens l'erreur suivante:thread '<main>' panicked at '"Unrecognized option: \'no-capture\'."', ../src/libtest/lib.rs:249
nocapture
, pasno-capture
.--package
et--exact
drapeau si vous avez une grosse base de codecargo test --package <package_name> <file_name>::<mod_name>::<test_name> -- --nocapture --exact
.TL;DR
Avec le code suivant:
Puis exécutez la commande suivante:
Et vous devriez voir
cargo test -- --no-capture
ne fonctionne plus. J'obtiens l'erreur suivante:thread '<main>' panicked at '"Unrecognized option: \'no-capture\'."', ../src/libtest/lib.rs:249
--nocapture
, pas--no-capture
. Cependant, c'est tout à fait erreur évidente à faire étant donné la plupart de la ligne de commande conventions, nous avons tendance à venir à travers. J'ai simplement utilisé cette option exactement comme décrit dans la réponse à cette question de la rouille 1.1 (cargo 0.2.0) et cela a fonctionné exactement comme annoncé.Lors du test, la sortie standard n'est pas affiché. N'utilisez pas de texte de messages pour des tests, mais
assert!
,assert_eq!
, etfail!
à la place. La rouille de l'unité du système de test peut comprendre, mais pas des messages texte.Le test que vous avez écrit va passer, même si quelque chose va mal. Voyons pourquoi:
read_to_end
signature de l'estfn read_to_end(&mut self) -> IoResult<Vec<u8>>
Elle renvoie un
IoResult
pour indiquer le succès ou d'erreur. C'est juste un type de def pour unResult
dont la valeur de l'erreur est unIoError
. C'est à vous de décider comment une erreur doit être traitée. Dans ce cas, nous voulons que la tâche de l'échec, ce qui est fait en appelant launwrap
sur leResult
.Cela fonctionne:
unwrap
ne doit pas être galvaudé bien.D'inclure des imprimés avec
println!()
et de garder les couleurs pour les résultats des tests, l'utilisation de lacolor
etnocapture
drapeaux danscargo test
.(version cargo: 0.13.0 tous les soirs)