diff --git a/README.md b/README.md index d223d6f..d8eee70 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,12 @@ This plugin extends `org.junit.jupiter.api.extension.Extension` and has `junit.jupiter.extensions.autodetection.enabled=true` configured by default in `pom.xml`. This means Jupiter will pick it up automatically. +You can point each executed test case to a specific case ID by annotating `@Test` method with `@TcmsTestCaseId(int)`, +where `int` is the test case ID. See the `KiwiTcmsExtension` example below. +If the test case is not found searching by ID, plugin will default to standard search method. +You can find the case ID in your TCMS instance URL (example: https://tcms.server/case/1) +or on the test case page in the test case name (TC-**1**: Test case 1). + You may alternatively decorate your test suite with the `KiwiTcmsExtension` class but that should be redundant: @@ -36,6 +42,7 @@ but that should be redundant: @ExtendWith(KiwiTcmsExtension.class) public class KiwiJsonRpcClientTest { @Test + @TcmsTestCaseId(11) public void yourTest(){ assertThat(...); } diff --git a/pom.xml b/pom.xml index 0d7bfb5..b1ed1f2 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.kiwitcms.java kiwitcms-junit-plugin jar - 12.5 + 12.6 kiwitcms-junit-plugin JUnit 5 plugin for Kiwi TCMS. diff --git a/src/main/java/org/kiwitcms/java/api/RpcClient.java b/src/main/java/org/kiwitcms/java/api/RpcClient.java index 007676d..2c983e0 100644 --- a/src/main/java/org/kiwitcms/java/api/RpcClient.java +++ b/src/main/java/org/kiwitcms/java/api/RpcClient.java @@ -411,4 +411,22 @@ public TestExecutionStatus getTestExecutionStatus(String name, String weightLook return null; } } + + public TestCase getTestCaseById(int testCaseId) { + Map filter = new HashMap<>(); + filter.put("id", testCaseId); + JSONArray jsonArray = (JSONArray) executeViaPositionalParams(TEST_CASE_FILTER, Arrays.asList(filter)); + if (jsonArray == null || jsonArray.isEmpty()) { + System.out.printf("Case ID \"%s\" not found%n", testCaseId); + return null; + } + + try { + TestCase[] testCases = new ObjectMapper().readValue(jsonArray.toJSONString(), TestCase[].class); + return testCases[0]; + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } } diff --git a/src/main/java/org/kiwitcms/java/junit/KiwiTcmsExtension.java b/src/main/java/org/kiwitcms/java/junit/KiwiTcmsExtension.java index 87702ef..8c4ece8 100644 --- a/src/main/java/org/kiwitcms/java/junit/KiwiTcmsExtension.java +++ b/src/main/java/org/kiwitcms/java/junit/KiwiTcmsExtension.java @@ -5,6 +5,7 @@ package org.kiwitcms.java.junit; import org.kiwitcms.java.config.Config; +import org.kiwitcms.java.model.TcmsTestCaseId; import org.kiwitcms.java.model.TestMethod; import org.junit.jupiter.api.TestInfo; import org.junit.jupiter.api.TestInstance; @@ -49,6 +50,10 @@ public void afterEach(ExtensionContext context){ test.result = "PASS"; } test.containingClass = method.getDeclaringClass().getSimpleName(); + if (method.isAnnotationPresent(TcmsTestCaseId.class)) { + TcmsTestCaseId tcmsTestCaseId = method.getAnnotation(TcmsTestCaseId.class); + test.id = tcmsTestCaseId.value(); + } tests.add(test); } } diff --git a/src/main/java/org/kiwitcms/java/junit/TestDataEmitter.java b/src/main/java/org/kiwitcms/java/junit/TestDataEmitter.java index a93fb86..c26f222 100644 --- a/src/main/java/org/kiwitcms/java/junit/TestDataEmitter.java +++ b/src/main/java/org/kiwitcms/java/junit/TestDataEmitter.java @@ -6,6 +6,7 @@ package org.kiwitcms.java.junit; import net.minidev.json.JSONObject; +import org.apache.commons.lang3.ObjectUtils; import org.kiwitcms.java.api.RpcClient; import org.kiwitcms.java.config.Config; import org.kiwitcms.java.model.*; @@ -100,7 +101,13 @@ public void addTestResultsToRun(int runId, List tests) { int testPlanId = getPlanId(); for (TestMethod test : tests) { - TestCase testCase = client.getOrCreateTestCase(productId, categoryId, priorityId, test.getSummary()); + TestCase testCase = null; + if (test.id != 0) { + testCase = client.getTestCaseById(test.id); + } + if (ObjectUtils.isEmpty(testCase)) { + testCase = client.getOrCreateTestCase(productId, categoryId, priorityId, test.getSummary()); + } client.addTestCaseToPlan(testPlanId, testCase.getCaseId()); TestExecution[] executions = client.addTestCaseToRunId(runId, testCase.getCaseId()); diff --git a/src/main/java/org/kiwitcms/java/model/TcmsTestCaseId.java b/src/main/java/org/kiwitcms/java/model/TcmsTestCaseId.java new file mode 100644 index 0000000..ccd5867 --- /dev/null +++ b/src/main/java/org/kiwitcms/java/model/TcmsTestCaseId.java @@ -0,0 +1,13 @@ +package org.kiwitcms.java.model; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface TcmsTestCaseId +{ + int value(); +} diff --git a/src/main/java/org/kiwitcms/java/model/TestMethod.java b/src/main/java/org/kiwitcms/java/model/TestMethod.java index 13ad2a6..3b91ea9 100644 --- a/src/main/java/org/kiwitcms/java/model/TestMethod.java +++ b/src/main/java/org/kiwitcms/java/model/TestMethod.java @@ -11,6 +11,7 @@ public class TestMethod { public String containingClass; public String result; public Throwable exception; + public int id; public TestMethod(){};