summaryrefslogtreecommitdiff
path: root/cli/args/flags.rs
diff options
context:
space:
mode:
authorCooper Benson <skycoop@gmail.com>2023-07-26 16:12:35 -0600
committerGitHub <noreply@github.com>2023-07-27 00:12:35 +0200
commit0e4d6d41ad64b89ab72d87a778d1bf3e516efabc (patch)
tree0957cad56aef5df5c0932597c1b8a04ad9d1466d /cli/args/flags.rs
parentcf16df00d9ba87de643abc6d80c860a2733917cc (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.rs82
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,