Skip to content

Commit ea3c4bc

Browse files
committed
first junit5 draft
1 parent 7396e31 commit ea3c4bc

21 files changed

+556
-120
lines changed

README.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,12 @@ The first draft of a new JUnit 4 adaptor is ready. To use the adaptor you should
3737

3838
## JUnit 5
3939

40-
Is not ready yet. We are waiting for `5.0 M4` (SPI support for listeners) and https://github.com/junit-team/junit5/issues/618
40+
To use JUnit 5 simply add the following dependency to your project:
41+
42+
```xml
43+
<dependency>
44+
<groupId>io.qameta.allure</groupId>
45+
<artifactId>allure-junit5</artifactId>
46+
<version>2.0-BETA4</version>
47+
</dependency>
48+
```

allure-junit5/build.gradle

Lines changed: 37 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,32 @@
11
description = 'Allure JUnit 5'
22

3-
buildscript {
4-
repositories {
5-
maven { url 'https://oss.sonatype.org/content/repositories/snapshots' }
6-
}
7-
dependencies {
8-
classpath 'org.junit.platform:junit-platform-gradle-plugin:1.0.0-SNAPSHOT'
9-
}
10-
}
11-
123
apply from: "${gradleScriptDir}/maven-publish.gradle"
134
apply from: "${gradleScriptDir}/bintray.gradle"
145
apply plugin: 'maven'
156
apply plugin: 'org.junit.platform.gradle.plugin'
167

