diff --git a/src/main/java/org/jenkinsci/plugins/vstest_runner/VsTestBuilder.java b/src/main/java/org/jenkinsci/plugins/vstest_runner/VsTestBuilder.java index 9b21aa1..a621f57 100644 --- a/src/main/java/org/jenkinsci/plugins/vstest_runner/VsTestBuilder.java +++ b/src/main/java/org/jenkinsci/plugins/vstest_runner/VsTestBuilder.java @@ -61,7 +61,7 @@ public class VsTestBuilder extends Builder implements SimpleBuildStep { private boolean useVs2017Plus; private boolean enablecodecoverage = DescriptorImpl.defaultEnableCodeCoverage; private boolean failBuild = DescriptorImpl.defaultFailBuild; - + private boolean skipIfNoTests = DescriptorImpl.defaultSkipIfNoTests; @DataBoundConstructor public VsTestBuilder() { @@ -136,6 +136,10 @@ public boolean isFailBuild() { return failBuild; } + public boolean isSkipIfNoTests() { + return skipIfNoTests; + } + @DataBoundSetter public void setVsTestName(String vsTestName) { this.vsTestName = Util.fixEmptyAndTrim(vsTestName); @@ -209,6 +213,11 @@ public void setFailBuild(boolean failBuild) { this.failBuild = failBuild; } + @DataBoundSetter + public void setSkipIfNoTests(boolean skipIfNoTests) { + this.skipIfNoTests = skipIfNoTests; + } + @NonNull public VsTestInstallation getVsTest(TaskListener listener) { if (vsTestName == null) return VsTestInstallation.getDefaultInstallation(); @@ -234,6 +243,7 @@ public DescriptorImpl getDescriptor() { public static final class DescriptorImpl extends BuildStepDescriptor { public static final boolean defaultFailBuild = true; + public static final boolean defaultSkipIfNoTests = false; public static final boolean defaultEnableCodeCoverage = true; public static final String defaultLogger = VsTestLogger.TRX.toString(); @@ -313,11 +323,12 @@ public void perform(@NonNull Run run, @NonNull FilePath workspace, @NonNul args.add(pathToVsTest); // Target dll path + List targets = new ArrayList<>(); if (!StringUtils.isBlank(testFiles)) { - List targets = getTestFilesArguments(workspace, env); + targets = getTestFilesArguments(workspace, env); if (targets.size() == 0) { listener.getLogger().println("no files matching the pattern " + this.testFiles); - if (this.failBuild) { + if (this.failBuild && !this.skipIfNoTests) { run.setResult(Result.FAILURE); throw new AbortException("no files matching the pattern " + this.testFiles); } @@ -382,8 +393,14 @@ public void perform(@NonNull Run run, @NonNull FilePath workspace, @NonNul args.add(replaceMacro(cmdLineArgs, env)); } - // VSTest run. - execVsTest(args, run, workspace, launcher, listener, env); + if (targets.isEmpty() && this.skipIfNoTests) { + // Skip running non-existing tests + listener.getLogger().println("No test files were found, skip running tests."); + } + else { + // VSTest run. + execVsTest(args, run, workspace, launcher, listener, env); + } } /** diff --git a/src/main/resources/org/jenkinsci/plugins/vstest_runner/VsTestBuilder/config.jelly b/src/main/resources/org/jenkinsci/plugins/vstest_runner/VsTestBuilder/config.jelly index a10a586..37f7829 100644 --- a/src/main/resources/org/jenkinsci/plugins/vstest_runner/VsTestBuilder/config.jelly +++ b/src/main/resources/org/jenkinsci/plugins/vstest_runner/VsTestBuilder/config.jelly @@ -62,6 +62,10 @@ + + + + diff --git a/src/main/resources/org/jenkinsci/plugins/vstest_runner/VsTestBuilder/help-skipIfNoTests.html b/src/main/resources/org/jenkinsci/plugins/vstest_runner/VsTestBuilder/help-skipIfNoTests.html new file mode 100644 index 0000000..5d3d3ad --- /dev/null +++ b/src/main/resources/org/jenkinsci/plugins/vstest_runner/VsTestBuilder/help-skipIfNoTests.html @@ -0,0 +1,5 @@ +
+

+ If this is checked and no test files are found the test execution will be skipped. +

+