Skip to content

Commit

Permalink
cucumber 6 and 7 support
Browse files Browse the repository at this point in the history
  • Loading branch information
savkk committed Oct 4, 2023
1 parent 2dde43c commit 22648c5
Show file tree
Hide file tree
Showing 41 changed files with 1,301 additions and 21 deletions.
6 changes: 5 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<groupId>io.qase</groupId>
<artifactId>qase-java</artifactId>
<packaging>pom</packaging>
<version>3.1.0</version>
<version>3.1.1</version>
<modules>
<module>qase-api</module>
<module>qase-testng</module>
Expand All @@ -16,6 +16,8 @@
<module>qase-cucumber3-jvm</module>
<module>qase-cucumber4-jvm</module>
<module>qase-cucumber5-jvm</module>
<module>qase-cucumber6-jvm</module>
<module>qase-cucumber7-jvm</module>
<module>qase-junit4-aspect</module>
</modules>

Expand All @@ -38,6 +40,8 @@
<cucumber3-java.version>3.0.2</cucumber3-java.version>
<cucumber4-java.version>4.8.1</cucumber4-java.version>
<cucumber5-java.version>5.7.0</cucumber5-java.version>
<cucumber6-java.version>6.11.0</cucumber6-java.version>
<cucumber7-java.version>7.14.0</cucumber7-java.version>
<swagger-core-version>2.0.0</swagger-core-version>
<aspectj.version>1.9.8</aspectj.version>
<jackson.version>2.13.4</jackson.version>
Expand Down
2 changes: 1 addition & 1 deletion qase-api/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ Add the following dependency and repository to your pom.xml:
<dependency>
<groupId>io.qase</groupId>
<artifactId>qase-api</artifactId>
<version>3.1.0</version>
<version>3.1.1</version>
</dependency>

```
Expand Down
2 changes: 1 addition & 1 deletion qase-api/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<parent>
<artifactId>qase-java</artifactId>
<groupId>io.qase</groupId>
<version>3.1.0</version>
<version>3.1.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>

Expand Down
2 changes: 1 addition & 1 deletion qase-cucumber3-jvm/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ Add the following dependency and repository to your pom.xml:
<dependency>
<groupId>io.qase</groupId>
<artifactId>qase-cucumber3-jvm</artifactId>
<version>3.1.0</version>
<version>3.1.1</version>
</dependency>
</dependencies>
<build>
Expand Down
2 changes: 1 addition & 1 deletion qase-cucumber3-jvm/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<parent>
<artifactId>qase-java</artifactId>
<groupId>io.qase</groupId>
<version>3.1.0</version>
<version>3.1.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>

Expand Down
2 changes: 1 addition & 1 deletion qase-cucumber4-jvm/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ Add the following dependency and repository to your pom.xml:
<dependency>
<groupId>io.qase</groupId>
<artifactId>qase-cucumber4-jvm</artifactId>
<version>3.1.0</version>
<version>3.1.1</version>
</dependency>
</dependencies>
<build>
Expand Down
2 changes: 1 addition & 1 deletion qase-cucumber4-jvm/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<parent>
<artifactId>qase-java</artifactId>
<groupId>io.qase</groupId>
<version>3.1.0</version>
<version>3.1.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>

Expand Down
2 changes: 1 addition & 1 deletion qase-cucumber5-jvm/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ Add the following dependency and repository to your pom.xml:
<dependency>
<groupId>io.qase</groupId>
<artifactId>qase-cucumber5-jvm</artifactId>
<version>3.1.0</version>
<version>3.1.1</version>
</dependency>
</dependencies>
<build>
Expand Down
2 changes: 1 addition & 1 deletion qase-cucumber5-jvm/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<parent>
<artifactId>qase-java</artifactId>
<groupId>io.qase</groupId>
<version>3.1.0</version>
<version>3.1.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>

Expand Down
69 changes: 69 additions & 0 deletions qase-cucumber6-jvm/README.md
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>
```
42 changes: 42 additions & 0 deletions qase-cucumber6-jvm/pom.xml
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>
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);
}
}
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);
}
}
Loading

0 comments on commit 22648c5

Please sign in to comment.