-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcoverage.gradle
111 lines (93 loc) · 3.75 KB
/
coverage.gradle
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import static groovy.json.JsonOutput.*
apply plugin: 'jacoco'
ext {
limits = [
'instruction': 90,
'branch' : 80,
'line' : 90,
'complexity' : 90,
'method' : 98,
'class' : 100
]
}
jacocoTestReport {
reports {
//XML required by coveralls and for the below coverage checks
xml.enabled true
}
doLast {
def report = file("${jacoco.reportsDir}/test/jacocoTestReport.xml")
logger.lifecycle("Checking coverage results: ${report}")
def parser = new XmlParser()
parser.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
parser.setFeature("http://apache.org/xml/features/disallow-doctype-decl", false)
def results = parser.parse(report)
def percentage = {
def covered = it.'@covered' as Double
def missed = it.'@missed' as Double
((covered / (covered + missed)) * 100).round(2)
}
def counters = results.counter
def metrics = [:]
metrics << [
'instruction': percentage(counters.find { it.'@type'.equals('INSTRUCTION') }),
'branch' : percentage(counters.find { it.'@type'.equals('BRANCH') }),
'line' : percentage(counters.find { it.'@type'.equals('LINE') }),
'complexity' : percentage(counters.find { it.'@type'.equals('COMPLEXITY') }),
'method' : percentage(counters.find { it.'@type'.equals('METHOD') }),
'class' : percentage(counters.find { it.'@type'.equals('CLASS') })
]
def failures = []
metrics.each {
def limit = limits[it.key]
if (it.value < limit) {
failures.add("- ${it.key} coverage rate is: ${it.value}%, minimum is ${limit}%")
}
}
codacyTestReport(results)
if (failures) {
logger.quiet("------------------ Code Coverage Failed -----------------------")
failures.each {
logger.quiet(it)
}
logger.quiet("---------------------------------------------------------------")
throw new GradleException("Code coverage failed")
} else{
logger.quiet("Passed Code Coverage Checks")
metrics.each {
def limit = limits[it.key]
logger.quiet("- ${it.key} coverage rate is: ${it.value}%, minimum is ${limit}%")
}
}
}
}
def codacyPercentage(Node node) {
def covered = node.'@covered' as Double
def missed = node.'@missed' as Double
(((covered / (covered + missed)) * 100).round(2)) as Integer
}
def codacyTestReport(Node report) {
def codacy = [
language: 'Java',
total: codacyPercentage(report.counter.find { it.'@type'.equals('LINE') }),
fileReports: codacyFileReports(report.package)]
file("${jacoco.reportsDir}/test/codacy-coverage-report.json").write(prettyPrint(toJson(codacy)))
logger.quiet("------------------ Generated Codacy Coverage Report -------------------")
}
def codacyFileReports(List<Node> packages) {
packages.collectMany { packageNode ->
String packageName = packageNode.'@name'
packageNode.sourcefile.collect { sourceNode ->
[
filename: packageName + '/' + sourceNode.'@name',
total: codacyPercentage(sourceNode.counter.find { it.'@type'.equals('LINE') }),
coverage: codacyLineReports(sourceNode.line)]
}
}
}
def codacyLineReports(List<Node> lines) {
lines
.findAll { (it.'@ci' as Integer) > 0 }
.collectEntries { [(it.'@nr'): 1] }
}
check.dependsOn jacocoTestReport