Skip to content

Commit dadb8a2

Browse files
committed
utils refactoring
1 parent 338c7de commit dadb8a2

File tree

5 files changed

+109
-95
lines changed

5 files changed

+109
-95
lines changed

allure-java-commons/src/main/java/io/qameta/allure/aspects/StepsAspects.java

Lines changed: 17 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,9 @@
55
import io.qameta.allure.Step;
66
import io.qameta.allure.model.Status;
77
import io.qameta.allure.model.StepResult;
8-
import org.aspectj.lang.JoinPoint;
9-
import org.aspectj.lang.annotation.AfterReturning;
10-
import org.aspectj.lang.annotation.AfterThrowing;
8+
import org.aspectj.lang.ProceedingJoinPoint;
9+
import org.aspectj.lang.annotation.Around;
1110
import org.aspectj.lang.annotation.Aspect;
12-
import org.aspectj.lang.annotation.Before;
13-
import org.aspectj.lang.annotation.Pointcut;
1411
import org.aspectj.lang.reflect.MethodSignature;
1512

1613
import java.util.Objects;
@@ -21,7 +18,6 @@
2118
import static io.qameta.allure.util.NamingUtils.processNameTemplate;
2219
import static io.qameta.allure.util.ResultsUtils.getStatus;
2320
import static io.qameta.allure.util.ResultsUtils.getStatusDetails;
24-
import static io.qameta.allure.util.ResultsUtils.processDescription;
2521

