Auto merge of #36604 - japaric:libtest-skip, r=alexcrichton

libtest: add a --skip flag to the test runner

This flag takes a FILTER argument and instructs the test runner to skip
the tests whose names contain the word FILTER. --skip can be used
several times.

---

My motivation for submitting this is that while using [smoke] to run `std` unit tests for cross
targets I found that a few of the tests always fail due to limitations in QEMU (it can't handle too
many threads) and I'd like to skip these problematic tests from the command line to be able to run
the rest of the unit tests.

[smoke]: https://github.com/japaric/smoke

I know there is another mechanism to skip tests: `#[ignore]` but this doesn't work in my use case
because I can't (easily) modify the source of the standard libraries to `#[ignore]` some tests. And
even if I could, the change would involve conditionally ignoring some tests for some targets but
that's not a perfect solution because those tests should pass if executed on real hardware so they
should not be `#[ignored]` in that scenario.

r? @alexcrichton
cc @brson
This commit is contained in:
bors 2016-09-28 00:38:07 -07:00 committed by GitHub
commit d75c84af80
2 changed files with 11 additions and 0 deletions

View File

@ -303,6 +303,7 @@ pub struct TestOpts {
pub color: ColorConfig, pub color: ColorConfig,
pub quiet: bool, pub quiet: bool,
pub test_threads: Option<usize>, pub test_threads: Option<usize>,
pub skip: Vec<String>,
} }
impl TestOpts { impl TestOpts {
@ -318,6 +319,7 @@ impl TestOpts {
color: AutoColor, color: AutoColor,
quiet: false, quiet: false,
test_threads: None, test_threads: None,
skip: vec![],
} }
} }
} }
@ -337,6 +339,8 @@ fn optgroups() -> Vec<getopts::OptGroup> {
task, allow printing directly"), task, allow printing directly"),
getopts::optopt("", "test-threads", "Number of threads used for running tests \ getopts::optopt("", "test-threads", "Number of threads used for running tests \
in parallel", "n_threads"), in parallel", "n_threads"),
getopts::optmulti("", "skip", "Skip tests whose names contain FILTER (this flag can \
be used multiple times)","FILTER"),
getopts::optflag("q", "quiet", "Display one character per test instead of one line"), getopts::optflag("q", "quiet", "Display one character per test instead of one line"),
getopts::optopt("", "color", "Configure coloring of output: getopts::optopt("", "color", "Configure coloring of output:
auto = colorize if stdout is a tty and tests are run on serially (default); auto = colorize if stdout is a tty and tests are run on serially (default);
@ -446,6 +450,7 @@ pub fn parse_opts(args: &[String]) -> Option<OptRes> {
color: color, color: color,
quiet: quiet, quiet: quiet,
test_threads: test_threads, test_threads: test_threads,
skip: matches.opt_strs("skip"),
}; };
Some(Ok(test_opts)) Some(Ok(test_opts))
@ -1101,6 +1106,11 @@ pub fn filter_tests(opts: &TestOpts, tests: Vec<TestDescAndFn>) -> Vec<TestDescA
} }
}; };
// Skip tests that match any of the skip filters
filtered = filtered.into_iter()
.filter(|t| !opts.skip.iter().any(|sf| t.desc.name.as_slice().contains(&sf[..])))
.collect();
// Maybe pull out the ignored test and unignore them // Maybe pull out the ignored test and unignore them
filtered = if !opts.run_ignored { filtered = if !opts.run_ignored {
filtered filtered

View File

@ -313,6 +313,7 @@ pub fn test_opts(config: &Config) -> test::TestOpts {
}, },
color: test::AutoColor, color: test::AutoColor,
test_threads: None, test_threads: None,
skip: vec![],
} }
} }