Shorter output for rustc --test
binaries.
A program created with `rustc --test` prints at least one line per test. This can be very verbose, especially with [data-driven tests]( https://internals.rust-lang.org/t/test-and-external-test-harnesses/3145) when hundreds or thousands of tests is not rare. This adds a `-q` or `--quiet` option that changes the output to one character instead of one line per test (except metrics and benchmarks results which have additional data to show): ``` Running target/debug/wpt-75c594dc1e6e6187 running 314 tests .............................................................................. .............................................................................. .............................................................................. .............................................................................. .. test result: ok. 314 passed; 0 failed; 0 ignored; 0 measured ``` This is a breaking change since the `test::TestOpts` struct now has one more field.
This commit is contained in:
parent
c116ae35cf
commit
bbb45c41df
@ -155,5 +155,8 @@ pub struct Config {
|
||||
pub lldb_python_dir: Option<String>,
|
||||
|
||||
// Explain what's going on
|
||||
pub verbose: bool
|
||||
pub verbose: bool,
|
||||
|
||||
// Print one character per test instead of one line
|
||||
pub quiet: bool,
|
||||
}
|
||||
|
@ -78,6 +78,7 @@ pub fn parse_config(args: Vec<String> ) -> Config {
|
||||
optopt("", "host-rustcflags", "flags to pass to rustc for host", "FLAGS"),
|
||||
optopt("", "target-rustcflags", "flags to pass to rustc for target", "FLAGS"),
|
||||
optflag("", "verbose", "run tests verbosely, showing all output"),
|
||||
optflag("", "quiet", "print one character per test instead of one line"),
|
||||
optopt("", "logfile", "file to log test execution to", "FILE"),
|
||||
optopt("", "target", "the target to build for", "TARGET"),
|
||||
optopt("", "host", "the host to build for", "HOST"),
|
||||
@ -158,6 +159,7 @@ fn opt_path(m: &getopts::Matches, nm: &str) -> PathBuf {
|
||||
!opt_str2(matches.opt_str("adb-test-dir")).is_empty(),
|
||||
lldb_python_dir: matches.opt_str("lldb-python-dir"),
|
||||
verbose: matches.opt_present("verbose"),
|
||||
quiet: matches.opt_present("quiet"),
|
||||
}
|
||||
}
|
||||
|
||||
@ -191,6 +193,7 @@ pub fn log_config(config: &Config) {
|
||||
logv(c, format!("adb_device_status: {}",
|
||||
config.adb_device_status));
|
||||
logv(c, format!("verbose: {}", config.verbose));
|
||||
logv(c, format!("quiet: {}", config.quiet));
|
||||
logv(c, format!("\n"));
|
||||
}
|
||||
|
||||
@ -257,6 +260,7 @@ pub fn test_opts(config: &Config) -> test::TestOpts {
|
||||
Some(ref filter) => Some(filter.clone()),
|
||||
},
|
||||
run_ignored: config.run_ignored,
|
||||
quiet: config.quiet,
|
||||
logfile: config.logfile.clone(),
|
||||
run_tests: true,
|
||||
bench_benchmarks: true,
|
||||
|
@ -109,7 +109,7 @@ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy)]
|
||||
#[derive(Clone, Copy, PartialEq, Eq)]
|
||||
enum NamePadding {
|
||||
PadNone,
|
||||
PadOnRight,
|
||||
@ -301,6 +301,7 @@ pub struct TestOpts {
|
||||
pub logfile: Option<PathBuf>,
|
||||
pub nocapture: bool,
|
||||
pub color: ColorConfig,
|
||||
pub quiet: bool,
|
||||
}
|
||||
|
||||
impl TestOpts {
|
||||
@ -314,6 +315,7 @@ fn new() -> TestOpts {
|
||||
logfile: None,
|
||||
nocapture: false,
|
||||
color: AutoColor,
|
||||
quiet: false,
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -331,6 +333,7 @@ fn optgroups() -> Vec<getopts::OptGroup> {
|
||||
of stdout", "PATH"),
|
||||
getopts::optflag("", "nocapture", "don't capture stdout/stderr of each \
|
||||
task, allow printing directly"),
|
||||
getopts::optflag("q", "quiet", "Display one character per test instead of one line"),
|
||||
getopts::optopt("", "color", "Configure coloring of output:
|
||||
auto = colorize if stdout is a tty and tests are run on serially (default);
|
||||
always = always colorize output;
|
||||
@ -388,6 +391,7 @@ pub fn parse_opts(args: &[String]) -> Option<OptRes> {
|
||||
};
|
||||
|
||||
let run_ignored = matches.opt_present("ignored");
|
||||
let quiet = matches.opt_present("quiet");
|
||||
|
||||
let logfile = matches.opt_str("logfile");
|
||||
let logfile = logfile.map(|s| PathBuf::from(&s));
|
||||
@ -420,6 +424,7 @@ pub fn parse_opts(args: &[String]) -> Option<OptRes> {
|
||||
logfile: logfile,
|
||||
nocapture: nocapture,
|
||||
color: color,
|
||||
quiet: quiet,
|
||||
};
|
||||
|
||||
Some(Ok(test_opts))
|
||||
@ -451,6 +456,7 @@ struct ConsoleTestState<T> {
|
||||
log_out: Option<File>,
|
||||
out: OutputLocation<T>,
|
||||
use_color: bool,
|
||||
quiet: bool,
|
||||
total: usize,
|
||||
passed: usize,
|
||||
failed: usize,
|
||||
@ -476,6 +482,7 @@ pub fn new(opts: &TestOpts, _: Option<T>) -> io::Result<ConsoleTestState<io::Std
|
||||
out: out,
|
||||
log_out: log_out,
|
||||
use_color: use_color(opts),
|
||||
quiet: opts.quiet,
|
||||
total: 0,
|
||||
passed: 0,
|
||||
failed: 0,
|
||||
@ -488,15 +495,15 @@ pub fn new(opts: &TestOpts, _: Option<T>) -> io::Result<ConsoleTestState<io::Std
|
||||
}
|
||||
|
||||
pub fn write_ok(&mut self) -> io::Result<()> {
|
||||
self.write_pretty("ok", term::color::GREEN)
|
||||
self.write_short_result("ok", ".", term::color::GREEN)
|
||||
}
|
||||
|
||||
pub fn write_failed(&mut self) -> io::Result<()> {
|
||||
self.write_pretty("FAILED", term::color::RED)
|
||||
self.write_short_result("FAILED", "F", term::color::RED)
|
||||
}
|
||||
|
||||
pub fn write_ignored(&mut self) -> io::Result<()> {
|
||||
self.write_pretty("ignored", term::color::YELLOW)
|
||||
self.write_short_result("ignored", "i", term::color::YELLOW)
|
||||
}
|
||||
|
||||
pub fn write_metric(&mut self) -> io::Result<()> {
|
||||
@ -507,6 +514,16 @@ pub fn write_bench(&mut self) -> io::Result<()> {
|
||||
self.write_pretty("bench", term::color::CYAN)
|
||||
}
|
||||
|
||||
pub fn write_short_result(&mut self, verbose: &str, quiet: &str, color: term::color::Color)
|
||||
-> io::Result<()> {
|
||||
if self.quiet {
|
||||
self.write_pretty(quiet, color)
|
||||
} else {
|
||||
try!(self.write_pretty(verbose, color));
|
||||
self.write_plain("\n")
|
||||
}
|
||||
}
|
||||
|
||||
pub fn write_pretty(&mut self, word: &str, color: term::color::Color) -> io::Result<()> {
|
||||
match self.out {
|
||||
Pretty(ref mut term) => {
|
||||
@ -550,28 +567,28 @@ pub fn write_run_start(&mut self, len: usize) -> io::Result<()> {
|
||||
}
|
||||
|
||||
pub fn write_test_start(&mut self, test: &TestDesc, align: NamePadding) -> io::Result<()> {
|
||||
let name = test.padded_name(self.max_name_len, align);
|
||||
self.write_plain(&format!("test {} ... ", name))
|
||||
if self.quiet && align != PadOnRight {
|
||||
Ok(())
|
||||
} else {
|
||||
let name = test.padded_name(self.max_name_len, align);
|
||||
self.write_plain(&format!("test {} ... ", name))
|
||||
}
|
||||
}
|
||||
|
||||
pub fn write_result(&mut self, result: &TestResult) -> io::Result<()> {
|
||||
try!(match *result {
|
||||
match *result {
|
||||
TrOk => self.write_ok(),
|
||||
TrFailed => self.write_failed(),
|
||||
TrIgnored => self.write_ignored(),
|
||||
TrMetrics(ref mm) => {
|
||||
try!(self.write_metric());
|
||||
self.write_plain(&format!(": {}", mm.fmt_metrics()))
|
||||
self.write_plain(&format!(": {}\n", mm.fmt_metrics()))
|
||||
}
|
||||
TrBench(ref bs) => {
|
||||
try!(self.write_bench());
|
||||
|
||||
try!(self.write_plain(&format!(": {}", fmt_bench_samples(bs))));
|
||||
|
||||
Ok(())
|
||||
self.write_plain(&format!(": {}\n", fmt_bench_samples(bs)))
|
||||
}
|
||||
});
|
||||
self.write_plain("\n")
|
||||
}
|
||||
}
|
||||
|
||||
pub fn write_log(&mut self, test: &TestDesc, result: &TestResult) -> io::Result<()> {
|
||||
@ -629,9 +646,9 @@ pub fn write_run_finish(&mut self) -> io::Result<bool> {
|
||||
try!(self.write_plain("\ntest result: "));
|
||||
if success {
|
||||
// There's no parallelism at this point so it's safe to use color
|
||||
try!(self.write_ok());
|
||||
try!(self.write_pretty("ok", term::color::GREEN));
|
||||
} else {
|
||||
try!(self.write_failed());
|
||||
try!(self.write_pretty("FAILED", term::color::RED));
|
||||
}
|
||||
let s = format!(". {} passed; {} failed; {} ignored; {} measured\n\n",
|
||||
self.passed,
|
||||
@ -758,6 +775,7 @@ fn should_sort_failures_before_printing_them() {
|
||||
log_out: None,
|
||||
out: Raw(Vec::new()),
|
||||
use_color: false,
|
||||
quiet: false,
|
||||
total: 0,
|
||||
passed: 0,
|
||||
failed: 0,
|
||||
|
Loading…
Reference in New Issue
Block a user