diff options
author | Cooper Benson <skycoop@gmail.com> | 2023-07-26 16:12:35 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-07-27 00:12:35 +0200 |
commit | 0e4d6d41ad64b89ab72d87a778d1bf3e516efabc (patch) | |
tree | 0957cad56aef5df5c0932597c1b8a04ad9d1466d /cli/args/flags.rs | |
parent | cf16df00d9ba87de643abc6d80c860a2733917cc (diff) |
feat(cli): Adding JUnit test reports (#19747)
This commit makes the following changes
- Created a `CompoundTestReporter` to allow us to use multiple reporters
- Implements `JUnitTestReporter` which writes JUnit XML to a path
- Added a CLI flag/option `--junit` that enables JUnit reporting. By
default this writes the report to `stdout` (and disables pretty
reporting). If a path is provided, it will write the JUnit report to
that file while the pretty reporter writes to stdout like normal
Output of `deno -- test --allow-all --unstable
--location=http://js-unit-tests/foo/bar --junit
cli/tests/unit/testing_test.ts `
```xml
<?xml version="1.0" encoding="UTF-8"?>
<testsuites name="deno test" tests="7" failures="0" errors="0" time="0.176">
<testsuite name="file:///Users/cooper/deno/deno/cli/tests/unit/testing_test.ts" tests="7" disabled="0" errors="0" failures="0">
<testcase name="testWrongOverloads" time="0.012">
</testcase>
<testcase name="nameOfTestCaseCantBeEmpty" time="0.009">
</testcase>
<testcase name="invalidStepArguments" time="0.008">
</testcase>
<testcase name="nameOnTextContext" time="0.029">
<properties>
<property name="step[passed]" value="step ... nested step"/>
<property name="step[passed]" value="step"/>
</properties>
</testcase>
<testcase name="originOnTextContext" time="0.030">
<properties>
<property name="step[passed]" value="step ... nested step"/>
<property name="step[passed]" value="step"/>
</properties>
</testcase>
<testcase name="parentOnTextContext" time="0.030">
<properties>
<property name="step[passed]" value="step ... nested step"/>
<property name="step[passed]" value="step"/>
</properties>
</testcase>
<testcase name="explicit undefined for boolean options" time="0.009">
</testcase>
</testsuite>
</testsuites>
```
Diffstat (limited to 'cli/args/flags.rs')
-rw-r--r-- | cli/args/flags.rs | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/cli/args/flags.rs b/cli/args/flags.rs index d06a17a06..3f4498dac 100644 --- a/cli/args/flags.rs +++ b/cli/args/flags.rs @@ -221,6 +221,7 @@ pub struct TestFlags { pub concurrent_jobs: Option<NonZeroUsize>, pub trace_ops: bool, pub watch: Option<WatchFlags>, + pub junit_path: Option<String>, } #[derive(Clone, Debug, Eq, PartialEq)] @@ -1848,6 +1849,16 @@ Directory arguments are expanded to all contained files matching the glob ) .arg(no_clear_screen_arg()) .arg(script_arg().last(true)) + .arg( + Arg::new("junit") + .long("junit") + .value_name("PATH") + .value_hint(ValueHint::FilePath) + .help("Write a JUnit XML test report to PATH. Use '-' to write to stdout which is the default when PATH is not provided.") + .num_args(0..=1) + .require_equals(true) + .default_missing_value("-") + ) ) } @@ -3034,6 +3045,8 @@ fn test_parse(flags: &mut Flags, matches: &mut ArgMatches) { Vec::new() }; + let junit_path = matches.remove_one::<String>("junit"); + flags.subcommand = DenoSubcommand::Test(TestFlags { no_run, doc, @@ -3046,6 +3059,7 @@ fn test_parse(flags: &mut Flags, matches: &mut ArgMatches) { concurrent_jobs, trace_ops, watch: watch_arg_parse(matches), + junit_path, }); } @@ -5910,6 +5924,7 @@ mod tests { trace_ops: true, coverage_dir: Some("cov".to_string()), watch: Default::default(), + junit_path: None, }), unstable: true, no_prompt: true, @@ -5988,6 +6003,7 @@ mod tests { trace_ops: false, coverage_dir: None, watch: Default::default(), + junit_path: None, }), type_check_mode: TypeCheckMode::Local, no_prompt: true, @@ -6020,6 +6036,7 @@ mod tests { trace_ops: false, coverage_dir: None, watch: Default::default(), + junit_path: None, }), type_check_mode: TypeCheckMode::Local, no_prompt: true, @@ -6056,6 +6073,7 @@ mod tests { trace_ops: false, coverage_dir: None, watch: Default::default(), + junit_path: None, }), no_prompt: true, type_check_mode: TypeCheckMode::Local, @@ -6086,6 +6104,7 @@ mod tests { trace_ops: false, coverage_dir: None, watch: Default::default(), + junit_path: None, }), no_prompt: true, type_check_mode: TypeCheckMode::Local, @@ -6117,6 +6136,7 @@ mod tests { watch: Some(WatchFlags { no_clear_screen: false, }), + junit_path: None, }), no_prompt: true, type_check_mode: TypeCheckMode::Local, @@ -6147,6 +6167,7 @@ mod tests { watch: Some(WatchFlags { no_clear_screen: false, }), + junit_path: None, }), no_prompt: true, type_check_mode: TypeCheckMode::Local, @@ -6179,6 +6200,67 @@ mod tests { watch: Some(WatchFlags { no_clear_screen: true, }), + junit_path: None, + }), + type_check_mode: TypeCheckMode::Local, + no_prompt: true, + ..Flags::default() + } + ); + } + + #[test] + fn test_junit_default() { + let r = flags_from_vec(svec!["deno", "test", "--junit"]); + assert_eq!( + r.unwrap(), + Flags { + subcommand: DenoSubcommand::Test(TestFlags { + no_run: false, + doc: false, + fail_fast: None, + filter: None, + allow_none: false, + shuffle: None, + files: FileFlags { + include: vec![], + ignore: vec![], + }, + concurrent_jobs: None, + trace_ops: false, + coverage_dir: None, + watch: Default::default(), + junit_path: Some("-".to_string()), + }), + type_check_mode: TypeCheckMode::Local, + no_prompt: true, + ..Flags::default() + } + ); + } + + #[test] + fn test_junit_with_path() { + let r = flags_from_vec(svec!["deno", "test", "--junit=junit.xml"]); + assert_eq!( + r.unwrap(), + Flags { + subcommand: DenoSubcommand::Test(TestFlags { + no_run: false, + doc: false, + fail_fast: None, + filter: None, + allow_none: false, + shuffle: None, + files: FileFlags { + include: vec![], + ignore: vec![], + }, + concurrent_jobs: None, + trace_ops: false, + coverage_dir: None, + watch: Default::default(), + junit_path: Some("junit.xml".to_string()), }), type_check_mode: TypeCheckMode::Local, no_prompt: true, |