From a30b798b44c924bfb5e017d5180a406466f8f85f Mon Sep 17 00:00:00 2001 From: Alex Tsova Date: Tue, 2 Apr 2024 10:43:13 -0300 Subject: [PATCH 1/6] Add last error log to RP --- .../junit/ReportPortalListener.java | 17 +++ .../junit/callback/FailedDescriptionTest.java | 110 ++++++++++++++++++ .../FailedDescriptionFeatureTest.java | 45 +++++++ 3 files changed, 172 insertions(+) create mode 100644 src/test/java/com/epam/reportportal/junit/callback/FailedDescriptionTest.java create mode 100644 src/test/java/com/epam/reportportal/junit/features/callback/FailedDescriptionFeatureTest.java diff --git a/src/main/java/com/epam/reportportal/junit/ReportPortalListener.java b/src/main/java/com/epam/reportportal/junit/ReportPortalListener.java index b117922..8fe687a 100644 --- a/src/main/java/com/epam/reportportal/junit/ReportPortalListener.java +++ b/src/main/java/com/epam/reportportal/junit/ReportPortalListener.java @@ -82,6 +82,9 @@ public class ReportPortalListener implements ShutdownListener, RunnerWatcher, Ru private static final String START_TIME = "START_TIME"; private static final String IS_RETRY = "IS_RETRY"; private static final String IS_THEORY = "IS_THEORY"; + public static final String DESCRIPTION_TEST_ERROR_FORMAT = "%s\nError: \n%s: %s"; + public static final String DESCRIPTION_SUIT_ERROR_FORMAT = "Error: \n%s: %s"; + private static List failedTestsMessages = Collections.synchronizedList(new ArrayList<>()); private static final Map, ItemType> TYPE_MAP = Collections.unmodifiableMap(new HashMap, ItemType>() { private static final long serialVersionUID = 5292344734560662610L; @@ -310,6 +313,7 @@ protected void stopRunner(@Nonnull final Object runner) { ItemStatus status = l.getStatus(); for (Map.Entry entry : l.getChildItems().entrySet()) { TestItemTree.TestItemLeaf value = entry.getValue(); + ofNullable(context.getTestThrowable(entry.getKey())).ifPresent(failedTestsMessages::add); if (value.getType() != ItemType.SUITE) { continue; } @@ -320,7 +324,14 @@ protected void stopRunner(@Nonnull final Object runner) { l.setStatus(status); if (l.getParentId() == null) { rq.setStatus(ofNullable(status).map(Enum::name).orElse(null)); + if (!failedTestsMessages.isEmpty()) { + Throwable suitFailedMessage = failedTestsMessages.get(failedTestsMessages.size() - 1); + rq.setDescription(String.format(DESCRIPTION_SUIT_ERROR_FORMAT, + suitFailedMessage.getClass().getSimpleName(), + ofNullable(suitFailedMessage.getMessage()).isPresent() ? suitFailedMessage.getMessage() : "")); + } launch.get().finishTestItem(l.getItemId(), rq); + failedTestsMessages.clear(); } }); runners.removeFirstOccurrence(runner); @@ -582,6 +593,12 @@ protected void stopTestMethod(@Nonnull final Object runner, @Nonnull final Frame protected void stopTestMethod(@Nonnull final Object runner, @Nonnull final FrameworkMethod method, @Nonnull final ReflectiveCallable callable, @Nonnull final ItemStatus status, @Nullable final Throwable throwable) { FinishTestItemRQ rq = buildFinishStepRq(runner, method, callable, status); + if (status != ItemStatus.PASSED && throwable != null) { + rq.setDescription(String.format(DESCRIPTION_TEST_ERROR_FORMAT, + createStepDescription(this.context.getTestMethodDescription(method), method), + throwable.getClass().getSimpleName(), + ofNullable(throwable.getMessage()).isPresent() ? throwable.getMessage() : "")); + } stopTestMethod(runner, method, callable, rq); ItemType methodType = detectMethodType(method); diff --git a/src/test/java/com/epam/reportportal/junit/callback/FailedDescriptionTest.java b/src/test/java/com/epam/reportportal/junit/callback/FailedDescriptionTest.java new file mode 100644 index 0000000..c37f073 --- /dev/null +++ b/src/test/java/com/epam/reportportal/junit/callback/FailedDescriptionTest.java @@ -0,0 +1,110 @@ +package com.epam.reportportal.junit.callback; + +import static com.epam.reportportal.junit.utils.TestUtils.PROCESSING_TIMEOUT; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.mockito.ArgumentMatchers.same; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.timeout; +import static org.mockito.Mockito.verify; + +import com.epam.reportportal.junit.ReportPortalListener; +import com.epam.reportportal.junit.features.callback.FailedDescriptionFeatureTest; +import com.epam.reportportal.junit.utils.TestUtils; +import com.epam.reportportal.listeners.ListenerParameters; +import com.epam.reportportal.service.ReportPortal; +import com.epam.reportportal.service.ReportPortalClient; +import com.epam.reportportal.util.test.CommonUtils; +import com.epam.ta.reportportal.ws.model.FinishTestItemRQ; +import com.epam.ta.reportportal.ws.model.StartTestItemRQ; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.ArgumentMatchers; + +public class FailedDescriptionTest { + private final String suiteId = CommonUtils.namedId("suite_"); + private final String classId = CommonUtils.namedId("class_"); + private final List methodIds = Stream.generate(() -> CommonUtils.namedId("method_")).limit(2).collect(Collectors.toList()); + private final ReportPortalClient client = mock(ReportPortalClient.class); + private final String testWithDescriptionAndAssertException = "testWithDescriptionAndAssertException"; + private final String testWithDescriptionAndStepError = "testWithDescriptionAndStepError"; + private final String testWithDescriptionAndException = "testWithDescriptionAndException"; + private final String testErrorMessagePattern = "%s(com.epam.reportportal.junit.features.callback.FailedDescriptionFeatureTest)\nError: \n%s"; + private final String suiteErrorMessagePattern = "Error: \n%s"; + private final String assertErrorMessage = "AssertionError: expected:<0> but was:<1>"; + private final String exceptionStepErrorMessage = "NoSuchElementException: Test error message"; + private final String exceptionErrorMessage = "RuntimeException: Test error message"; + private final String failedStatus = "FAILED"; + private final String passedStatus = "PASSED"; + + @BeforeEach + public void setupMock() { + TestUtils.mockLaunch(client, null, suiteId, classId, methodIds); + TestUtils.mockBatchLogging(client); + ListenerParameters params = TestUtils.standardParameters(); + ReportPortalListener.setReportPortal(ReportPortal.create(client, params, TestUtils.testExecutor())); + } + + @Test + public void verify_retrieve_by_description() { + TestUtils.runClasses(FailedDescriptionFeatureTest.class); + + + ArgumentCaptor startSuiteCaptor = ArgumentCaptor.forClass(StartTestItemRQ.class); + verify(client, timeout(PROCESSING_TIMEOUT)).startTestItem( + ArgumentMatchers.startsWith(TestUtils.ROOT_SUITE_PREFIX), + startSuiteCaptor.capture() + ); + + ArgumentCaptor startTestCaptor = ArgumentCaptor.forClass(StartTestItemRQ.class); + verify(client, timeout(PROCESSING_TIMEOUT).atLeastOnce()).startTestItem(same(suiteId), startTestCaptor.capture()); + + + ArgumentCaptor finishSuiteCaptor = ArgumentCaptor.forClass(FinishTestItemRQ.class); + verify(client, timeout(PROCESSING_TIMEOUT)).finishTestItem( + ArgumentMatchers.startsWith(TestUtils.ROOT_SUITE_PREFIX), + finishSuiteCaptor.capture() + ); + + ArgumentCaptor finishTestCaptor = ArgumentCaptor.forClass(FinishTestItemRQ.class); + verify(client, timeout(PROCESSING_TIMEOUT).atLeastOnce()).finishTestItem(same(classId), finishTestCaptor.capture()); + + FinishTestItemRQ finishSuite = finishSuiteCaptor.getAllValues().get(0); + assertThat(finishSuite.getStatus(), equalTo(passedStatus)); + assertThat(finishSuite.getDescription(), equalTo(String.format(suiteErrorMessagePattern, assertErrorMessage))); + + List finishTests = finishTestCaptor.getAllValues(); + FinishTestItemRQ testCaseWithDescriptionAndAssertException = finishTests.stream() + .filter(f -> f.getDescription().startsWith(testWithDescriptionAndAssertException)) + .findFirst() + .orElseThrow(NoSuchElementException::new); + FinishTestItemRQ testCaseWithDescriptionAndStepError = finishTests.stream() + .filter(f -> f.getDescription().startsWith(testWithDescriptionAndStepError)) + .findFirst() + .orElseThrow(NoSuchElementException::new); + FinishTestItemRQ tesCaseWithDescriptionAndException = finishTests.stream() + .filter(f -> f.getDescription().startsWith(testWithDescriptionAndException)) + .findFirst() + .orElseThrow(NoSuchElementException::new); + FinishTestItemRQ tesCaseWithDescriptionAndPassed = finishTests.stream() + .filter(f -> f.getDescription() == null) + .findFirst() + .orElseThrow(NoSuchElementException::new); + + assertThat(testCaseWithDescriptionAndAssertException.getDescription(), equalTo(String.format(testErrorMessagePattern, testWithDescriptionAndAssertException, assertErrorMessage))); + assertThat(testCaseWithDescriptionAndAssertException.getStatus(), equalTo(failedStatus)); + + assertThat(testCaseWithDescriptionAndStepError.getDescription(), equalTo(String.format(testErrorMessagePattern, testWithDescriptionAndStepError, exceptionStepErrorMessage))); + assertThat(testCaseWithDescriptionAndStepError.getStatus(), equalTo(failedStatus)); + + assertThat(tesCaseWithDescriptionAndException.getDescription(), equalTo(String.format(testErrorMessagePattern, testWithDescriptionAndException, exceptionErrorMessage))); + assertThat(tesCaseWithDescriptionAndException.getStatus(), equalTo(failedStatus)); + + assertThat(tesCaseWithDescriptionAndPassed.getStatus(), equalTo(passedStatus)); + } +} diff --git a/src/test/java/com/epam/reportportal/junit/features/callback/FailedDescriptionFeatureTest.java b/src/test/java/com/epam/reportportal/junit/features/callback/FailedDescriptionFeatureTest.java new file mode 100644 index 0000000..770d514 --- /dev/null +++ b/src/test/java/com/epam/reportportal/junit/features/callback/FailedDescriptionFeatureTest.java @@ -0,0 +1,45 @@ +package com.epam.reportportal.junit.features.callback; + +import com.epam.reportportal.annotations.Step; +import java.util.NoSuchElementException; +import org.junit.Assert; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class FailedDescriptionFeatureTest { + + private static final Logger LOGGER = LoggerFactory.getLogger(RetrieveByDescriptionFeatureTest.class); + + @Test + public void testWithDescriptionAndException() { + throw new RuntimeException("Test error message"); + } + + @Test + public void testWithDescriptionAndAssertException() { + Assert.assertEquals(0, 1); + } + + @Test + public void testWithDescriptionAndStepError() { + loginWithException(); + Assert.assertTrue(true); + } + + @Test + public void testWithDescriptionAndPassed() { + login(); + Assert.assertTrue(true); + } + + @Step + public void login() { + LOGGER.info("Login class method"); + } + + @Step + public void loginWithException() { + throw new NoSuchElementException("Test error message"); + } +} From 2be5c2f0ad18ac091a3f7cc4957547687cee2dde Mon Sep 17 00:00:00 2001 From: Alex Tsova Date: Wed, 3 Apr 2024 18:11:01 -0300 Subject: [PATCH 2/6] Update with requirements --- .../junit/ReportPortalListener.java | 25 +++++--------- .../junit/callback/FailedDescriptionTest.java | 33 ++++--------------- 2 files changed, 15 insertions(+), 43 deletions(-) diff --git a/src/main/java/com/epam/reportportal/junit/ReportPortalListener.java b/src/main/java/com/epam/reportportal/junit/ReportPortalListener.java index 8fe687a..ac2c14f 100644 --- a/src/main/java/com/epam/reportportal/junit/ReportPortalListener.java +++ b/src/main/java/com/epam/reportportal/junit/ReportPortalListener.java @@ -82,9 +82,8 @@ public class ReportPortalListener implements ShutdownListener, RunnerWatcher, Ru private static final String START_TIME = "START_TIME"; private static final String IS_RETRY = "IS_RETRY"; private static final String IS_THEORY = "IS_THEORY"; - public static final String DESCRIPTION_TEST_ERROR_FORMAT = "%s\nError: \n%s: %s"; - public static final String DESCRIPTION_SUIT_ERROR_FORMAT = "Error: \n%s: %s"; - private static List failedTestsMessages = Collections.synchronizedList(new ArrayList<>()); + public static final String DESCRIPTION_TEST_ERROR_FORMAT = "%s\nError: \n%s"; + private Throwable testThrowable; private static final Map, ItemType> TYPE_MAP = Collections.unmodifiableMap(new HashMap, ItemType>() { private static final long serialVersionUID = 5292344734560662610L; @@ -313,7 +312,6 @@ protected void stopRunner(@Nonnull final Object runner) { ItemStatus status = l.getStatus(); for (Map.Entry entry : l.getChildItems().entrySet()) { TestItemTree.TestItemLeaf value = entry.getValue(); - ofNullable(context.getTestThrowable(entry.getKey())).ifPresent(failedTestsMessages::add); if (value.getType() != ItemType.SUITE) { continue; } @@ -324,14 +322,7 @@ protected void stopRunner(@Nonnull final Object runner) { l.setStatus(status); if (l.getParentId() == null) { rq.setStatus(ofNullable(status).map(Enum::name).orElse(null)); - if (!failedTestsMessages.isEmpty()) { - Throwable suitFailedMessage = failedTestsMessages.get(failedTestsMessages.size() - 1); - rq.setDescription(String.format(DESCRIPTION_SUIT_ERROR_FORMAT, - suitFailedMessage.getClass().getSimpleName(), - ofNullable(suitFailedMessage.getMessage()).isPresent() ? suitFailedMessage.getMessage() : "")); - } launch.get().finishTestItem(l.getItemId(), rq); - failedTestsMessages.clear(); } }); runners.removeFirstOccurrence(runner); @@ -592,13 +583,8 @@ protected void stopTestMethod(@Nonnull final Object runner, @Nonnull final Frame */ protected void stopTestMethod(@Nonnull final Object runner, @Nonnull final FrameworkMethod method, @Nonnull final ReflectiveCallable callable, @Nonnull final ItemStatus status, @Nullable final Throwable throwable) { + testThrowable = throwable; FinishTestItemRQ rq = buildFinishStepRq(runner, method, callable, status); - if (status != ItemStatus.PASSED && throwable != null) { - rq.setDescription(String.format(DESCRIPTION_TEST_ERROR_FORMAT, - createStepDescription(this.context.getTestMethodDescription(method), method), - throwable.getClass().getSimpleName(), - ofNullable(throwable.getMessage()).isPresent() ? throwable.getMessage() : "")); - } stopTestMethod(runner, method, callable, rq); ItemType methodType = detectMethodType(method); @@ -860,6 +846,11 @@ protected FinishTestItemRQ buildFinishStepRq(@Nullable final FrameworkMethod met FinishTestItemRQ rq = new FinishTestItemRQ(); rq.setEndTime(Calendar.getInstance().getTime()); rq.setStatus(status.name()); + if (status != ItemStatus.PASSED && testThrowable != null && method != null) { + rq.setDescription(String.format(DESCRIPTION_TEST_ERROR_FORMAT, + createStepDescription(this.context.getTestMethodDescription(method), method), + ExceptionUtils.getStackTrace(testThrowable))); + } return rq; } diff --git a/src/test/java/com/epam/reportportal/junit/callback/FailedDescriptionTest.java b/src/test/java/com/epam/reportportal/junit/callback/FailedDescriptionTest.java index c37f073..6d58d36 100644 --- a/src/test/java/com/epam/reportportal/junit/callback/FailedDescriptionTest.java +++ b/src/test/java/com/epam/reportportal/junit/callback/FailedDescriptionTest.java @@ -3,6 +3,7 @@ import static com.epam.reportportal.junit.utils.TestUtils.PROCESSING_TIMEOUT; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.startsWith; import static org.mockito.ArgumentMatchers.same; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.timeout; @@ -24,7 +25,6 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; -import org.mockito.ArgumentMatchers; public class FailedDescriptionTest { private final String suiteId = CommonUtils.namedId("suite_"); @@ -35,10 +35,9 @@ public class FailedDescriptionTest { private final String testWithDescriptionAndStepError = "testWithDescriptionAndStepError"; private final String testWithDescriptionAndException = "testWithDescriptionAndException"; private final String testErrorMessagePattern = "%s(com.epam.reportportal.junit.features.callback.FailedDescriptionFeatureTest)\nError: \n%s"; - private final String suiteErrorMessagePattern = "Error: \n%s"; - private final String assertErrorMessage = "AssertionError: expected:<0> but was:<1>"; - private final String exceptionStepErrorMessage = "NoSuchElementException: Test error message"; - private final String exceptionErrorMessage = "RuntimeException: Test error message"; + private final String assertErrorMessage = "java.lang.AssertionError: expected:<0> but was:<1>"; + private final String exceptionStepErrorMessage = "java.util.NoSuchElementException: Test error message"; + private final String exceptionErrorMessage = "java.lang.RuntimeException: Test error message"; private final String failedStatus = "FAILED"; private final String passedStatus = "PASSED"; @@ -54,30 +53,12 @@ public void setupMock() { public void verify_retrieve_by_description() { TestUtils.runClasses(FailedDescriptionFeatureTest.class); - - ArgumentCaptor startSuiteCaptor = ArgumentCaptor.forClass(StartTestItemRQ.class); - verify(client, timeout(PROCESSING_TIMEOUT)).startTestItem( - ArgumentMatchers.startsWith(TestUtils.ROOT_SUITE_PREFIX), - startSuiteCaptor.capture() - ); - ArgumentCaptor startTestCaptor = ArgumentCaptor.forClass(StartTestItemRQ.class); verify(client, timeout(PROCESSING_TIMEOUT).atLeastOnce()).startTestItem(same(suiteId), startTestCaptor.capture()); - - ArgumentCaptor finishSuiteCaptor = ArgumentCaptor.forClass(FinishTestItemRQ.class); - verify(client, timeout(PROCESSING_TIMEOUT)).finishTestItem( - ArgumentMatchers.startsWith(TestUtils.ROOT_SUITE_PREFIX), - finishSuiteCaptor.capture() - ); - ArgumentCaptor finishTestCaptor = ArgumentCaptor.forClass(FinishTestItemRQ.class); verify(client, timeout(PROCESSING_TIMEOUT).atLeastOnce()).finishTestItem(same(classId), finishTestCaptor.capture()); - FinishTestItemRQ finishSuite = finishSuiteCaptor.getAllValues().get(0); - assertThat(finishSuite.getStatus(), equalTo(passedStatus)); - assertThat(finishSuite.getDescription(), equalTo(String.format(suiteErrorMessagePattern, assertErrorMessage))); - List finishTests = finishTestCaptor.getAllValues(); FinishTestItemRQ testCaseWithDescriptionAndAssertException = finishTests.stream() .filter(f -> f.getDescription().startsWith(testWithDescriptionAndAssertException)) @@ -96,13 +77,13 @@ public void verify_retrieve_by_description() { .findFirst() .orElseThrow(NoSuchElementException::new); - assertThat(testCaseWithDescriptionAndAssertException.getDescription(), equalTo(String.format(testErrorMessagePattern, testWithDescriptionAndAssertException, assertErrorMessage))); + assertThat(testCaseWithDescriptionAndAssertException.getDescription(), startsWith(String.format(testErrorMessagePattern, testWithDescriptionAndAssertException, assertErrorMessage))); assertThat(testCaseWithDescriptionAndAssertException.getStatus(), equalTo(failedStatus)); - assertThat(testCaseWithDescriptionAndStepError.getDescription(), equalTo(String.format(testErrorMessagePattern, testWithDescriptionAndStepError, exceptionStepErrorMessage))); + assertThat(testCaseWithDescriptionAndStepError.getDescription(), startsWith(String.format(testErrorMessagePattern, testWithDescriptionAndStepError, exceptionStepErrorMessage))); assertThat(testCaseWithDescriptionAndStepError.getStatus(), equalTo(failedStatus)); - assertThat(tesCaseWithDescriptionAndException.getDescription(), equalTo(String.format(testErrorMessagePattern, testWithDescriptionAndException, exceptionErrorMessage))); + assertThat(tesCaseWithDescriptionAndException.getDescription(), startsWith(String.format(testErrorMessagePattern, testWithDescriptionAndException, exceptionErrorMessage))); assertThat(tesCaseWithDescriptionAndException.getStatus(), equalTo(failedStatus)); assertThat(tesCaseWithDescriptionAndPassed.getStatus(), equalTo(passedStatus)); From cbf8853440ef3795ff7ebdb2483769245e8b2ad0 Mon Sep 17 00:00:00 2001 From: Vadzim Hushchanskou Date: Thu, 4 Apr 2024 15:35:17 +0300 Subject: [PATCH 3/6] Client version updated --- CHANGELOG.md | 2 ++ build.gradle | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2572222..a681816 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # Changelog ## [Unreleased] +### Changed +- Client version updated on [5.2.13](https://github.com/reportportal/client-java/releases/tag/5.2.13), by @HardNorth ## [5.2.2] ### Changed diff --git a/build.gradle b/build.gradle index 25c97b8..8359284 100644 --- a/build.gradle +++ b/build.gradle @@ -39,7 +39,7 @@ repositories { } dependencies { - api 'com.epam.reportportal:client-java:5.2.11' + api 'com.epam.reportportal:client-java:5.2.13' api 'com.nordstrom.tools:junit-foundation:17.0.3' implementation 'org.slf4j:slf4j-api:2.0.7' From 03b2193879689a5799a4f0f3e4c3746b76b2da31 Mon Sep 17 00:00:00 2001 From: Vadzim Hushchanskou Date: Thu, 4 Apr 2024 15:40:48 +0300 Subject: [PATCH 4/6] CHANGELOG.md update --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a681816..650c66c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # Changelog ## [Unreleased] +### Added +- Putting last error log of tests to Items' description, by @HardNorth ### Changed - Client version updated on [5.2.13](https://github.com/reportportal/client-java/releases/tag/5.2.13), by @HardNorth From 34e47f84ad64058a33e622fa8228da9c994f203c Mon Sep 17 00:00:00 2001 From: Vadzim Hushchanskou Date: Thu, 4 Apr 2024 15:42:43 +0300 Subject: [PATCH 5/6] CHANGELOG.md update --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 650c66c..f7800a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ ## [Unreleased] ### Added -- Putting last error log of tests to Items' description, by @HardNorth +- Putting last error log of tests to Items' description, by @utdacc ### Changed - Client version updated on [5.2.13](https://github.com/reportportal/client-java/releases/tag/5.2.13), by @HardNorth From 8814612af8d2a1e535214502cf847d4adb47405b Mon Sep 17 00:00:00 2001 From: Vadzim Hushchanskou Date: Thu, 4 Apr 2024 15:43:00 +0300 Subject: [PATCH 6/6] CHANGELOG.md update --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f7800a8..0f4c3b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ ## [Unreleased] ### Added -- Putting last error log of tests to Items' description, by @utdacc +- Putting last error logs of tests to Items' description, by @utdacc ### Changed - Client version updated on [5.2.13](https://github.com/reportportal/client-java/releases/tag/5.2.13), by @HardNorth