Skip to content

Commit

Permalink
update for pitest 1.9.0
Browse files Browse the repository at this point in the history
Pitest 1.9.0 adds support for test plugins where the discovery
and execution of tests is not seperated (ie JUnit 5).

Previously each JUnit 5 test was executed twice during the coverage
stage, once to discover it, then again to run it for real.

This change takes advantage of the interfaces modified in 1.9.0 to
ensure that JUnit 5 tests are now discovered and run with one execution.
  • Loading branch information
Henry Coles committed Jun 23, 2022
1 parent 6038950 commit 1201475
Show file tree
Hide file tree
Showing 9 changed files with 319 additions and 71 deletions.
6 changes: 3 additions & 3 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<assertj.version>3.14.0</assertj.version>
<junit.platform.version>1.8.0</junit.platform.version>
<junit.version>5.8.0</junit.version>
<junit.platform.version>1.8.2</junit.platform.version>
<junit.version>5.8.2</junit.version>
<mockito.version>2.7.6</mockito.version>
<pitest.version>1.4.11</pitest.version>
<pitest.version>1.9.0</pitest.version>
<cucumber.version>5.0.0</cucumber.version>
</properties>

Expand Down
8 changes: 7 additions & 1 deletion src/main/java/org/pitest/junit5/JUnit5TestUnit.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,14 @@
import org.junit.platform.launcher.core.LauncherFactory;
import org.pitest.testapi.AbstractTestUnit;
import org.pitest.testapi.Description;
import org.pitest.testapi.ExecutedInDiscovery;
import org.pitest.testapi.ResultCollector;

/**
*
* @author Tobias Stadler
*/
public class JUnit5TestUnit extends AbstractTestUnit {
public class JUnit5TestUnit extends AbstractTestUnit implements ExecutedInDiscovery {

private final Class<?> testClass;

Expand Down Expand Up @@ -92,4 +93,9 @@ public void executionFinished(TestIdentifier testIdentifier, TestExecutionResult
launcher.execute(launcherDiscoveryRequest);
}


@Override
public String toString() {
return "JUnit5TestUnit[" + testIdentifier.getUniqueId() + "]";
}
}
57 changes: 35 additions & 22 deletions src/main/java/org/pitest/junit5/JUnit5TestUnitFinder.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,16 +26,17 @@
import org.junit.platform.engine.Filter;
import org.junit.platform.engine.TestExecutionResult;
import org.junit.platform.engine.discovery.DiscoverySelectors;
import org.junit.platform.engine.support.descriptor.ClassSource;
import org.junit.platform.engine.support.descriptor.MethodSource;
import org.junit.platform.launcher.Launcher;
import org.junit.platform.launcher.TagFilter;
import org.junit.platform.launcher.TestIdentifier;
import org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder;
import org.junit.platform.launcher.core.LauncherFactory;
import org.junit.platform.launcher.listeners.SummaryGeneratingListener;
import org.pitest.testapi.Description;
import org.pitest.testapi.TestGroupConfig;
import org.pitest.testapi.TestUnit;
import org.pitest.testapi.TestUnitExecutionListener;
import org.pitest.testapi.TestUnitFinder;

/**
Expand All @@ -57,7 +58,7 @@ public JUnit5TestUnitFinder(TestGroupConfig testGroupConfig, Collection<String>
}

@Override
public List<TestUnit> findTestUnits(Class<?> clazz) {
public List<TestUnit> findTestUnits(Class<?> clazz, TestUnitExecutionListener executionListener) {
if(clazz.getEnclosingClass() != null) {
return emptyList();
}
Expand All @@ -77,7 +78,8 @@ public List<TestUnit> findTestUnits(Class<?> clazz) {
throw new IllegalArgumentException("Error creating tag filter", e);
}

TestIdentifierListener listener = new TestIdentifierListener();
TestIdentifierListener listener = new TestIdentifierListener(clazz, executionListener);

launcher.execute(LauncherDiscoveryRequestBuilder
.request()
.selectors(DiscoverySelectors.selectClass(clazz))
Expand All @@ -91,25 +93,33 @@ public List<TestUnit> findTestUnits(Class<?> clazz) {
}

private class TestIdentifierListener extends SummaryGeneratingListener {
private final List<TestIdentifier> identifiers = new ArrayList<>();

List<TestIdentifier> getIdentifiers() {
return unmodifiableList(identifiers);
}

@Override
public void executionStarted(TestIdentifier testIdentifier) {
if (testIdentifier.isTest()) {
// filter out testMethods
if (includedTestMethods != null && !includedTestMethods.isEmpty()
&& testIdentifier.getSource().isPresent()
&& testIdentifier.getSource().get() instanceof MethodSource
&& !includedTestMethods.contains(((MethodSource)testIdentifier.getSource().get()).getMethodName())) {
return;
}
identifiers.add(testIdentifier);
}
}
private final Class<?> testClass;
private final TestUnitExecutionListener l;
private final List<TestIdentifier> identifiers = new ArrayList<>();

public TestIdentifierListener(Class<?> testClass, TestUnitExecutionListener l) {
this.testClass = testClass;
this.l = l;
}

List<TestIdentifier> getIdentifiers() {
return unmodifiableList(identifiers);
}

@Override
public void executionStarted(TestIdentifier testIdentifier) {
if (testIdentifier.isTest()) {
// filter out testMethods
if (includedTestMethods != null && !includedTestMethods.isEmpty()
&& testIdentifier.getSource().isPresent()
&& testIdentifier.getSource().get() instanceof MethodSource
&& !includedTestMethods.contains(((MethodSource)testIdentifier.getSource().get()).getMethodName())) {
return;
}
l.executionStarted(new Description(testIdentifier.getUniqueId(), testClass));
identifiers.add(testIdentifier);
}
}


@Override
Expand All @@ -119,6 +129,9 @@ public void executionFinished(TestIdentifier testIdentifier, TestExecutionResult
if (!identifiers.contains(testIdentifier)) {
identifiers.add(testIdentifier);
}
l.executionFinished(new Description(testIdentifier.getUniqueId(), testClass), false);
} else if (testIdentifier.isTest()) {
l.executionFinished(new Description(testIdentifier.getUniqueId(), testClass), true);
}
}

Expand Down
Loading

0 comments on commit 1201475

Please sign in to comment.