Skip to content

Commit 1b1152b

Browse files
authored
fix parameters processing for migrations (fixes allure-framework#206, via allure-framework#272)
1 parent 2bc9bcb commit 1b1152b

7 files changed

Lines changed: 119 additions & 60 deletions

File tree

allure-java-migration/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ dependencies {
1212
testCompile("junit:junit")
1313
testCompile("org.assertj:assertj-core")
1414
testCompile("org.mockito:mockito-core")
15+
testCompile("org.slf4j:slf4j-simple")
1516
testCompile("org.testng:testng")
1617
testCompile(project(":allure-java-commons-test"))
1718
}

allure-java-migration/src/main/java/io/qameta/allure/aspects/Allure1Annotations.java

Lines changed: 14 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import io.qameta.allure.model.Link;
55
import io.qameta.allure.model.Parameter;
66
import io.qameta.allure.model.TestResult;
7-
import org.apache.commons.lang3.reflect.FieldUtils;
87
import org.aspectj.lang.reflect.MethodSignature;
98
import ru.yandex.qatools.allure.annotations.Description;
109
import ru.yandex.qatools.allure.annotations.Features;
@@ -16,15 +15,13 @@
1615
import ru.yandex.qatools.allure.annotations.Title;
1716
import ru.yandex.qatools.allure.model.DescriptionType;
1817

19-
import java.lang.reflect.Field;
2018
import java.lang.reflect.Method;
2119
import java.util.ArrayList;
2220
import java.util.Arrays;
23-
import java.util.HashMap;
2421
import java.util.List;
25-
import java.util.Map;
2622
import java.util.Objects;
2723
import java.util.stream.Collectors;
24+
import java.util.stream.IntStream;
2825

2926
/**
3027
* Allure labels utils.
@@ -35,14 +32,11 @@ final class Allure1Annotations {
3532

3633
private final MethodSignature signature;
3734

38-
private final Object target;
39-
4035
private final Object[] args;
4136

42-
Allure1Annotations(final Object target, final MethodSignature signature, final Object... args) {
37+
Allure1Annotations(final MethodSignature signature, final Object... args) {
4338
this.args = Arrays.copyOf(args, args.length);
4439
this.signature = signature;
45-
this.target = target;
4640
}
4741

4842
public void updateTitle(final TestResult result) {
@@ -83,37 +77,20 @@ public void updateLinks(final TestResult result) {
8377
}
8478

8579
public void updateParameters(final TestResult result) {
86-
final Map<String, String> parameters = getParameters();
87-
result.getParameters().stream()
88-
.map(Parameter::getName)
89-
.filter(parameters::containsKey)
90-
.forEach(parameters::remove);
91-
parameters.forEach((n, v) -> result.getParameters().add(new Parameter().setName(n).setValue(v)));
92-
}
93-
94-
private Map<String, String> getParameters() {
95-
final Map<String, String> parameters = new HashMap<>();
96-
parameters.putAll(getMethodParameters());
97-
parameters.putAll(getClassParameters());
98-
return parameters;
80+
result.getParameters().addAll(getMethodParameters());
9981
}
10082

101-
private Map<String, String> getMethodParameters() {
102-
final Map<String, String> parameters = new HashMap<>();
103-
final String[] names = signature.getParameterNames();
104-
for (int i = 0; i < names.length; i++) {
105-
parameters.put(names[i], Objects.toString(args[i]));
106-
}
107-
return parameters;
108-
}
109-
110-
private Map<String, String> getClassParameters() {
111-
final List<Field> fields = FieldUtils.getFieldsListWithAnnotation(getType(),
112-
ru.yandex.qatools.allure.annotations.Parameter.class);
113-
114-
return fields.stream().collect(
115-
Collectors.toMap(Allure1Utils::getParameterName, f -> Allure1Utils.getParameterValue(f, target))
116-
);
83+
private List<Parameter> getMethodParameters() {
84+
final String[] parameterNames = signature.getParameterNames();
85+
return IntStream.range(0, parameterNames.length)
86+
.mapToObj(index -> {
87+
final String name = parameterNames[index];
88+
final String value = Objects.toString(args[index]);
89+
return new Parameter()
90+
.setName(name)
91+
.setValue(value);
92+
})
93+
.collect(Collectors.toList());
11794
}
11895

11996
private Class<?> getType() {
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package io.qameta.allure.aspects;
2+
3+
import io.qameta.allure.Allure;
4+
import io.qameta.allure.AllureLifecycle;
5+
import org.aspectj.lang.JoinPoint;
6+
import org.aspectj.lang.annotation.After;
7+
import org.aspectj.lang.annotation.Aspect;
8+
import org.aspectj.lang.annotation.Pointcut;
9+
import org.aspectj.lang.reflect.FieldSignature;
10+
import ru.yandex.qatools.allure.annotations.Parameter;
11+
12+
import java.util.Objects;
13+
14+
/**
15+
* Aspects for Allure1 Parameters.
16+
*/
17+
@SuppressWarnings("all")
18+
@Aspect
19+
public class Allure1ParametersAspects {
20+
21+
private static AllureLifecycle lifecycle;
22+
23+
@Pointcut("@annotation(ru.yandex.qatools.allure.annotations.Parameter)")
24+
public void withParameterAnnotation() {
25+
//pointcut body, should be empty
26+
}
27+
28+
@Pointcut("set(* *)")
29+
public void setValueToAnyField() {
30+
//pointcut body, should be empty
31+
}
32+
33+
@After("setValueToAnyField() && withParameterAnnotation()")
34+
public void parameterValueChanged(JoinPoint joinPoint) {
35+
try {
36+
FieldSignature fieldSignature = (FieldSignature) joinPoint.getSignature();
37+
Parameter parameter = fieldSignature.getField().getAnnotation(Parameter.class);
38+
String name = parameter.value().isEmpty() ? fieldSignature.getName() : parameter.value();
39+
String value = Objects.toString(joinPoint.getArgs()[0]);
40+
41+
getLifecycle().updateTestCase(testResult ->
42+
testResult.getParameters().add(new io.qameta.allure.model.Parameter()
43+
.setName(name).setValue(value)
44+
)
45+
);
46+
} catch (Exception ignored) {
47+
}
48+
}
49+
50+
/**
51+
* For tests only.
52+
*/
53+
public static void setLifecycle(final AllureLifecycle allure) {
54+
lifecycle = allure;
55+
}
56+
57+
public static AllureLifecycle getLifecycle() {
58+
if (Objects.isNull(lifecycle)) {
59+
lifecycle = Allure.getLifecycle();
60+
}
61+
return lifecycle;
62+
}
63+
}

allure-java-migration/src/main/java/io/qameta/allure/aspects/Allure1TestCaseAspects.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,7 @@ public void testNgTestStart(final JoinPoint joinPoint) {
3030
private void updateTestCase(final JoinPoint joinPoint) {
3131
final MethodSignature signature = (MethodSignature) joinPoint.getSignature();
3232
final Object[] args = joinPoint.getArgs();
33-
final Object target = joinPoint.getTarget();
34-
final Allure1Annotations annotations = new Allure1Annotations(target, signature, args);
33+
final Allure1Annotations annotations = new Allure1Annotations(signature, args);
3534
getLifecycle().getCurrentTestCase().ifPresent(uuid -> {
3635
getLifecycle().updateTestCase(uuid, annotations::updateTitle);
3736
getLifecycle().updateTestCase(uuid, annotations::updateDescription);

allure-java-migration/src/main/java/io/qameta/allure/aspects/Allure1Utils.java

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import java.lang.annotation.Annotation;
1414
import java.lang.reflect.AnnotatedElement;
1515
import java.lang.reflect.Array;
16-
import java.lang.reflect.Field;
1716
import java.lang.reflect.Method;
1817
import java.text.MessageFormat;
1918
import java.util.ArrayList;
@@ -72,8 +71,8 @@ public static String getParametersAsString(final Object... parameters) {
7271
public static String getTitle(final String namePattern, final String methodName,
7372
final Object instance, final Object... parameters) {
7473
final String finalPattern = namePattern
75-
.replaceAll("\\{method\\}", methodName)
76-
.replaceAll("\\{this\\}", String.valueOf(instance));
74+
.replaceAll("\\{method}", methodName)
75+
.replaceAll("\\{this}", String.valueOf(instance));
7776
final int paramsCount = parameters == null ? 0 : parameters.length;
7877
final Object[] results = new Object[paramsCount];
7978
for (int i = 0; i < paramsCount; i++) {
@@ -100,7 +99,7 @@ public static Object arrayToString(final Object obj) {
10099
}
101100

102101
public static <T extends Annotation> List<Label> getLabels(final Method method, final Class<T> annotation,
103-
final Function<T, List<Label>> extractor) {
102+
final Function<T, List<Label>> extractor) {
104103
final List<Label> labels = new ArrayList<>();
105104
labels.addAll(getLabels((AnnotatedElement) method, annotation, extractor));
106105
labels.addAll(getLabels(method.getDeclaringClass(), annotation, extractor));
@@ -124,8 +123,8 @@ public static <T extends Annotation> List<Link> getLinks(final Method method, fi
124123
}
125124

126125
private static <T extends Annotation> List<Link> getLinks(final AnnotatedElement element,
127-
final Class<T> annotation,
128-
final Function<T, List<Link>> extractor) {
126+
final Class<T> annotation,
127+
final Function<T, List<Link>> extractor) {
129128
return element.isAnnotationPresent(annotation)
130129
? extractor.apply(element.getAnnotation(annotation))
131130
: Collections.emptyList();
@@ -165,17 +164,4 @@ private static Link createLink(final Issue issue) {
165164
return ResultsUtils.createIssueLink(issue.value());
166165
}
167166

168-
public static String getParameterName(final Field field) {
169-
final String value = field.getAnnotation(ru.yandex.qatools.allure.annotations.Parameter.class).value();
170-
return value.isEmpty() ? field.getName() : value;
171-
}
172-
173-
public static String getParameterValue(final Field field, final Object target) {
174-
try {
175-
return field.get(target).toString();
176-
} catch (IllegalAccessException e) {
177-
return null;
178-
}
179-
}
180-
181167
}

allure-java-migration/src/main/resources/META-INF/aop-ajc.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
<aspect name="io.qameta.allure.aspects.Allure1TestCaseAspects"/>
44
<aspect name="io.qameta.allure.aspects.Allure1StepsAspects"/>
55
<aspect name="io.qameta.allure.aspects.Allure1AttachAspects"/>
6+
<aspect name="io.qameta.allure.aspects.Allure1ParametersAspects"/>
67
</aspects>
78
<weaver options="-warn:none -Xlint:ignore"/>
89
</aspectj>

allure-java-migration/src/test/java/io/qameta/allure/aspects/Allure1TestCaseAspectsTest.java

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import ru.yandex.qatools.allure.annotations.Features;
1414
import ru.yandex.qatools.allure.annotations.Issue;
1515
import ru.yandex.qatools.allure.annotations.Issues;
16+
import ru.yandex.qatools.allure.annotations.Parameter;
1617
import ru.yandex.qatools.allure.annotations.Severity;
1718
import ru.yandex.qatools.allure.annotations.Stories;
1819
import ru.yandex.qatools.allure.annotations.TestCaseId;
@@ -24,6 +25,7 @@
2425
import java.util.UUID;
2526

2627
import static org.assertj.core.api.Assertions.assertThat;
28+
import static org.assertj.core.api.Assertions.tuple;
2729

2830
/**
2931
* eroshenkoam
@@ -52,6 +54,7 @@ public void initLifecycle() {
5254
results = new AllureResultsWriterStub();
5355
lifecycle = new AllureLifecycle(results);
5456
Allure1TestCaseAspects.setLifecycle(lifecycle);
57+
Allure1ParametersAspects.setLifecycle(lifecycle);
5558

5659
final String uuid = UUID.randomUUID().toString();
5760
final TestResult result = new TestResult().setUuid(uuid);
@@ -124,6 +127,19 @@ public void shouldProcessDescriptionAnnotation() {
124127

125128
}
126129

130+
@SuppressWarnings("unchecked")
131+
@Issue("206")
132+
@Test
133+
public void shouldProcessParameterAnnotation() {
134+
assertThat(results.getTestResults())
135+
.flatExtracting(TestResult::getParameters)
136+
.extracting(io.qameta.allure.model.Parameter::getName, io.qameta.allure.model.Parameter::getValue)
137+
.containsExactlyInAnyOrder(
138+
tuple("parameterWithoutName", "testValue1"),
139+
tuple("customParameterName", "testValue2")
140+
);
141+
}
142+
127143
public interface SimpleTest {
128144

129145
void testSomething();
@@ -137,6 +153,13 @@ public interface SimpleTest {
137153
@Features("feature1")
138154
public static class TestNgTest implements SimpleTest {
139155

156+
@Parameter
157+
public String parameterWithoutName;
158+
@Parameter("customParameterName")
159+
private String parameterWithName;
160+
@Parameter
161+
private String uninitializedParameter;
162+
140163
@Title("testcase")
141164
@Description("testcase description")
142165
@Issue("ISSUE-2")
@@ -147,7 +170,8 @@ public static class TestNgTest implements SimpleTest {
147170
@Severity(SeverityLevel.CRITICAL)
148171
@org.testng.annotations.Test
149172
public void testSomething() {
150-
173+
parameterWithoutName = "testValue1";
174+
parameterWithName = "testValue2";
151175
}
152176

153177
}
@@ -159,6 +183,13 @@ public void testSomething() {
159183
@Features("feature1")
160184
public static class JunitTest implements SimpleTest {
161185

186+
@Parameter
187+
private String parameterWithoutName;
188+
@Parameter("customParameterName")
189+
private String parameterWithName;
190+
@Parameter
191+
private String uninitializedParameter;
192+
162193
@Title("testcase")
163194
@Description("testcase description")
164195
@Issue("ISSUE-2")
@@ -169,7 +200,8 @@ public static class JunitTest implements SimpleTest {
169200
@Severity(SeverityLevel.CRITICAL)
170201
@org.junit.Test
171202
public void testSomething() {
172-
203+
parameterWithoutName = "testValue1";
204+
parameterWithName = "testValue2";
173205
}
174206

175207
}

0 commit comments

Comments
 (0)