Browse Source

[e2e] Update Qase integration, impl additional e2e workflows (#3372)

Vlad Senyuta 2 years ago
parent
commit
ba99c20ad9
32 changed files with 305 additions and 406 deletions
  1. 85 0
      .github/workflows/e2e-automation.yml
  2. 4 4
      .github/workflows/e2e-checks.yaml
  3. 70 0
      .github/workflows/e2e-weekly.yml
  4. 3 15
      kafka-ui-e2e-checks/README.md
  5. 11 17
      kafka-ui-e2e-checks/pom.xml
  6. 11 10
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/settings/BaseSource.java
  7. 4 4
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/settings/configs/Profiles.java
  8. 0 145
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/utilities/qaseIoUtils/QaseExtension.java
  9. 0 173
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/utilities/qaseIoUtils/TestCaseGenerator.java
  10. 0 5
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/utilities/qaseIoUtils/enums/Status.java
  11. 34 0
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/utilities/qaseUtils/QaseSetup.java
  12. 2 2
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/utilities/qaseUtils/annotations/AutomationStatus.java
  13. 1 1
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/utilities/qaseUtils/annotations/Suite.java
  14. 5 0
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/utilities/qaseUtils/enums/Status.java
  15. 7 0
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/variables/Browser.java
  16. 11 0
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/variables/Suite.java
  17. 0 1
      kafka-ui-e2e-checks/src/main/resources/META-INF/services/org.junit.platform.launcher.TestExecutionListener
  18. 7 4
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/BaseTest.java
  19. 4 0
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/manualSuite/TestClass.java
  20. 4 0
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/qaseSuite/TestClass.java
  21. 4 0
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/sanitySuite/TestClass.java
  22. 2 2
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/SmokeTest.java
  23. 3 3
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/brokers/BrokersTest.java
  24. 3 3
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/connectors/ConnectorsTest.java
  25. 3 3
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/ksqlDb/KsqlDbTest.java
  26. 3 3
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/schemas/SchemasTest.java
  27. 4 4
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/topics/MessagesTest.java
  28. 3 3
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/topics/TopicsTest.java
  29. 0 4
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/testSuite/TestClass.java
  30. 8 0
      kafka-ui-e2e-checks/src/test/resources/manual.xml
  31. 8 0
      kafka-ui-e2e-checks/src/test/resources/qase.xml
  32. 1 0
      kafka-ui-e2e-checks/src/test/resources/regression.xml

+ 85 - 0
.github/workflows/e2e-automation.yml

@@ -0,0 +1,85 @@
+name: E2E Automation suite
+on:
+  workflow_dispatch:
+    inputs:
+      test_suite:
+        description: 'Select test suite to run'
+        default: 'regression'
+        required: true
+        type: choice
+        options:
+          - manual
+          - qase
+          - regression
+          - sanity
+          - smoke
+      qase_token:
+        description: 'Set Qase token to enable integration'
+        required: false
+        type: string
+
+jobs:
+  build-and-test:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v3
+        with:
+          ref: ${{ github.sha }}
+      - name: Set up environment
+        id: set_env_values
+        run: |
+          cat "./kafka-ui-e2e-checks/.env.ci" >> "./kafka-ui-e2e-checks/.env"
+      - name: Pull with Docker
+        id: pull_chrome
+        run: |
+          docker pull selenium/standalone-chrome:103.0
+      - name: Set up JDK
+        uses: actions/setup-java@v3
+        with:
+          java-version: '17'
+          distribution: 'zulu'
+          cache: 'maven'
+      - name: Build with Maven
+        id: build_app
+        run: |
+          ./mvnw -B -ntp versions:set -DnewVersion=${{ github.sha }}
+          ./mvnw -B -V -ntp clean install -Pprod -Dmaven.test.skip=true ${{ github.event.inputs.extraMavenOptions }}
+      - name: Compose with Docker
+        id: compose_app
+        # use the following command until #819 will be fixed
+        run: |
+          docker-compose -f ./documentation/compose/e2e-tests.yaml up -d
+      - name: Run test suite
+        run: |
+          ./mvnw -B -ntp versions:set -DnewVersion=${{ github.sha }}
+          ./mvnw -B -V -ntp -DQASEIO_API_TOKEN=${{ github.event.inputs.qase_token }} -Dsurefire.suiteXmlFiles='src/test/resources/${{ github.event.inputs.test_suite }}.xml' -Dsuite=${{ github.event.inputs.test_suite }} -f 'kafka-ui-e2e-checks' test -Pprod
+      - name: Generate Allure report
+        uses: simple-elf/allure-report-action@master
+        if: always()
+        id: allure-report
+        with:
+          allure_results: ./kafka-ui-e2e-checks/allure-results
+          gh_pages: allure-results
+          allure_report: allure-report
+          subfolder: allure-results
+          report_url: "http://kafkaui-allure-reports.s3-website.eu-central-1.amazonaws.com"
+      - uses: jakejarvis/s3-sync-action@master
+        if: always()
+        env:
+          AWS_S3_BUCKET: 'kafkaui-allure-reports'
+          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
+          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
+          AWS_REGION: 'eu-central-1'
+          SOURCE_DIR: 'allure-history/allure-results'
+      - name: Deploy report to Amazon S3
+        if: always()
+        uses: Sibz/github-status-action@v1.1.6
+        with:
+          authToken: ${{secrets.GITHUB_TOKEN}}
+          context: "Test report"
+          state: "success"
+          sha: ${{ github.sha }}
+          target_url: http://kafkaui-allure-reports.s3-website.eu-central-1.amazonaws.com/${{ github.run_number }}
+      - name: Dump Docker logs on failure
+        if: failure()
+        uses: jwalton/gh-docker-logs@v2.2.1

+ 4 - 4
.github/workflows/e2e-checks.yaml

@@ -1,7 +1,7 @@
-name: E2E tests
+name: E2E PR health check
 on:
   pull_request_target:
-    types: ["opened", "edited", "reopened", "synchronize"]
+    types: [ "opened", "edited", "reopened", "synchronize" ]
     paths:
       - "kafka-ui-api/**"
       - "kafka-ui-contract/**"
@@ -42,7 +42,7 @@ jobs:
       - name: e2e run
         run: |
           ./mvnw -B -ntp versions:set -DnewVersion=${{ github.event.pull_request.head.sha }}
-          ./mvnw -B -V -ntp -DQASEIO_API_TOKEN=${{ secrets.QASEIO_API_TOKEN }} -Dsurefire.suiteXmlFiles='src/test/resources/smoke.xml' -Dsuite=smoke -f 'kafka-ui-e2e-checks' test -Pprod
+          ./mvnw -B -V -ntp -Dsurefire.suiteXmlFiles='src/test/resources/smoke.xml' -f 'kafka-ui-e2e-checks' test -Pprod
       - name: Generate allure report
         uses: simple-elf/allure-report-action@master
         if: always()
@@ -66,7 +66,7 @@ jobs:
         uses: Sibz/github-status-action@v1.1.6
         with:
           authToken: ${{secrets.GITHUB_TOKEN}}
-          context: "Test report"
+          context: "Click Details button to open Allure report"
           state: "success"
           sha: ${{ github.event.pull_request.head.sha  || github.sha }}
           target_url: http://kafkaui-allure-reports.s3-website.eu-central-1.amazonaws.com/${{ github.run_number }}

+ 70 - 0
.github/workflows/e2e-weekly.yml

@@ -0,0 +1,70 @@
+name: E2E Weekly suite
+on:
+  schedule:
+    - cron: '0 1 * * 1'
+
+jobs:
+  build-and-test:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v3
+        with:
+          ref: ${{ github.sha }}
+      - name: Set up environment
+        id: set_env_values
+        run: |
+          cat "./kafka-ui-e2e-checks/.env.ci" >> "./kafka-ui-e2e-checks/.env"
+      - name: Pull with Docker
+        id: pull_chrome
+        run: |
+          docker pull selenium/standalone-chrome:103.0
+      - name: Set up JDK
+        uses: actions/setup-java@v3
+        with:
+          java-version: '17'
+          distribution: 'zulu'
+          cache: 'maven'
+      - name: Build with Maven
+        id: build_app
+        run: |
+          ./mvnw -B -ntp versions:set -DnewVersion=${{ github.sha }}
+          ./mvnw -B -V -ntp clean install -Pprod -Dmaven.test.skip=true ${{ github.event.inputs.extraMavenOptions }}
+      - name: Compose with Docker
+        id: compose_app
+        # use the following command until #819 will be fixed
+        run: |
+          docker-compose -f ./documentation/compose/e2e-tests.yaml up -d
+      - name: Run test suite
+        run: |
+          ./mvnw -B -ntp versions:set -DnewVersion=${{ github.sha }}
+          ./mvnw -B -V -ntp -DQASEIO_API_TOKEN=${{ secrets.QASEIO_API_TOKEN }} -Dsurefire.suiteXmlFiles='src/test/resources/sanity.xml' -Dsuite=weekly -f 'kafka-ui-e2e-checks' test -Pprod
+      - name: Generate Allure report
+        uses: simple-elf/allure-report-action@master
+        if: always()
+        id: allure-report
+        with:
+          allure_results: ./kafka-ui-e2e-checks/allure-results
+          gh_pages: allure-results
+          allure_report: allure-report
+          subfolder: allure-results
+          report_url: "http://kafkaui-allure-reports.s3-website.eu-central-1.amazonaws.com"
+      - uses: jakejarvis/s3-sync-action@master
+        if: always()
+        env:
+          AWS_S3_BUCKET: 'kafkaui-allure-reports'
+          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
+          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
+          AWS_REGION: 'eu-central-1'
+          SOURCE_DIR: 'allure-history/allure-results'
+      - name: Deploy report to Amazon S3
+        if: always()
+        uses: Sibz/github-status-action@v1.1.6
+        with:
+          authToken: ${{secrets.GITHUB_TOKEN}}
+          context: "Test report"
+          state: "success"
+          sha: ${{ github.sha }}
+          target_url: http://kafkaui-allure-reports.s3-website.eu-central-1.amazonaws.com/${{ github.run_number }}
+      - name: Dump Docker logs on failure
+        if: failure()
+        uses: jwalton/gh-docker-logs@v2.2.1

+ 3 - 15
kafka-ui-e2e-checks/README.md

@@ -38,25 +38,13 @@ cd kafka-ui
 docker-compose -f documentation/compose/e2e-tests.yaml up -d
 ```
 
-2. Run Smoke test suite using your QaseIO API token as environment variable (put instead %s into command below)
+2. To run test suite select its name (options: regression, sanity, smoke) and put it instead %s into command below
 
 ```
-./mvnw -DQASEIO_API_TOKEN='%s' -Dsurefire.suiteXmlFiles='src/test/resources/smoke.xml' -Dsuite=smoke -f 'kafka-ui-e2e-checks' test -Pprod
+./mvnw -Dsurefire.suiteXmlFiles='src/test/resources/%s.xml' -f 'kafka-ui-e2e-checks' test -Pprod
 ```
 
-3. Run Sanity test suite using your QaseIO API token as environment variable (put instead %s into command below)
-
-```
-./mvnw -DQASEIO_API_TOKEN='%s' -Dsurefire.suiteXmlFiles='src/test/resources/sanity.xml' -Dsuite=sanity -f 'kafka-ui-e2e-checks' test -Pprod
-```
-
-4. Run Regression test suite using your QaseIO API token as environment variable (put instead %s into command below)
-
-```
-./mvnw -DQASEIO_API_TOKEN='%s' -Dsurefire.suiteXmlFiles='src/test/resources/regression.xml' -Dsuite=regression -f 'kafka-ui-e2e-checks' test -Pprod
-```
-
-5. To run tests on your local Chrome browser just add next VM option to the Run Configuration
+3. To run tests on your local Chrome browser just add next VM option to the Run Configuration
 
 ```
 -Dbrowser=local

+ 11 - 17
kafka-ui-e2e-checks/pom.xml

@@ -15,17 +15,16 @@
         <maven.surefire-plugin.version>3.0.0-M8</maven.surefire-plugin.version>
         <kafka-ui-contract>${project.version}</kafka-ui-contract>
         <testcontainers.version>1.17.6</testcontainers.version>
-        <junit.platform.version>1.9.2</junit.platform.version>
         <selenide.version>6.6.3</selenide.version>
         <testng.version>7.6.1</testng.version>
         <allure.version>2.20.1</allure.version>
+        <qase.io.version>3.0.2</qase.io.version>
         <aspectj.version>1.9.9.1</aspectj.version>
         <assertj.version>3.23.1</assertj.version>
         <hamcrest.version>2.2</hamcrest.version>
         <slf4j.version>1.7.36</slf4j.version>
         <dotenv.version>2.3.1</dotenv.version>
         <kafka.version>3.3.1</kafka.version>
-        <qase.io.version>2.1.3</qase.io.version>
     </properties>
 
     <dependencies>
@@ -121,16 +120,6 @@
             <artifactId>selenium</artifactId>
             <version>${testcontainers.version}</version>
         </dependency>
-        <dependency>
-            <groupId>org.junit.platform</groupId>
-            <artifactId>junit-platform-launcher</artifactId>
-            <version>${junit.platform.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.junit.platform</groupId>
-            <artifactId>junit-platform-engine</artifactId>
-            <version>${junit.platform.version}</version>
-        </dependency>
         <dependency>
             <groupId>com.codeborne</groupId>
             <artifactId>selenide</artifactId>
@@ -151,6 +140,16 @@
             <artifactId>allure-testng</artifactId>
             <version>${allure.version}</version>
         </dependency>
+        <dependency>
+            <groupId>io.qase</groupId>
+            <artifactId>qase-testng</artifactId>
+            <version>${qase.io.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.qase</groupId>
+            <artifactId>qase-api</artifactId>
+            <version>${qase.io.version}</version>
+        </dependency>
         <dependency>
             <groupId>org.hamcrest</groupId>
             <artifactId>hamcrest</artifactId>
@@ -186,11 +185,6 @@
             <artifactId>kafka-ui-contract</artifactId>
             <version>${kafka-ui-contract}</version>
         </dependency>
-        <dependency>
-            <groupId>io.qase</groupId>
-            <artifactId>qase-api</artifactId>
-            <version>${qase.io.version}</version>
-        </dependency>
     </dependencies>
 
     <profiles>

+ 11 - 10
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/settings/BaseSource.java

@@ -5,16 +5,17 @@ import org.aeonbits.owner.ConfigFactory;
 
 public abstract class BaseSource {
 
-  private static Config config;
-  public static final String BASE_CONTAINER_URL = "http://host.testcontainers.internal:8080";
-  public static final String BASE_LOCAL_URL = "http://localhost:8080";
-  public static final String CLUSTER_NAME = "local";
-  public static final String BROWSER = config().browser();
+    public static final String BASE_CONTAINER_URL = "http://host.testcontainers.internal:8080";
+    public static final String BASE_LOCAL_URL = "http://localhost:8080";
+    public static final String CLUSTER_NAME = "local";
+    private static Config config;
+    public static final String BROWSER = config().browser();
+    public static final String SUITE_NAME = config().suite();
 
-  private static Config config() {
-    if (config == null) {
-      config = ConfigFactory.create(Config.class, System.getProperties());
+    private static Config config() {
+        if (config == null) {
+            config = ConfigFactory.create(Config.class, System.getProperties());
+        }
+        return config;
     }
-    return config;
-  }
 }

+ 4 - 4
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/settings/configs/Profiles.java

@@ -2,16 +2,16 @@ package com.provectus.kafka.ui.settings.configs;
 
 import org.aeonbits.owner.Config;
 
-public interface Profiles extends Config {
+import static com.provectus.kafka.ui.variables.Browser.CONTAINER;
+import static com.provectus.kafka.ui.variables.Suite.CUSTOM;
 
-    String CONTAINER = "container";
-    String LOCAL = "local";
+public interface Profiles extends Config {
 
     @Key("browser")
     @DefaultValue(CONTAINER)
     String browser();
 
     @Key("suite")
-    @DefaultValue("custom")
+    @DefaultValue(CUSTOM)
     String suite();
 }

+ 0 - 145
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/utilities/qaseIoUtils/QaseExtension.java

@@ -1,145 +0,0 @@
-package com.provectus.kafka.ui.utilities.qaseIoUtils;
-
-import io.qase.api.QaseClient;
-import io.qase.api.StepStorage;
-import io.qase.api.exceptions.QaseException;
-import io.qase.client.ApiClient;
-import io.qase.client.api.ResultsApi;
-import io.qase.client.model.ResultCreate;
-import io.qase.client.model.ResultCreate.StatusEnum;
-import io.qase.client.model.ResultCreateSteps;
-import lombok.extern.slf4j.Slf4j;
-import org.junit.platform.engine.TestExecutionResult;
-import org.junit.platform.engine.TestSource;
-import org.junit.platform.engine.support.descriptor.MethodSource;
-import org.junit.platform.launcher.TestExecutionListener;
-import org.junit.platform.launcher.TestIdentifier;
-
-import javax.annotation.Nullable;
-import java.lang.reflect.Method;
-import java.text.SimpleDateFormat;
-import java.time.Duration;
-import java.util.*;
-import java.util.concurrent.ConcurrentHashMap;
-
-import static io.qase.api.QaseClient.getConfig;
-import static io.qase.api.utils.IntegrationUtils.getCaseId;
-import static io.qase.api.utils.IntegrationUtils.getStacktrace;
-import static org.apache.commons.lang3.StringUtils.isEmpty;
-import static org.junit.platform.engine.TestExecutionResult.Status.SUCCESSFUL;
-
-@Slf4j
-public class QaseExtension implements TestExecutionListener {
-
-    private static final String QASE_PROJECT = "KAFKAUI";
-
-    static {
-        String qaseApiToken = System.getProperty("QASEIO_API_TOKEN");
-        if (isEmpty(qaseApiToken)) {
-            log.warn("QASEIO_API_TOKEN system property is not set. Support for Qase will be disabled.");
-            System.setProperty("QASE_ENABLE", "false");
-        } else {
-            System.setProperty("QASE_ENABLE", "true");
-            System.setProperty("QASE_PROJECT_CODE", QASE_PROJECT);
-            System.setProperty("QASE_API_TOKEN", qaseApiToken);
-            System.setProperty("QASE_USE_BULK", "false");
-            if ("true".equalsIgnoreCase(System.getProperty("QASEIO_CREATE_TESTRUN"))) {
-                System.setProperty("QASE_RUN_NAME", "Automation run " +
-                        new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new Date()));
-            }
-        }
-    }
-
-    private final ApiClient apiClient = QaseClient.getApiClient();
-    private final ResultsApi resultsApi = new ResultsApi(apiClient);
-    private final Map<TestIdentifier, Long> testStartTimes = new ConcurrentHashMap<>();
-
-    @Override
-    public void executionStarted(TestIdentifier testIdentifier) {
-        if (QaseClient.isEnabled() && testIdentifier.isTest()) {
-            testStartTimes.put(testIdentifier, System.currentTimeMillis());
-        }
-    }
-
-    @Override
-    public void executionFinished(TestIdentifier testIdentifier, TestExecutionResult testExecutionResult) {
-        if (!testIdentifier.isTest() || !QaseClient.isEnabled()
-                || !testStartTimes.containsKey(testIdentifier)) {
-            return;
-        }
-        TestSource testSource = testIdentifier.getSource().orElse(null);
-        Method testMethod = null;
-        if (testSource instanceof MethodSource) {
-            testMethod = getMethod((MethodSource) testSource);
-        }
-        TestCaseGenerator.createTestCaseIfNotExists(testMethod);
-        Duration duration = Duration.ofMillis(System.currentTimeMillis() - this.testStartTimes.remove(testIdentifier));
-        sendResults(testExecutionResult, duration, testMethod);
-    }
-
-    private void sendResults(TestExecutionResult testExecutionResult, Duration timeSpent, Method testMethod) {
-        if (testMethod != null) {
-            ResultCreate resultCreate = getResultItem(testExecutionResult, timeSpent, testMethod);
-            try {
-                resultsApi.createResult(getConfig().projectCode(),
-                        getConfig().runId(),
-                        resultCreate);
-                log.info("Method = " + testMethod.getName() + ": Result added to test run with Id = {}", getConfig().runId());
-            } catch (QaseException e) {
-                log.error("Method = " + testMethod.getName() + ": Result not added to test Run because there is no @CaseId annotation or case not found", e);
-            }
-        }
-    }
-
-    private ResultCreate getResultItem(TestExecutionResult testExecutionResult, Duration timeSpent, Method testMethod) {
-        String testCaseTitle = TestCaseGenerator.generateTestCaseTitle(testMethod);
-        TestCaseGenerator.createTestCaseIfNotExists(testMethod);
-        Long caseId = getCaseId(testMethod);
-        Map<Long, String> cases = TestCaseGenerator.getTestCasesTitleAndId();
-        StatusEnum status = StatusEnum.SKIPPED;
-
-        if (caseId == null || !TestCaseGenerator.isCaseIdPresentInQaseIo(testMethod)) {
-            for (Map.Entry<Long, String> map : cases.entrySet()) {
-                if (map.getValue().matches(testCaseTitle)) {
-                    caseId = map.getKey();
-                    log.info("There is no annotation @CaseId but there is test case with title '" + testCaseTitle + "' and with id = " + caseId
-                            + " that will be added to test Run");
-                }
-            }
-        }
-
-        if (TestCaseGenerator.getAutomationStatus(testMethod) == 2) {
-            status = testExecutionResult.getStatus() == SUCCESSFUL ? StatusEnum.PASSED : StatusEnum.FAILED;
-        }
-
-        String comment = testExecutionResult.getThrowable()
-                .flatMap(throwable -> Optional.of(throwable.toString())).orElse(null);
-        Boolean isDefect = testExecutionResult.getThrowable()
-                .flatMap(throwable -> Optional.of(throwable instanceof AssertionError))
-                .orElse(false);
-        String stacktrace = testExecutionResult.getThrowable()
-                .flatMap(throwable -> Optional.of(getStacktrace(throwable))).orElse(null);
-        LinkedList<ResultCreateSteps> steps = StepStorage.getSteps();
-        return new ResultCreate()
-                .caseId(caseId)
-                .status(status)
-                .timeMs(timeSpent.toMillis())
-                .comment(comment)
-                .stacktrace(stacktrace)
-                .steps(steps.isEmpty() ? null : steps)
-                .defect(isDefect);
-    }
-
-    @Nullable
-    private Method getMethod(MethodSource testSource) {
-        try {
-            Class<?> testClass = Class.forName(testSource.getClassName());
-            return Arrays.stream(testClass.getDeclaredMethods())
-                    .filter(method -> MethodSource.from(method).equals(testSource))
-                    .findFirst().orElse(null);
-        } catch (ClassNotFoundException e) {
-            log.error(e.getMessage());
-            return null;
-        }
-    }
-}

+ 0 - 173
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/utilities/qaseIoUtils/TestCaseGenerator.java

@@ -1,173 +0,0 @@
-package com.provectus.kafka.ui.utilities.qaseIoUtils;
-
-import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.AutomationStatus;
-import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.Suite;
-import com.provectus.kafka.ui.utilities.qaseIoUtils.enums.Status;
-import io.qase.api.QaseClient;
-import io.qase.api.annotation.CaseId;
-import io.qase.client.ApiClient;
-import io.qase.client.api.CasesApi;
-import io.qase.client.model.*;
-import lombok.SneakyThrows;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.ArrayUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.junit.Assert;
-import org.junit.platform.engine.support.descriptor.MethodSource;
-
-import java.lang.reflect.Method;
-import java.util.*;
-
-import static io.qase.api.QaseClient.getConfig;
-
-@Slf4j
-public class TestCaseGenerator {
-
-    private static final ApiClient apiClient = QaseClient.getApiClient();
-    private static final CasesApi casesApi = new CasesApi(apiClient);
-    public static boolean FAILED = false;
-
-    @SneakyThrows
-    public static void createTestCaseIfNotExists(Method testMethod) {
-        TestCaseCreate caseCreate = new TestCaseCreate();
-        String testCaseTitle = generateTestCaseTitle(testMethod);
-        if (!isMethodAnnotatedWithCaseId(testMethod) || !TestCaseGenerator.isCaseIdPresentInQaseIo(testMethod)) {
-            if (!isCaseTitleExistInQaseIo(testMethod)) {
-                caseCreate.setTitle(testCaseTitle);
-                caseCreate.setAutomation(getAutomationStatus(testMethod));
-                if (isMethodAnnotatedWithSuite(testMethod)) {
-                    long suiteId = testMethod.getAnnotation(Suite.class).suiteId();
-                    caseCreate.suiteId(suiteId);
-                }
-                Long caseId = Objects.requireNonNull(casesApi.createCase(getConfig().projectCode(), caseCreate).getResult()).getId();
-                log.info("New test case = '" + testCaseTitle + "' created with id " + caseId);
-            }
-        }
-    }
-
-    @SneakyThrows
-    public static HashMap<Long, String> getTestCasesTitleAndId() {
-        HashMap<Long, String> map = new HashMap<>();
-        boolean getCases = true;
-        int offSet = 0;
-        while (getCases) {
-            getCases = false;
-            TestCaseListResponse response =
-                    casesApi.getCases(getConfig().projectCode(), new Filters().status(Filters.SERIALIZED_NAME_STATUS), 100, offSet);
-            TestCaseListResponseAllOfResult result = response.getResult();
-            Assert.assertNotNull(result);
-            List<TestCase> entities = result.getEntities();
-            Assert.assertNotNull(entities);
-            if (entities.size() > 0) {
-                for (TestCase test : entities) {
-                    map.put(test.getId(), test.getTitle());
-                }
-                offSet = offSet + 100;
-                getCases = true;
-            }
-        }
-        return map;
-    }
-
-    public static boolean isCaseIdPresentInQaseIo(Method testMethod) {
-        if (!testMethod.isAnnotationPresent(CaseId.class)) {
-            return false;
-        }
-        long caseId = testMethod.getAnnotation(CaseId.class).value();
-        HashMap<Long, String> cases = getTestCasesTitleAndId();
-        String title;
-        if (!cases.containsKey(caseId)) {
-            FAILED = true;
-            log.error("The method " + testMethod.getName() + " has wrong @CaseId =" + caseId + " that does not exist in Qase.io. " +
-                    "Please put correct @CaseId");
-            return false;
-        } else {
-            for (Map.Entry<Long, String> map : cases.entrySet()) {
-                if (map.getKey().equals(caseId)) {
-                    title = map.getValue();
-                    if (!title.matches(generateTestCaseTitle(testMethod))) {
-                        log.error("This CaseId =" + caseId + " belong to test with title = " + title);
-                        return false;
-                    }
-                }
-            }
-        }
-        return true;
-    }
-
-    private static boolean isCaseTitleExistInQaseIo(Method testMethod) {
-        HashMap<Long, String> cases = getTestCasesTitleAndId();
-        String title = generateTestCaseTitle(testMethod);
-        if (cases.containsValue(title)) {
-            for (Map.Entry<Long, String> map : cases.entrySet()) {
-                if (map.getValue().matches(title)) {
-                    long caseId = map.getKey();
-                    log.info("Test case with title '" + title + "' and id " + caseId + " exist in Qase.io. Verify that annotation @CaseId is correct");
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    public static int getAutomationStatus(Method testMethod) {
-        if (testMethod.isAnnotationPresent(AutomationStatus.class)) {
-            if (testMethod.getAnnotation(AutomationStatus.class).status().equals(Status.TO_BE_AUTOMATED))
-                return 1;
-            else if (testMethod.getAnnotation(AutomationStatus.class).status().equals(Status.MANUAL))
-                return 0;
-        }
-        return 2;
-    }
-
-    private static boolean isMethodAnnotatedWithCaseId(Method testMethod) {
-        if (!testMethod.isAnnotationPresent(CaseId.class)) {
-            FAILED = true;
-            log.error("You must put annotation @CaseId. The method " + testMethod.getName() + " is NOT annotated with @CaseId.");
-            return false;
-        }
-        return true;
-    }
-
-    private static boolean isMethodAnnotatedWithSuite(Method testMethod) {
-        if (!testMethod.isAnnotationPresent(Suite.class)) {
-            log.info("The method " + testMethod.getName() + " is not annotated with @Suite and new test case will be added without suite");
-            return false;
-        }
-        log.trace("The method is annotated with @Suite with id " + testMethod.getAnnotation(Suite.class).suiteId());
-        return true;
-    }
-
-    private static boolean isMethodAnnotatedWithAutomationStatus(Method testMethod) {
-        if (!testMethod.isAnnotationPresent(AutomationStatus.class)) {
-            log.error("The method " + testMethod.getName() + " is NOT annotated with @AutomationStatus.");
-            return false;
-        }
-        return true;
-    }
-
-    private static String formatTestCaseTitle(String testMethodName) {
-        String[] split = StringUtils.splitByCharacterTypeCamelCase(testMethodName);
-        String[] name = Arrays.stream(split).map(String::toLowerCase).toArray(String[]::new);
-        String[] subarray = ArrayUtils.subarray(name, 1, name.length);
-        ArrayList<String> stringList = new ArrayList<>(Arrays.asList(subarray));
-        stringList.add(0, StringUtils.capitalize(name[0]));
-        return StringUtils.join(stringList, " ");
-    }
-
-    public static String generateTestCaseTitle(Method testMethod) {
-        return getClassName(MethodSource.from(testMethod)) + "." + testMethod.getName() + " : " +
-                formatTestCaseTitle(testMethod.getName());
-    }
-
-    private static String getClassName(MethodSource testSource) {
-        Class<?> testClass;
-        try {
-            testClass = Class.forName(testSource.getClassName());
-        } catch (ClassNotFoundException e) {
-            log.error(e.getMessage());
-            return null;
-        }
-        return testClass.getSimpleName();
-    }
-}

+ 0 - 5
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/utilities/qaseIoUtils/enums/Status.java

@@ -1,5 +0,0 @@
-package com.provectus.kafka.ui.utilities.qaseIoUtils.enums;
-
-public enum Status {
-    AUTOMATED, TO_BE_AUTOMATED, MANUAL;
-}

+ 34 - 0
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/utilities/qaseUtils/QaseSetup.java

@@ -0,0 +1,34 @@
+package com.provectus.kafka.ui.utilities.qaseUtils;
+
+import lombok.extern.slf4j.Slf4j;
+
+import java.time.OffsetDateTime;
+import java.time.ZoneOffset;
+import java.time.format.DateTimeFormatter;
+
+import static com.provectus.kafka.ui.settings.BaseSource.SUITE_NAME;
+import static com.provectus.kafka.ui.variables.Suite.MANUAL;
+import static org.apache.commons.lang3.BooleanUtils.FALSE;
+import static org.apache.commons.lang3.BooleanUtils.TRUE;
+import static org.apache.commons.lang3.StringUtils.isEmpty;
+
+@Slf4j
+public class QaseSetup {
+
+    public static void testRunSetup() {
+        String qaseApiToken = System.getProperty("QASEIO_API_TOKEN");
+        if (isEmpty(qaseApiToken)) {
+            log.warn("Integration with Qase is disabled due to run config or token wasn't defined.");
+            System.setProperty("QASE_ENABLE", FALSE);
+        } else {
+            log.warn("Integration with Qase is enabled. Find this run at https://app.qase.io/run/KAFKAUI.");
+            String automation = SUITE_NAME.equalsIgnoreCase(MANUAL) ? "" : "Automation ";
+            System.setProperty("QASE_ENABLE", TRUE);
+            System.setProperty("QASE_PROJECT_CODE", "KAFKAUI");
+            System.setProperty("QASE_API_TOKEN", qaseApiToken);
+            System.setProperty("QASE_USE_BULK", TRUE);
+            System.setProperty("QASE_RUN_NAME", DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm")
+                    .format(OffsetDateTime.now(ZoneOffset.UTC)) + ": " + automation + SUITE_NAME.toUpperCase() + " suite");
+        }
+    }
+}

+ 2 - 2
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/utilities/qaseIoUtils/annotations/AutomationStatus.java → kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/utilities/qaseUtils/annotations/AutomationStatus.java

@@ -1,6 +1,6 @@
-package com.provectus.kafka.ui.utilities.qaseIoUtils.annotations;
+package com.provectus.kafka.ui.utilities.qaseUtils.annotations;
 
-import com.provectus.kafka.ui.utilities.qaseIoUtils.enums.Status;
+import com.provectus.kafka.ui.utilities.qaseUtils.enums.Status;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;

+ 1 - 1
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/utilities/qaseIoUtils/annotations/Suite.java → kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/utilities/qaseUtils/annotations/Suite.java

@@ -1,4 +1,4 @@
-package com.provectus.kafka.ui.utilities.qaseIoUtils.annotations;
+package com.provectus.kafka.ui.utilities.qaseUtils.annotations;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;

+ 5 - 0
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/utilities/qaseUtils/enums/Status.java

@@ -0,0 +1,5 @@
+package com.provectus.kafka.ui.utilities.qaseUtils.enums;
+
+public enum Status {
+    AUTOMATED, TO_BE_AUTOMATED, MANUAL
+}

+ 7 - 0
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/variables/Browser.java

@@ -0,0 +1,7 @@
+package com.provectus.kafka.ui.variables;
+
+public interface Browser {
+
+    String CONTAINER = "container";
+    String LOCAL = "local";
+}

+ 11 - 0
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/variables/Suite.java

@@ -0,0 +1,11 @@
+package com.provectus.kafka.ui.variables;
+
+public interface Suite {
+
+    String CUSTOM = "custom";
+    String MANUAL = "manual";
+    String QASE = "qase";
+    String REGRESSION = "regression";
+    String SANITY = "sanity";
+    String SMOKE = "smoke";
+}

+ 0 - 1
kafka-ui-e2e-checks/src/main/resources/META-INF/services/org.junit.platform.launcher.TestExecutionListener

@@ -1 +0,0 @@
-com.provectus.kafka.ui.utilities.qaseIoUtils.QaseExtension

+ 7 - 4
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/BaseTest.java

@@ -6,7 +6,8 @@ import com.codeborne.selenide.SelenideElement;
 import com.codeborne.selenide.WebDriverRunner;
 import com.provectus.kafka.ui.settings.listeners.AllureListener;
 import com.provectus.kafka.ui.settings.listeners.LoggerListener;
-import io.qase.api.annotation.Step;
+import io.qameta.allure.Step;
+import io.qase.testng.QaseListener;
 import lombok.extern.slf4j.Slf4j;
 import org.openqa.selenium.Dimension;
 import org.openqa.selenium.chrome.ChromeOptions;
@@ -23,12 +24,13 @@ import java.util.List;
 
 import static com.provectus.kafka.ui.pages.NaviSideBar.SideMenuOption.TOPICS;
 import static com.provectus.kafka.ui.settings.BaseSource.*;
-import static com.provectus.kafka.ui.settings.configs.Profiles.CONTAINER;
-import static com.provectus.kafka.ui.settings.configs.Profiles.LOCAL;
 import static com.provectus.kafka.ui.settings.drivers.LocalWebDriver.*;
+import static com.provectus.kafka.ui.utilities.qaseUtils.QaseSetup.testRunSetup;
+import static com.provectus.kafka.ui.variables.Browser.CONTAINER;
+import static com.provectus.kafka.ui.variables.Browser.LOCAL;
 
 @Slf4j
-@Listeners({AllureListener.class, LoggerListener.class})
+@Listeners({AllureListener.class, LoggerListener.class, QaseListener.class})
 public abstract class BaseTest extends Facade {
 
     private static final String SELENIUM_IMAGE_NAME = "selenium/standalone-chrome:103.0";
@@ -41,6 +43,7 @@ public abstract class BaseTest extends Facade {
 
     @BeforeSuite(alwaysRun = true)
     public void beforeSuite() {
+        testRunSetup();
         switch (BROWSER) {
             case (CONTAINER) -> {
                 DockerImageName image = isARM64()

+ 4 - 0
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/manualSuite/TestClass.java

@@ -0,0 +1,4 @@
+package com.provectus.kafka.ui.manualSuite;
+
+public class TestClass {
+}

+ 4 - 0
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/qaseSuite/TestClass.java

@@ -0,0 +1,4 @@
+package com.provectus.kafka.ui.qaseSuite;
+
+public class TestClass {
+}

+ 4 - 0
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/sanitySuite/TestClass.java

@@ -0,0 +1,4 @@
+package com.provectus.kafka.ui.sanitySuite;
+
+public class TestClass {
+}

+ 2 - 2
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/SmokeTest.java

@@ -2,8 +2,8 @@ package com.provectus.kafka.ui.smokeSuite;
 
 import com.codeborne.selenide.Condition;
 import com.provectus.kafka.ui.BaseTest;
-import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.AutomationStatus;
-import com.provectus.kafka.ui.utilities.qaseIoUtils.enums.Status;
+import com.provectus.kafka.ui.utilities.qaseUtils.annotations.AutomationStatus;
+import com.provectus.kafka.ui.utilities.qaseUtils.enums.Status;
 import io.qase.api.annotation.CaseId;
 import org.testng.annotations.Test;
 

+ 3 - 3
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/brokers/BrokersTest.java

@@ -2,9 +2,9 @@ package com.provectus.kafka.ui.smokeSuite.brokers;
 
 import com.codeborne.selenide.Condition;
 import com.provectus.kafka.ui.BaseTest;
-import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.AutomationStatus;
-import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.Suite;
-import com.provectus.kafka.ui.utilities.qaseIoUtils.enums.Status;
+import com.provectus.kafka.ui.utilities.qaseUtils.annotations.AutomationStatus;
+import com.provectus.kafka.ui.utilities.qaseUtils.annotations.Suite;
+import com.provectus.kafka.ui.utilities.qaseUtils.enums.Status;
 import io.qameta.allure.Step;
 import io.qase.api.annotation.CaseId;
 import org.testng.Assert;

+ 3 - 3
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/connectors/ConnectorsTest.java

@@ -3,9 +3,9 @@ package com.provectus.kafka.ui.smokeSuite.connectors;
 import com.provectus.kafka.ui.BaseTest;
 import com.provectus.kafka.ui.models.Connector;
 import com.provectus.kafka.ui.models.Topic;
-import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.AutomationStatus;
-import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.Suite;
-import com.provectus.kafka.ui.utilities.qaseIoUtils.enums.Status;
+import com.provectus.kafka.ui.utilities.qaseUtils.annotations.AutomationStatus;
+import com.provectus.kafka.ui.utilities.qaseUtils.annotations.Suite;
+import com.provectus.kafka.ui.utilities.qaseUtils.enums.Status;
 import io.qameta.allure.Step;
 import io.qase.api.annotation.CaseId;
 import org.testng.Assert;

+ 3 - 3
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/ksqlDb/KsqlDbTest.java

@@ -3,9 +3,9 @@ package com.provectus.kafka.ui.smokeSuite.ksqlDb;
 import com.provectus.kafka.ui.BaseTest;
 import com.provectus.kafka.ui.pages.ksqlDb.models.Stream;
 import com.provectus.kafka.ui.pages.ksqlDb.models.Table;
-import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.AutomationStatus;
-import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.Suite;
-import com.provectus.kafka.ui.utilities.qaseIoUtils.enums.Status;
+import com.provectus.kafka.ui.utilities.qaseUtils.annotations.AutomationStatus;
+import com.provectus.kafka.ui.utilities.qaseUtils.annotations.Suite;
+import com.provectus.kafka.ui.utilities.qaseUtils.enums.Status;
 import io.qase.api.annotation.CaseId;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;

+ 3 - 3
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/schemas/SchemasTest.java

@@ -4,9 +4,9 @@ import com.codeborne.selenide.Condition;
 import com.provectus.kafka.ui.api.model.CompatibilityLevel;
 import com.provectus.kafka.ui.BaseTest;
 import com.provectus.kafka.ui.models.Schema;
-import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.AutomationStatus;
-import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.Suite;
-import com.provectus.kafka.ui.utilities.qaseIoUtils.enums.Status;
+import com.provectus.kafka.ui.utilities.qaseUtils.annotations.AutomationStatus;
+import com.provectus.kafka.ui.utilities.qaseUtils.annotations.Suite;
+import com.provectus.kafka.ui.utilities.qaseUtils.enums.Status;
 import io.qameta.allure.Step;
 import io.qase.api.annotation.CaseId;
 import org.testng.Assert;

+ 4 - 4
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/topics/MessagesTest.java

@@ -3,12 +3,12 @@ package com.provectus.kafka.ui.smokeSuite.topics;
 import com.provectus.kafka.ui.BaseTest;
 import com.provectus.kafka.ui.models.Topic;
 import com.provectus.kafka.ui.pages.topics.TopicDetails;
-import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.AutomationStatus;
-import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.Suite;
-import com.provectus.kafka.ui.utilities.qaseIoUtils.enums.Status;
+import com.provectus.kafka.ui.utilities.qaseUtils.annotations.AutomationStatus;
+import com.provectus.kafka.ui.utilities.qaseUtils.annotations.Suite;
+import com.provectus.kafka.ui.utilities.qaseUtils.enums.Status;
 import io.qameta.allure.Issue;
+import io.qameta.allure.Step;
 import io.qase.api.annotation.CaseId;
-import io.qase.api.annotation.Step;
 import org.testng.Assert;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;

+ 3 - 3
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/topics/TopicsTest.java

@@ -4,9 +4,9 @@ import com.codeborne.selenide.Condition;
 import com.provectus.kafka.ui.BaseTest;
 import com.provectus.kafka.ui.models.Topic;
 import com.provectus.kafka.ui.pages.topics.TopicDetails;
-import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.AutomationStatus;
-import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.Suite;
-import com.provectus.kafka.ui.utilities.qaseIoUtils.enums.Status;
+import com.provectus.kafka.ui.utilities.qaseUtils.annotations.AutomationStatus;
+import com.provectus.kafka.ui.utilities.qaseUtils.annotations.Suite;
+import com.provectus.kafka.ui.utilities.qaseUtils.enums.Status;
 import io.qameta.allure.Issue;
 import io.qase.api.annotation.CaseId;
 import org.testng.Assert;

+ 0 - 4
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/testSuite/TestClass.java

@@ -1,4 +0,0 @@
-package com.provectus.kafka.ui.testSuite;
-
-public class TestClass {
-}

+ 8 - 0
kafka-ui-e2e-checks/src/test/resources/manual.xml

@@ -0,0 +1,8 @@
+<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
+<suite name="ManualSuite">
+    <test name="Manual" enabled="true" parallel="classes" thread-count="1">
+        <packages>
+            <package name="com.provectus.kafka.ui.manualSuite.*"/>
+        </packages>
+    </test>
+</suite>

+ 8 - 0
kafka-ui-e2e-checks/src/test/resources/qase.xml

@@ -0,0 +1,8 @@
+<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
+<suite name="QaseSuite">
+    <test name="Qase" enabled="true" parallel="classes" thread-count="1">
+        <packages>
+            <package name="com.provectus.kafka.ui.qaseSuite.*"/>
+        </packages>
+    </test>
+</suite>

+ 1 - 0
kafka-ui-e2e-checks/src/test/resources/regression.xml

@@ -4,6 +4,7 @@
         <packages>
             <package name="com.provectus.kafka.ui.smokeSuite.*"/>
             <package name="com.provectus.kafka.ui.sanitySuite.*"/>
+            <package name="com.provectus.kafka.ui.manualSuite.*"/>
         </packages>
     </test>
 </suite>