2622
/**
2723
* @author Dmitry Baev charlie@yandex-team.ru
@@ -33,18 +29,9 @@ public class StepsAspects {
3329

3430
private static AllureLifecycle lifecycle;
3531

36-
@Pointcut("@annotation(io.qameta.allure.Step)")
37-
public void withStepAnnotation() {
38-
//pointcut body, should be empty
39-
}
40-
41-
@Pointcut("execution(* *(..))")
42-
public void anyMethod() {
43-
//pointcut body, should be empty
44-
}
45-
46-
@Before("anyMethod() && withStepAnnotation()")
47-
public void stepStart(final JoinPoint joinPoint) {
32+
@SuppressWarnings("PMD.UnnecessaryLocalBeforeReturn")
33+
@Around("@annotation(io.qameta.allure.Step) && execution(* *(..))")
34+
public Object step(final ProceedingJoinPoint joinPoint) throws Throwable {
4835
final MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
4936
final Step step = methodSignature.getMethod().getAnnotation(Step.class);
5037
final String name = step.value().isEmpty()
@@ -54,22 +41,19 @@ public void stepStart(final JoinPoint joinPoint) {
5441
final StepResult result = new StepResult()
5542
.withName(name)
5643
.withParameters(getParameters(methodSignature, joinPoint.getArgs()));
57-
processDescription(getClass().getClassLoader(), methodSignature.getMethod(), result);
5844
getLifecycle().startStep(uuid, result);
59-
}
60-
61-
@AfterThrowing(pointcut = "anyMethod() && withStepAnnotation()", throwing = "e")
62-
public void stepFailed(final Throwable e) {
63-
getLifecycle().updateStep(result -> result
64-
.withStatus(getStatus(e).orElse(Status.BROKEN))
65-
.withStatusDetails(getStatusDetails(e).orElse(null)));
66-
getLifecycle().stopStep();
67-
}
68-
69-
@AfterReturning("anyMethod() && withStepAnnotation()")
70-
public void stepStop() {
71-
getLifecycle().updateStep(step -> step.withStatus(Status.PASSED));
72-
getLifecycle().stopStep();
45+
try {
46+
final Object proceed = joinPoint.proceed();
47+
getLifecycle().updateStep(uuid, s -> s.withStatus(Status.PASSED));
48+
return proceed;
49+
} catch (Throwable e) {
50+
getLifecycle().updateStep(uuid, s -> s
51+
.withStatus(getStatus(e).orElse(Status.BROKEN))
52+
.withStatusDetails(getStatusDetails(e).orElse(null)));
53+
throw e;
54+
} finally {
55+
getLifecycle().stopStep(uuid);
56+
}
7357
}
7458

7559
/**

allure-java-commons/src/main/java/io/qameta/allure/util/AspectUtils.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import io.qameta.allure.model.Parameter;
44
import org.aspectj.lang.reflect.MethodSignature;
55

6+
import java.util.Arrays;
67
import java.util.HashMap;
78
import java.util.Map;
89
import java.util.Objects;
@@ -20,7 +21,7 @@ private AspectUtils() {
2021
public static Parameter[] getParameters(final MethodSignature signature, final Object... args) {
2122
return IntStream.range(0, args.length).mapToObj(index -> {
2223
final String name = signature.getParameterNames()[index];
23-
final String value = Objects.toString(args[index]);
24+
final String value = objectToString(args[index]);
2425
return new Parameter().withName(name).withValue(value);
2526
}).toArray(Parameter[]::new);
2627
}
@@ -33,4 +34,11 @@ public static Map<String, Object> getParametersMap(final MethodSignature signatu
3334
}
3435
return params;
3536
}
37+
38+
public static String objectToString(final Object object) {
39+
if (Objects.nonNull(object) && (object instanceof Object[])) {
40+
return Arrays.toString((Object[]) object);
41+
}
42+
return Objects.toString(object);
43+
}
3644
}

allure-java-commons/src/main/java/io/qameta/allure/util/ResultsUtils.java

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package io.qameta.allure.util;
22

33
import com.google.common.io.Resources;
4-
import io.qameta.allure.AllureResultsWriteException;
54
import io.qameta.allure.Description;
65
import io.qameta.allure.Epic;
76
import io.qameta.allure.Feature;
@@ -17,6 +16,7 @@
1716
import org.slf4j.Logger;
1817
import org.slf4j.LoggerFactory;
1918

19+
import javax.xml.bind.DatatypeConverter;
2020
import java.io.IOException;
2121
import java.io.PrintWriter;
2222
import java.io.StringWriter;
@@ -29,7 +29,6 @@
2929
import java.nio.charset.StandardCharsets;
3030
import java.security.MessageDigest;
3131
import java.security.NoSuchAlgorithmException;
32-
import java.util.Base64;
3332
import java.util.List;
3433
import java.util.Objects;
3534
import java.util.Optional;
@@ -62,6 +61,7 @@ public final class ResultsUtils {
6261

6362
private static final Logger LOGGER = LoggerFactory.getLogger(ResultsUtils.class);
6463
private static final String ALLURE_DESCRIPTIONS_PACKAGE = "allureDescriptions/";
64+
private static final String MD_5 = "MD5";
6565

6666
private static String cachedHost;
6767

@@ -198,6 +198,24 @@ public static String getLinkTypePatternPropertyName(final String type) {
198198
return String.format("allure.link.%s.pattern", type);
199199
}
200200

201+
public static String generateMethodSignatureHash(final String methodName, final List<String> parameterTypes) {
202+
final MessageDigest md = getMd5Digest();
203+
md.update(methodName.getBytes(StandardCharsets.UTF_8));
204+
parameterTypes.stream()
205+
.map(string -> string.getBytes(StandardCharsets.UTF_8))
206+
.forEach(md::update);
207+
208+
return DatatypeConverter.printHexBinary(md.digest()).toLowerCase();
209+
}
210+
211+
public static MessageDigest getMd5Digest() {
212+
try {
213+
return MessageDigest.getInstance(MD_5);
214+
} catch (NoSuchAlgorithmException e) {
215+
throw new IllegalStateException("Can not find hashing algorithm", e);
216+
}
217+
}
218+
201219
private static String getLinkUrl(final String name, final String type) {
202220
final Properties properties = PropertiesUtils.loadAllureProperties();
203221
final String pattern = properties.getProperty(getLinkTypePatternPropertyName(type));
@@ -257,16 +275,5 @@ public static void processDescription(final ClassLoader classLoader, final Metho
257275
}
258276
}
259277

260-
public static String generateMethodSignatureHash(final String methodName, final List<String> parameterTypes) {
261-
final MessageDigest hasher;
262-
try {
263-
hasher = MessageDigest.getInstance("MD5");
264-
} catch (NoSuchAlgorithmException e) {
265-
throw new AllureResultsWriteException("Unable to instantiate MD5 hash generator", e);
266-
}
267-
final String signature = methodName + parameterTypes.stream().collect(Collectors.joining(" "));
268-
return Base64.getUrlEncoder().encodeToString(hasher.digest(signature.getBytes(StandardCharsets.UTF_8)));
269-
}
270-
271278
}
272279

Lines changed: 51 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package io.qameta.allure;
22

33
import io.qameta.allure.aspects.StepsAspects;
4+
import io.qameta.allure.model.ExecutableItem;
5+
import io.qameta.allure.model.Parameter;
46
import io.qameta.allure.model.StepResult;
57
import io.qameta.allure.model.TestResult;
68
import io.qameta.allure.test.AllureResultsWriterStub;
@@ -13,6 +15,7 @@
1315

1416
import static java.util.Arrays.asList;
1517
import static org.assertj.core.api.Assertions.assertThat;
18+
import static org.assertj.core.api.Assertions.tuple;
1619

1720
/**
1821
* @author sskorol (Sergey Korol)
@@ -21,27 +24,16 @@ public class StepsTest {
2124

2225
@Test
2326
public void shouldTransformPlaceholdersToPropertyValues() {
24-
final AllureResultsWriterStub results = new AllureResultsWriterStub();
25-
final AllureLifecycle lifecycle = new AllureLifecycle(results);
26-
StepsAspects.setLifecycle(lifecycle);
27-
28-
final String uuid = UUID.randomUUID().toString();
29-
final TestResult result = new TestResult().withUuid(uuid);
30-
31-
lifecycle.scheduleTestCase(result);
32-
lifecycle.startTestCase(uuid);
33-
34-
final DummyEmail[] emails = new DummyEmail[]{
35-
new DummyEmail("test1@email.com", asList("txt", "png")),
36-
new DummyEmail("test2@email.com", asList("jpg", "mp4")),
37-
null
38-
};
39-
final DummyCard card = new DummyCard("1111222233334444");
27+
final AllureResultsWriterStub results = runStep(() -> {
28+
final DummyEmail[] emails = new DummyEmail[]{
29+
new DummyEmail("test1@email.com", asList("txt", "png")),
30+
new DummyEmail("test2@email.com", asList("jpg", "mp4")),
31+
null
32+
};
33+
final DummyCard card = new DummyCard("1111222233334444");
4034

41-
loginWith(new DummyUser(emails, "12345678", card), true);
42-
43-
lifecycle.stopTestCase(uuid);
44-
lifecycle.writeTestCase(uuid);
35+
loginWith(new DummyUser(emails, "12345678", card), true);
36+
});
4537

4638
assertThat(results.getTestResults())
4739
.flatExtracting(TestResult::getSteps)
@@ -57,26 +49,28 @@ public void shouldTransformPlaceholdersToPropertyValues() {
5749

5850
@Test
5951
public void shouldNotFailOnSpecialSymbolsInNameString() {
60-
final AllureResultsWriterStub results = new AllureResultsWriterStub();
61-
final AllureLifecycle lifecycle = new AllureLifecycle(results);
62-
StepsAspects.setLifecycle(lifecycle);
63-
64-
final String uuid = UUID.randomUUID().toString();
65-
final TestResult result = new TestResult().withUuid(uuid);
66-
lifecycle.scheduleTestCase(result);
67-
lifecycle.startTestCase(uuid);
68-
69-
final String parameter = "$abc";
70-
checkData(parameter);
71-
72-
lifecycle.stopTestCase(uuid);
73-
lifecycle.writeTestCase(uuid);
52+
final AllureResultsWriterStub results = runStep(() -> {
53+
checkData("$abc");
54+
});
7455
assertThat(results.getTestResults())
7556
.flatExtracting(TestResult::getSteps)
7657
.extracting(StepResult::getName)
7758
.containsExactly("TestData = $abc");
7859
}
7960

61+
@Test
62+
public void shouldSupportArrayParameters() throws Exception {
63+
final AllureResultsWriterStub results = runStep(() -> step("a", "b"));
64+
65+
assertThat(results.getTestResults())
66+
.flatExtracting(TestResult::getSteps)
67+
.flatExtracting(ExecutableItem::getParameters)
68+
.extracting(Parameter::getName, Parameter::getValue)
69+
.containsExactlyInAnyOrder(
70+
tuple("parameters", "[a, b]")
71+
);
72+
}
73+
8074
@Step("\"{user.emails.address}\", \"{user.emails}\", \"{user.emails.attachments}\", \"{user.password}\", \"{}\"," +
8175
" \"{user.card.number}\", \"{missing}\", {staySignedIn}")
8276
private void loginWith(final DummyUser user, final boolean staySignedIn) {
@@ -85,4 +79,27 @@ private void loginWith(final DummyUser user, final boolean staySignedIn) {
8579
@Step("TestData = {value}")
8680
public void checkData(final String value) {
8781
}
82+
83+
@Step
84+
public void step(final String... parameters) {
85+
}
86+
87+
public static AllureResultsWriterStub runStep(final Runnable runnable) {
88+
final AllureResultsWriterStub results = new AllureResultsWriterStub();
89+
final AllureLifecycle lifecycle = new AllureLifecycle(results);
90+
StepsAspects.setLifecycle(lifecycle);
91+
final String uuid = UUID.randomUUID().toString();
92+
final TestResult result = new TestResult().withUuid(uuid);
93+
lifecycle.scheduleTestCase(result);
94+
lifecycle.startTestCase(uuid);
95+
96+
try {
97+
runnable.run();
98+
} finally {
99+
lifecycle.stopTestCase(uuid);
100+
lifecycle.writeTestCase(uuid);
101+
StepsAspects.setLifecycle(Allure.getLifecycle());
102+
}
103+
return results;
104+
}
88105
}

allure-testng/src/test/java/io/qameta/allure/testng/AllureTestNgTest.java

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.qameta.allure.testng;
22

3+
import io.qameta.allure.Allure;
34
import io.qameta.allure.AllureLifecycle;
45
import io.qameta.allure.Epic;
56
import io.qameta.allure.Feature;
@@ -56,13 +57,12 @@ public class AllureTestNgTest {
5657

5758
private TestNG testNg;
5859
private AllureResultsWriterStub results;
60+
private AllureLifecycle lifecycle;
5961

6062
@BeforeMethod(description = "Configure TestNG engine")
6163
public void prepare() {
6264
results = new AllureResultsWriterStub();
63-
final AllureLifecycle lifecycle = new AllureLifecycle(results);
64-
StepsAspects.setLifecycle(lifecycle);
65-
AttachmentsAspects.setLifecycle(lifecycle);
65+
lifecycle = new AllureLifecycle(results);
6666
AllureTestNg adapter = new AllureTestNg(lifecycle);
6767
testNg = new TestNG(false);
6868
testNg.addListener((ITestNGListener) adapter);
@@ -98,10 +98,9 @@ public void singleTest() {
9898
}
9999

100100
@Feature("Descriptions")
101-
@Test(description = "Descriptions of tests and steps")
101+
@Test(description = "Javadoc descriptions of tests")
102102
public void descriptionsTest() {
103103
final String testDescription = "Sample test description";
104-
final String stepDescription = "Sample step description";
105104
runTestNgSuites("suites/descriptions-test.xml");
106105
List<TestResult> testResult = results.getTestResults();
107106

@@ -110,14 +109,6 @@ public void descriptionsTest() {
110109
.extracting(result -> result.getDescriptionHtml().trim())
111110
.as("Javadoc description of test case has not been processed")
112111
.contains(testDescription);
113-
114-
assertThat(testResult)
115-
.flatExtracting(TestResult::getSteps)
116-
.as("Steps have not been processed")
117-
.hasSize(1)
118-
.extracting(result -> result.getDescriptionHtml().trim())
119-
.as("Javadoc description of steps has not been processed")
120-
.contains(stepDescription);
121112
}
122113

123114
@Feature("Failed tests")
@@ -781,7 +772,14 @@ private void runTestNgSuites(String... suites) {
781772
.collect(Collectors.toList());
782773
assertThat(suites).as("Cannot find all suite xml files").hasSameSizeAs(suiteFiles);
783774
testNg.setTestSuites(suiteFiles);
784-
testNg.run();
775+
try {
776+
StepsAspects.setLifecycle(lifecycle);
777+
AttachmentsAspects.setLifecycle(lifecycle);
778+
testNg.run();
779+
} finally {
780+
StepsAspects.setLifecycle(Allure.getLifecycle());
781+
AttachmentsAspects.setLifecycle(Allure.getLifecycle());
782+
}
785783
}
786784

787785
@Step("Find resutls by name")

0 commit comments

Comments
 (0)