-
Notifications
You must be signed in to change notification settings - Fork 5
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
41 changed files
with
1,301 additions
and
21 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
# Qase TMS Cucumber 5 JVM Integration # | ||
[![License](https://lxgaming.github.io/badges/License-Apache%202.0-blue.svg)](https://www.apache.org/licenses/LICENSE-2.0) | ||
|
||
## Description ## | ||
This integration uploads test run results to Qase TMS via API. | ||
|
||
To link autotest to test case in Qase TMS use tag `@caseId` or `@tmsLink` | ||
|
||
For example: | ||
``` | ||
Feature: example features | ||
@caseId=59 | ||
Scenario: example scenario | ||
Given example step | ||
When example step | ||
Then example step | ||
@tmsLink=55 | ||
Scenario: example scenario2 | ||
Given example step2 | ||
When example step2 | ||
Then example step2 | ||
``` | ||
|
||
### Required params ### | ||
All required params are passed through system properties or environment variables: | ||
|
||
| Key | Description | | ||
| :---------------: | :----------: | | ||
| QASE_ENABLE | Enable Integration | | ||
| QASE_PROJECT_CODE | Project Code | | ||
| QASE_RUN_ID | Run Id | | ||
| QASE_API_TOKEN | Qase API Token | | ||
|
||
## Maven ## | ||
|
||
Add the following dependency and repository to your pom.xml: | ||
```xml | ||
<dependencies> | ||
<dependency> | ||
<groupId>io.qase</groupId> | ||
<artifactId>qase-cucumber6-jvm</artifactId> | ||
<version>3.1.1</version> | ||
</dependency> | ||
</dependencies> | ||
<build> | ||
<plugins> | ||
<plugin> | ||
<groupId>org.apache.maven.plugins</groupId> | ||
<artifactId>maven-surefire-plugin</artifactId> | ||
<version>3.0.0-M5</version> | ||
<configuration> | ||
<argLine> | ||
-javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar" -Dcucumber.plugin="io.qase.cucumber5.QaseEventListener" | ||
</argLine> | ||
</configuration> | ||
<dependencies> | ||
<dependency> | ||
<groupId>org.aspectj</groupId> | ||
<artifactId>aspectjweaver</artifactId> | ||
<version>${aspectj.version}</version> | ||
</dependency> | ||
</dependencies> | ||
</plugin> | ||
</plugins> | ||
</build> | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
<?xml version="1.0" encoding="UTF-8"?> | ||
<project xmlns="http://maven.apache.org/POM/4.0.0" | ||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||
<parent> | ||
<artifactId>qase-java</artifactId> | ||
<groupId>io.qase</groupId> | ||
<version>3.1.1</version> | ||
</parent> | ||
<modelVersion>4.0.0</modelVersion> | ||
|
||
<artifactId>qase-cucumber6-jvm</artifactId> | ||
|
||
<name>Cucumber 6 Integration with Qase TMS</name> | ||
|
||
<dependencies> | ||
<dependency> | ||
<groupId>io.qase</groupId> | ||
<artifactId>qase-api</artifactId> | ||
<version>${project.parent.version}</version> | ||
</dependency> | ||
<dependency> | ||
<groupId>org.junit.jupiter</groupId> | ||
<artifactId>junit-jupiter-engine</artifactId> | ||
<scope>test</scope> | ||
</dependency> | ||
<dependency> | ||
<groupId>com.github.tomakehurst</groupId> | ||
<artifactId>wiremock-jre8</artifactId> | ||
<scope>test</scope> | ||
</dependency> | ||
<dependency> | ||
<groupId>io.cucumber</groupId> | ||
<artifactId>cucumber-java</artifactId> | ||
<version>${cucumber6-java.version}</version> | ||
</dependency> | ||
<dependency> | ||
<groupId>org.projectlombok</groupId> | ||
<artifactId>lombok</artifactId> | ||
</dependency> | ||
</dependencies> | ||
</project> |
146 changes: 146 additions & 0 deletions
146
qase-cucumber6-jvm/src/main/java/io/qase/cucumber6/QaseEventListener.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,146 @@ | ||
package io.qase.cucumber6; | ||
|
||
import io.cucumber.plugin.ConcurrentEventListener; | ||
import io.cucumber.plugin.event.*; | ||
import io.qase.api.QaseClient; | ||
import io.qase.api.StepStorage; | ||
import io.qase.api.config.QaseConfig; | ||
import io.qase.api.services.QaseTestCaseListener; | ||
import io.qase.api.utils.CucumberUtils; | ||
import io.qase.api.utils.IntegrationUtils; | ||
import io.qase.client.model.ResultCreate; | ||
import io.qase.client.model.ResultCreate.StatusEnum; | ||
import io.qase.client.model.ResultCreateCase; | ||
import io.qase.client.model.ResultCreateStepsInner; | ||
import io.qase.cucumber6.guice.module.Cucumber6Module; | ||
import lombok.AccessLevel; | ||
import lombok.Getter; | ||
|
||
import java.util.LinkedList; | ||
import java.util.List; | ||
import java.util.Optional; | ||
|
||
import static io.qase.api.utils.IntegrationUtils.getStacktrace; | ||
|
||
public class QaseEventListener implements ConcurrentEventListener { | ||
|
||
private static final String REPORTER_NAME = "Cucumber 6-JVM"; | ||
|
||
@Getter(lazy = true, value = AccessLevel.PRIVATE) | ||
private final QaseTestCaseListener qaseTestCaseListener = createQaseListener(); | ||
|
||
static { | ||
System.setProperty(QaseConfig.QASE_CLIENT_REPORTER_NAME_KEY, REPORTER_NAME); | ||
} | ||
|
||
@Override | ||
public void setEventPublisher(EventPublisher publisher) { | ||
if (QaseClient.isEnabled()) { | ||
publisher.registerHandlerFor(TestCaseStarted.class, this::testCaseStarted); | ||
publisher.registerHandlerFor(TestCaseFinished.class, this::testCaseFinished); | ||
publisher.registerHandlerFor(TestRunFinished.class, this::testRunFinished); | ||
publisher.registerHandlerFor(TestStepFinished.class, this::testStepFinished); | ||
publisher.registerHandlerFor(TestStepStarted.class, this::testCaseStarted); | ||
} | ||
} | ||
|
||
private void testCaseStarted(TestStepStarted testStepStarted) { | ||
if (testStepStarted.getTestStep() instanceof PickleStepTestStep) { | ||
StepStorage.startStep(); | ||
} | ||
} | ||
|
||
private void testStepFinished(TestStepFinished testStepFinished) { | ||
if (testStepFinished.getTestStep() instanceof PickleStepTestStep) { | ||
PickleStepTestStep step = (PickleStepTestStep) testStepFinished.getTestStep(); | ||
String stepText = step.getStep().getKeyWord() + step.getStep().getText(); | ||
Result result = testStepFinished.getResult(); | ||
switch (result.getStatus()) { | ||
case PASSED: | ||
StepStorage.getCurrentStep() | ||
.action(stepText) | ||
.status(ResultCreateStepsInner.StatusEnum.PASSED); | ||
StepStorage.stopStep(); | ||
break; | ||
case SKIPPED: | ||
break; | ||
case PENDING: | ||
break; | ||
case UNDEFINED: | ||
break; | ||
case AMBIGUOUS: | ||
break; | ||
case FAILED: | ||
StepStorage.getCurrentStep() | ||
.action(stepText) | ||
.status(ResultCreateStepsInner.StatusEnum.FAILED) | ||
.addAttachmentsItem(IntegrationUtils.getStacktrace(result.getError())); | ||
StepStorage.stopStep(); | ||
break; | ||
case UNUSED: | ||
break; | ||
} | ||
} | ||
} | ||
|
||
private void testRunFinished(TestRunFinished testRunFinished) { | ||
getQaseTestCaseListener().onTestCasesSetFinished(); | ||
} | ||
|
||
private void testCaseStarted(TestCaseStarted event) { | ||
getQaseTestCaseListener().onTestCaseStarted(); | ||
} | ||
|
||
private void testCaseFinished(TestCaseFinished event) { | ||
getQaseTestCaseListener().onTestCaseFinished(resultCreate -> setupResultItem(resultCreate, event)); | ||
} | ||
|
||
private void setupResultItem(ResultCreate resultCreate, TestCaseFinished event) { | ||
List<String> tags = event.getTestCase().getTags(); | ||
Long caseId = CucumberUtils.getCaseId(tags); | ||
|
||
String caseTitle = null; | ||
if (caseId == null) { | ||
caseTitle = event.getTestCase().getName(); | ||
} | ||
|
||
StatusEnum status = convertStatus(event.getResult().getStatus()); | ||
Optional<Throwable> optionalThrowable = Optional.ofNullable(event.getResult().getError()); | ||
String comment = optionalThrowable | ||
.flatMap(throwable -> Optional.of(throwable.toString())).orElse(null); | ||
Boolean isDefect = optionalThrowable | ||
.flatMap(throwable -> Optional.of(throwable instanceof AssertionError)) | ||
.orElse(false); | ||
String stacktrace = optionalThrowable | ||
.flatMap(throwable -> Optional.of(getStacktrace(throwable))).orElse(null); | ||
LinkedList<ResultCreateStepsInner> steps = StepStorage.stopSteps(); | ||
resultCreate | ||
._case(caseTitle == null ? null : new ResultCreateCase().title(caseTitle)) | ||
.caseId(caseId) | ||
.status(status) | ||
.comment(comment) | ||
.stacktrace(stacktrace) | ||
.steps(steps.isEmpty() ? null : steps) | ||
.defect(isDefect); | ||
} | ||
|
||
private StatusEnum convertStatus(Status status) { | ||
switch (status) { | ||
case FAILED: | ||
return StatusEnum.FAILED; | ||
case PASSED: | ||
return StatusEnum.PASSED; | ||
case PENDING: | ||
case SKIPPED: | ||
case AMBIGUOUS: | ||
case UNDEFINED: | ||
case UNUSED: | ||
default: | ||
return StatusEnum.SKIPPED; | ||
} | ||
} | ||
|
||
private static QaseTestCaseListener createQaseListener() { | ||
return Cucumber6Module.getInjector().getInstance(QaseTestCaseListener.class); | ||
} | ||
} |
26 changes: 26 additions & 0 deletions
26
qase-cucumber6-jvm/src/main/java/io/qase/cucumber6/configuration/Cucumber6ApiConfigurer.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
package io.qase.cucumber6.configuration; | ||
|
||
import com.google.inject.Singleton; | ||
import io.cucumber.java.After; | ||
import io.qase.api.config.apiclient.DefaultHeadersApiConfigurer; | ||
import lombok.AccessLevel; | ||
import lombok.NoArgsConstructor; | ||
|
||
@Singleton | ||
@NoArgsConstructor(access = AccessLevel.PUBLIC) | ||
public class Cucumber6ApiConfigurer extends DefaultHeadersApiConfigurer { | ||
|
||
private static final Class<?> CUCUMBER_FRAMEWORK_CLASS = After.class; | ||
|
||
private static final String CUCUMBER_FRAMEWORK_NAME = "cucumber6"; | ||
|
||
@Override | ||
protected String getFrameworkName() { | ||
return CUCUMBER_FRAMEWORK_NAME; | ||
} | ||
|
||
@Override | ||
protected String getFrameworkVersion() { | ||
return getFrameworkVersionByClassOrUnknown(CUCUMBER_FRAMEWORK_CLASS); | ||
} | ||
} |
Oops, something went wrong.