diff --git a/allure-java-commons/src/main/java/io/qameta/allure/util/AspectUtils.java b/allure-java-commons/src/main/java/io/qameta/allure/util/AspectUtils.java index 95b333a1e..13dbcb26f 100644 --- a/allure-java-commons/src/main/java/io/qameta/allure/util/AspectUtils.java +++ b/allure-java-commons/src/main/java/io/qameta/allure/util/AspectUtils.java @@ -55,10 +55,34 @@ public static List getParameters(final MethodSignature signature, fin }).collect(Collectors.toList()); } + @SuppressWarnings({ + "CyclomaticComplexity", + "ReturnCount", + "PMD.NcssCount", + "PMD.CyclomaticComplexity" + }) public static String objectToString(final Object object) { try { - if (Objects.nonNull(object) && (object instanceof Object[])) { - return Arrays.toString((Object[]) object); + if (Objects.nonNull(object) && object.getClass().isArray()) { + if (object instanceof Object[]) { + return Arrays.toString((Object[]) object); + } else if (object instanceof long[]) { + return Arrays.toString((long[]) object); + } else if (object instanceof short[]) { + return Arrays.toString((short[]) object); + } else if (object instanceof int[]) { + return Arrays.toString((int[]) object); + } else if (object instanceof char[]) { + return Arrays.toString((char[]) object); + } else if (object instanceof double[]) { + return Arrays.toString((double[]) object); + } else if (object instanceof float[]) { + return Arrays.toString((float[]) object); + } else if (object instanceof boolean[]) { + return Arrays.toString((boolean[]) object); + } else if (object instanceof byte[]) { + return Arrays.toString((byte[]) object); + } } return Objects.toString(object); } catch (Exception e) { diff --git a/allure-testng/src/main/java/io/qameta/allure/testng/AllureTestNg.java b/allure-testng/src/main/java/io/qameta/allure/testng/AllureTestNg.java index 3f1555567..e3cb9b873 100644 --- a/allure-testng/src/main/java/io/qameta/allure/testng/AllureTestNg.java +++ b/allure-testng/src/main/java/io/qameta/allure/testng/AllureTestNg.java @@ -18,6 +18,7 @@ import io.qameta.allure.model.StatusDetails; import io.qameta.allure.model.TestResult; import io.qameta.allure.model.TestResultContainer; +import io.qameta.allure.util.AspectUtils; import io.qameta.allure.util.ResultsUtils; import org.testng.IAttributes; import org.testng.IClass; @@ -640,7 +641,7 @@ private List getParameters(final ITestResult testResult) { .map(java.lang.reflect.Parameter::getName) .toArray(String[]::new); final String[] parameterValues = Stream.of(testResult.getParameters()) - .map(this::convertParameterValueToString) + .map(AspectUtils::objectToString) .toArray(String[]::new); final Stream methodParameters = range(0, min(parameterNames.length, parameterValues.length)) .mapToObj(i -> new Parameter().setName(parameterNames[i]).setValue(parameterValues[i])); @@ -648,13 +649,6 @@ private List getParameters(final ITestResult testResult) { .collect(Collectors.toList()); } - private String convertParameterValueToString(final Object parameter) { - if (Objects.nonNull(parameter) && parameter.getClass().isArray()) { - return Arrays.toString((Object[]) parameter); - } - return Objects.toString(parameter); - } - private String getMethodName(final ITestNGMethod method) { return firstNonEmpty( method.getDescription(), diff --git a/allure-testng/src/test/java/io/qameta/allure/testng/AllureTestNgTest.java b/allure-testng/src/test/java/io/qameta/allure/testng/AllureTestNgTest.java index 2d7652f3d..95621d094 100644 --- a/allure-testng/src/test/java/io/qameta/allure/testng/AllureTestNgTest.java +++ b/allure-testng/src/test/java/io/qameta/allure/testng/AllureTestNgTest.java @@ -1036,6 +1036,38 @@ public void shouldDisplayDisabledTests() { } + @SuppressWarnings("unchecked") + @Feature("Parameters") + @Issue("129") + @Test + public void shouldNotFailForNullParameters() { + final AllureResults results = runTestNgSuites("suites/gh-129.xml"); + + assertThat(results.getTestResults()) + .flatExtracting(TestResult::getParameters) + .extracting(Parameter::getName, Parameter::getValue) + .containsExactly( + tuple("arg0", "null") + ); + } + + @SuppressWarnings("unchecked") + @Feature("Parameters") + @Issue("128") + @Test + public void shouldProcessArrayParameters() { + final AllureResults results = runTestNgSuites("suites/gh-128.xml"); + + assertThat(results.getTestResults()) + .flatExtracting(TestResult::getParameters) + .extracting(Parameter::getName, Parameter::getValue) + .containsExactly( + tuple("arg0", "a"), + tuple("arg1", "false"), + tuple("arg2", "[1, 2, 3]") + ); + } + private AllureResults runTestNgSuites(final String... suites) { final Consumer emptyConfigurer = testNg -> { }; diff --git a/allure-testng/src/test/java/io/qameta/allure/testng/samples/DataProviderWithArray.java b/allure-testng/src/test/java/io/qameta/allure/testng/samples/DataProviderWithArray.java new file mode 100644 index 000000000..8a3037291 --- /dev/null +++ b/allure-testng/src/test/java/io/qameta/allure/testng/samples/DataProviderWithArray.java @@ -0,0 +1,22 @@ +package io.qameta.allure.testng.samples; + +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +/** + * @author charlie (Dmitry Baev). + */ +public class DataProviderWithArray { + + @DataProvider(name = "someProvider") + public static Object[][] someProvider() { + return new Object[][]{ + new Object[]{"a", false, new int[]{1, 2, 3}} + }; + } + + @Test(dataProvider = "someProvider") + public void someTest(final String first, final boolean second, final int[] third) { + } + +} diff --git a/allure-testng/src/test/java/io/qameta/allure/testng/samples/NullParamTest.java b/allure-testng/src/test/java/io/qameta/allure/testng/samples/NullParamTest.java new file mode 100644 index 000000000..1b9eb885b --- /dev/null +++ b/allure-testng/src/test/java/io/qameta/allure/testng/samples/NullParamTest.java @@ -0,0 +1,21 @@ +package io.qameta.allure.testng.samples; + +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +/** + * @author charlie (Dmitry Baev). + */ +public class NullParamTest { + + @DataProvider(name = "someProvider") + public static Object[][] someProvider() { + return new Object[][]{ + new Object[]{null} + }; + } + + @Test(dataProvider = "someProvider") + public void someTest(final String param) { + } +} diff --git a/allure-testng/src/test/resources/suites/gh-128.xml b/allure-testng/src/test/resources/suites/gh-128.xml new file mode 100644 index 000000000..a55b8b93b --- /dev/null +++ b/allure-testng/src/test/resources/suites/gh-128.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/allure-testng/src/test/resources/suites/gh-129.xml b/allure-testng/src/test/resources/suites/gh-129.xml new file mode 100644 index 000000000..587d8c661 --- /dev/null +++ b/allure-testng/src/test/resources/suites/gh-129.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file