-
Notifications
You must be signed in to change notification settings - Fork 12
/
index.js
126 lines (104 loc) · 2.75 KB
/
index.js
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
let log
const logs = []
const columns = [
'iteration',
'collectionName',
'requestName',
'method',
'url',
'status',
'code',
'responseTime',
'responseSize',
'executed',
'failed',
'skipped',
'totalAssertions',
'executedCount',
'failedCount',
'skippedCount'
]
const CSV = {
stringify: (str) => {
return `"${str.replace(/"/g, '""')}"`
}
}
/**
* Reporter that outputs basic logs to CSV (default: newman-run-report.csv).
*
* @param {Object} newman - The collection run object, with event hooks for reporting run details.
* @param {Object} options - A set of collection run options.
* @param {String} options.export - The path to which the summary object must be written.
* @param {String} options.includeBody - Whether the response body should be included in each row.
* @returns {*}
*/
module.exports = function newmanCSVReporter (newman, options) {
if (options.includeBody) {
columns.push('body')
}
newman.on('beforeItem', (err, e) => {
if (err) return
log = {}
})
newman.on('beforeRequest', (err, e) => {
if (err || !e.item.name) return
const { cursor, item, request } = e
Object.assign(log, {
collectionName: newman.summary.collection.name,
iteration: cursor.iteration + 1,
requestName: item.name,
method: request.method,
url: request.url.toString(),
totalAssertions: 0,
executedCount: 0,
failedCount: 0,
skippedCount: 0
})
})
newman.on('request', (err, e) => {
if (err || !e.item.name) return
const { status, code, responseTime, responseSize, stream } = e.response
Object.assign(log, { status, code, responseTime, responseSize })
if (options.includeBody) {
Object.assign(log, { body: stream.toString() })
}
})
newman.on('assertion', (err, e) => {
const { assertion } = e
const key = err ? 'failed' : e.skipped ? 'skipped' : 'executed'
log[key] = log[key] || []
log[key].push(assertion)
log.totalAssertions++
log[`${key}Count`]++
})
newman.on('item', (err, e) => {
if (err) return
logs.push(log)
})
newman.on('beforeDone', (err, e) => {
if (err) return
newman.exports.push({
name: 'csv-reporter',
default: 'newman-run-report.csv',
path: options.export,
content: getResults()
})
console.log('CSV write complete!')
})
}
function getResults () {
const results = logs.map((log) => {
const row = []
Object.keys(log).forEach((key) => {
const val = log[key]
const index = columns.indexOf(key)
const rowValue = Array.isArray(val)
? val.join(', ')
: String(val)
row[index] = CSV.stringify(rowValue)
})
return row.join(',')
})
results.unshift(columns.join(','))
return results.join('\n')
}