Skip to content

Commit 45d1730

Browse files
authored
add severity annotation (fixes allure-framework#10, via allure-framework#21)
1 parent 69da339 commit 45d1730

10 files changed

Lines changed: 174 additions & 1 deletion

File tree

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ public final class ResultsUtils {
3939
throw new IllegalStateException("Do not instance");
4040
}
4141

42+
public static Label createLabel(Severity severity) {
43+
return new Label().withName("severity").withValue(severity.value().value());
44+
}
45+
4246
public static Label createLabel(Story story) {
4347
return new Label().withName("story").withValue(story.value());
4448
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package io.qameta.allure;
2+
3+
import java.lang.annotation.Documented;
4+
import java.lang.annotation.ElementType;
5+
import java.lang.annotation.Inherited;
6+
import java.lang.annotation.Retention;
7+
import java.lang.annotation.RetentionPolicy;
8+
import java.lang.annotation.Target;
9+
10+
/**
11+
* Use the annotation to specify severity for the test. Can be
12+
* placed on test class level to specify the default severity for
13+
* all the tests.
14+
*/
15+
@Documented
16+
@Inherited
17+
@Retention(RetentionPolicy.RUNTIME)
18+
@Target({ElementType.METHOD, ElementType.TYPE})
19+
public @interface Severity {
20+
21+
SeverityLevel value();
22+
23+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package io.qameta.allure;
2+
3+
/**
4+
* @author charlie (Dmitry Baev).
5+
*/
6+
public enum SeverityLevel {
7+
8+
BLOCKER("blocker"),
9+
CRITICAL("critical"),
10+
NORMAL("normal"),
11+
MINOR("minor"),
12+
TRIVIAL("trivial");
13+
14+
private final String value;
15+
16+
SeverityLevel(String v) {
17+
value = v;
18+
}
19+
20+
public String value() {
21+
return value;
22+
}
23+
}

allure-testng/src/main/java/io/qameta/allure/testng/AllureTestNg.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import io.qameta.allure.Flaky;
88
import io.qameta.allure.Muted;
99
import io.qameta.allure.ResultsUtils;
10+
import io.qameta.allure.Severity;
1011
import io.qameta.allure.Story;
1112
import io.qameta.allure.model.FixtureResult;
1213
import io.qameta.allure.model.Label;
@@ -376,7 +377,8 @@ private List<Label> getLabels(ITestResult result) {
376377
getAnnotationsOnClass(result, Feature.class).stream().map(ResultsUtils::createLabel),
377378
getAnnotationsOnMethod(result, Feature.class).stream().map(ResultsUtils::createLabel),
378379
getAnnotationsOnClass(result, Story.class).stream().map(ResultsUtils::createLabel),
379-
getAnnotationsOnMethod(result, Story.class).stream().map(ResultsUtils::createLabel)
380+
getAnnotationsOnMethod(result, Story.class).stream().map(ResultsUtils::createLabel),
381+
getSeverity(result)
380382
).reduce(Stream::concat).orElseGet(Stream::empty).collect(Collectors.toList());
381383
}
382384

@@ -391,6 +393,23 @@ private List<Link> getLinks(ITestResult result) {
391393
).reduce(Stream::concat).orElseGet(Stream::empty).collect(Collectors.toList());
392394
}
393395

396+
private Stream<Label> getSeverity(ITestResult result) {
397+
Optional<Label> methodSeverity = getAnnotationsOnMethod(result, Severity.class).stream()
398+
.map(ResultsUtils::createLabel)
399+
.findAny();
400+
if (methodSeverity.isPresent()) {
401+
return Stream.of(methodSeverity.get());
402+
}
403+
404+
Optional<Label> classSeverity = getAnnotationsOnClass(result, Severity.class).stream()
405+
.map(ResultsUtils::createLabel)
406+
.findAny();
407+
if (classSeverity.isPresent()) {
408+
return Stream.of(classSeverity.get());
409+
}
410+
return Stream.empty();
411+
}
412+
394413
private boolean isFlaky(ITestResult result) {
395414
return hasAnnotation(result, Flaky.class);
396415
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package io.qameta.allure.samples;
2+
3+
import io.qameta.allure.Severity;
4+
import io.qameta.allure.SeverityLevel;
5+
import org.testng.annotations.Test;
6+
7+
/**
8+
* @author charlie (Dmitry Baev).
9+
*/
10+
@Severity(SeverityLevel.MINOR)
11+
public class SeverityClassTest {
12+
13+
@Test
14+
@Severity(SeverityLevel.BLOCKER)
15+
public void testWithSeverity() throws Exception {
16+
}
17+
18+
@Test
19+
public void testWithClassSeverity() throws Exception {
20+
}
21+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package io.qameta.allure.samples;
2+
3+
import io.qameta.allure.Severity;
4+
import io.qameta.allure.SeverityLevel;
5+
6+
/**
7+
* @author charlie (Dmitry Baev).
8+
*/
9+
public class SeverityClassTestInherited extends SeverityClassTest {
10+
11+
@Override
12+
public void testWithSeverity() throws Exception {
13+
super.testWithSeverity();
14+
}
15+
16+
@Override
17+
@Severity(SeverityLevel.NORMAL)
18+
public void testWithClassSeverity() throws Exception {
19+
super.testWithClassSeverity();
20+
}
21+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package io.qameta.allure.samples;
2+
3+
import io.qameta.allure.Severity;
4+
import io.qameta.allure.SeverityLevel;
5+
import org.testng.annotations.Test;
6+
7+
/**
8+
* @author charlie (Dmitry Baev).
9+
*/
10+
public class SeverityMethodTest {
11+
12+
@Test
13+
@Severity(SeverityLevel.CRITICAL)
14+
public void testWithSeverity() throws Exception {
15+
}
16+
17+
@Test
18+
public void testWithoutSeverity() throws Exception {
19+
}
20+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package io.qameta.allure.samples;
2+
3+
/**
4+
* @author charlie (Dmitry Baev).
5+
*/
6+
public class SeverityMethodTestInherited extends SeverityMethodTest {
7+
8+
@Override
9+
public void testWithSeverity() throws Exception {
10+
super.testWithSeverity();
11+
}
12+
13+
@Override
14+
public void testWithoutSeverity() throws Exception {
15+
super.testWithoutSeverity();
16+
}
17+
}

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,18 @@ public void retryTest() throws Exception {
408408
.hasSize(2);
409409
}
410410

411+
@Test
412+
public void severityTest() throws Exception {
413+
runTestNgSuites("suites/severity.xml");
414+
List<TestResult> testResults = results.getTestResults();
415+
assertThat(testResults)
416+
.hasSize(8)
417+
.flatExtracting(TestResult::getLabels)
418+
.filteredOn(label -> "severity".equals(label.getName()))
419+
.extracting(Label::getValue)
420+
.containsExactly("critical", "critical", "minor", "blocker", "minor", "blocker");
421+
}
422+
411423
private Predicate<TestResult> hasLinks() {
412424
return testResult -> !testResult.getLinks().isEmpty();
413425
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
3+
4+
<suite name="Severity suite">
5+
<test name="Severity tests">
6+
<classes>
7+
<class name="io.qameta.allure.samples.SeverityMethodTest"/>
8+
<class name="io.qameta.allure.samples.SeverityMethodTestInherited"/>
9+
<class name="io.qameta.allure.samples.SeverityClassTest"/>
10+
<class name="io.qameta.allure.samples.SeverityClassTestInherited"/>
11+
</classes>
12+
</test>
13+
</suite>

0 commit comments

Comments
 (0)