17-
compileTestJava {
18-
sourceCompatibility = 1.8
19-
targetCompatibility = 1.8
20-
options.compilerArgs += '-parameters'
8+
configurations {
9+
agent
10+
}
11+
12+
dependencies {
13+
agent 'org.aspectj:aspectjweaver'
14+
15+
compile project(':allure-java-commons')
16+
compile('org.junit.platform:junit-platform-launcher')
17+
18+
testCompile('org.slf4j:slf4j-simple')
19+
testCompile 'org.assertj:assertj-core'
20+
testCompile('org.junit.jupiter:junit-jupiter-api')
21+
testCompile('org.junit.jupiter:junit-jupiter-params')
22+
23+
testRuntime('org.junit.jupiter:junit-jupiter-engine')
24+
}
25+
26+
jar {
27+
from('src/main/services') {
28+
into 'META-INF/services'
29+
}
2130
}
2231

2332
junitPlatform {
@@ -30,15 +39,22 @@ junitPlatform {
3039
enableStandardTestTask true
3140
}
3241

33-
dependencies {
34-
compile('org.slf4j:slf4j-simple')
35-
36-
compile('org.junit.platform:junit-platform-launcher:1.0.0-SNAPSHOT')
37-
testCompile('org.junit.jupiter:junit-jupiter-api:5.0.0-SNAPSHOT')
38-
testRuntime('org.junit.jupiter:junit-jupiter-engine:5.0.0-SNAPSHOT')
42+
tasks.withType(JavaExec) {
43+
if (it.name == 'junitPlatformTest') {
44+
systemProperty 'org.slf4j.simpleLogger.defaultLogLevel', 'debug'
45+
systemProperty 'allure.model.indentOutput', true
46+
systemProperty 'allure.results.directory', 'build/allure-results'
47+
doFirst {
48+
jvmArgs "-javaagent:${configurations.agent.singleFile}"
49+
}
50+
}
51+
}
3952

53+
task spiOffJar(type: Jar, dependsOn: classes) {
54+
classifier = 'spi-off'
55+
from sourceSets.main.allJava
4056
}
4157

42-
repositories {
43-
maven { url 'https://oss.sonatype.org/content/repositories/snapshots' }
58+
artifacts {
59+
archives spiOffJar
4460
}
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package io.qameta.allure;
2+
3+
import io.qameta.allure.model.Stage;
4+
import io.qameta.allure.model.TestResult;
5+
import org.junit.platform.engine.TestExecutionResult;
6+
import org.junit.platform.launcher.TestExecutionListener;
7+
import org.junit.platform.launcher.TestIdentifier;
8+
9+
import java.math.BigInteger;
10+
import java.security.MessageDigest;
11+
import java.security.NoSuchAlgorithmException;
12+
import java.util.UUID;
13+
14+
import static io.qameta.allure.model.Status.FAILED;
15+
import static io.qameta.allure.model.Status.PASSED;
16+
import static io.qameta.allure.model.Status.SKIPPED;
17+
import static java.nio.charset.StandardCharsets.UTF_8;
18+
19+
/**
20+
* @author ehborisov
21+
*/
22+
public class AllureJunit5 implements TestExecutionListener {
23+
24+
private final ThreadLocal<String> tests
25+
= InheritableThreadLocal.withInitial(() -> UUID.randomUUID().toString());
26+
27+
private final AllureLifecycle lifecycle;
28+
29+
public AllureJunit5(final AllureLifecycle lifecycle) {
30+
this.lifecycle = lifecycle;
31+
}
32+
33+
public AllureJunit5() {
34+
this.lifecycle = Allure.getLifecycle();
35+
}
36+
37+
public AllureLifecycle getLifecycle() {
38+
return lifecycle;
39+
}
40+
41+
@Override
42+
public void executionStarted(final TestIdentifier testIdentifier) {
43+
if (testIdentifier.isTest()) {
44+
final String uuid = tests.get();
45+
final TestResult result = new TestResult()
46+
.withUuid(uuid)
47+
.withName(testIdentifier.getDisplayName())
48+
.withHistoryId(md5(testIdentifier.getUniqueId()))
49+
.withStage(Stage.RUNNING);
50+
getLifecycle().scheduleTestCase(result);
51+
getLifecycle().startTestCase(uuid);
52+
}
53+
}
54+
55+
@Override
56+
public void executionFinished(final TestIdentifier testIdentifier, final TestExecutionResult testExecutionResult) {
57+
if (testIdentifier.isTest()) {
58+
final String uuid = tests.get();
59+
tests.remove();
60+
getLifecycle().updateTestCase(uuid, result -> {
61+
result.setStage(Stage.FINISHED);
62+
switch (testExecutionResult.getStatus()) {
63+
case FAILED:
64+
testExecutionResult.getThrowable().ifPresent(throwable -> {
65+
result.setStatus(ResultsUtils.getStatus(throwable).orElse(FAILED));
66+
result.setStatusDetails(ResultsUtils.getStatusDetails(throwable).orElse(null));
67+
});
68+
break;
69+
case SUCCESSFUL:
70+
result.setStatus(PASSED);
71+
break;
72+
default:
73+
result.setStatus(SKIPPED);
74+
testExecutionResult.getThrowable().ifPresent(throwable ->
75+
result.setStatusDetails(ResultsUtils.getStatusDetails(throwable).orElse(null))
76+
);
77+
break;
78+
}
79+
});
80+
getLifecycle().stopTestCase(uuid);
81+
getLifecycle().writeTestCase(uuid);
82+
}
83+
}
84+
85+
private String md5(final String source) {
86+
final byte[] bytes = getMessageDigest().digest(source.getBytes(UTF_8));
87+
return new BigInteger(1, bytes).toString(16);
88+
}
89+
90+
private MessageDigest getMessageDigest() {
91+
try {
92+
return MessageDigest.getInstance("md5");
93+
} catch (NoSuchAlgorithmException e) {
94+
throw new IllegalStateException("Could not find md5 hashing algorithm", e);
95+
}
96+
}
97+
}

allure-junit5/src/main/java/io/qameta/allure/SampleListener.java

Lines changed: 0 additions & 52 deletions
This file was deleted.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<aspectj>
2+
<aspects>
3+
<aspect name="io.qameta.allure.aspects.StepsAspects"/>
4+
<aspect name="io.qameta.allure.aspects.AttachmentsAspects"/>
5+
</aspects>
6+
</aspectj>

allure-junit5/src/main/resources/META-INF/services/org.junit.platform.launcher.TestExecutionListener

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
io.qameta.allure.AllureJunit5

allure-junit5/src/test/java/io/qameta/allure/FirstTest.java

Lines changed: 0 additions & 18 deletions
This file was deleted.

allure-junit5/src/test/java/io/qameta/allure/SecondTest.java

Lines changed: 0 additions & 24 deletions
This file was deleted.

0 commit comments

Comments
 (0)