mirror of
https://github.com/dorny/test-reporter.git
synced 2025-12-15 22:07:09 +01:00
Merge pull request #45 from dorny/logs-and-error-handling
Improve logging and error handling
This commit is contained in:
commit
8fdf2aead9
10 changed files with 3414 additions and 6130 deletions
1118
dist/index.js
generated
vendored
1118
dist/index.js
generated
vendored
File diff suppressed because it is too large
Load diff
2
dist/index.js.map
generated
vendored
2
dist/index.js.map
generated
vendored
File diff suppressed because one or more lines are too long
3911
dist/sourcemap-register.js
generated
vendored
3911
dist/sourcemap-register.js
generated
vendored
File diff suppressed because one or more lines are too long
4446
package-lock.json
generated
4446
package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
|
@ -47,12 +47,12 @@
|
|||
"eslint": "^7.17.0",
|
||||
"eslint-plugin-github": "^4.1.1",
|
||||
"eslint-plugin-jest": "^24.1.3",
|
||||
"jest": "^24.9.0",
|
||||
"jest": "^26.6.3",
|
||||
"jest-circus": "^26.6.3",
|
||||
"jest-junit": "^12.0.0",
|
||||
"js-yaml": "^4.0.0",
|
||||
"prettier": "2.2.1",
|
||||
"ts-jest": "^24.3.0",
|
||||
"ts-jest": "^26.4.4",
|
||||
"typescript": "^4.1.2"
|
||||
},
|
||||
"jest-junit": {
|
||||
|
|
|
|||
|
|
@ -50,13 +50,15 @@ async function main(): Promise<void> {
|
|||
const files = await getFiles(path)
|
||||
|
||||
if (files.length === 0) {
|
||||
core.setFailed(`No file matches path ${path}`)
|
||||
core.setFailed(`No file matches path '${path}'`)
|
||||
return
|
||||
}
|
||||
|
||||
core.info(`Using test report parser '${reporter}'`)
|
||||
const result = await parser(files, opts)
|
||||
const conclusion = result.success ? 'success' : 'failure'
|
||||
|
||||
core.info(`Creating check run '${name}' with conclusion '${conclusion}'`)
|
||||
await octokit.checks.create({
|
||||
head_sha: sha,
|
||||
name,
|
||||
|
|
@ -68,7 +70,7 @@ async function main(): Promise<void> {
|
|||
|
||||
core.setOutput('conclusion', conclusion)
|
||||
if (failOnError && !result.success) {
|
||||
core.setFailed(`Failed test has been found and 'fail-on-error' option is set to ${failOnError}.`)
|
||||
core.setFailed(`Failed test has been found and 'fail-on-error' option is set to ${failOnError}`)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -83,7 +85,7 @@ function getParser(reporter: string): ParseTestResult {
|
|||
case 'jest-junit':
|
||||
return parseJestJunit
|
||||
default:
|
||||
throw new Error(`Input parameter 'reporter' is set to invalid value '${reporter}'`)
|
||||
throw new Error(`Input variable 'reporter' is set to invalid value '${reporter}'`)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -91,6 +93,7 @@ export async function getFiles(pattern: string): Promise<FileContent[]> {
|
|||
const paths = await glob(pattern, {dot: true})
|
||||
return Promise.all(
|
||||
paths.map(async path => {
|
||||
core.info(`Reading test report '${path}'`)
|
||||
const content = await fs.promises.readFile(path, {encoding: 'utf8'})
|
||||
return {path, content}
|
||||
})
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
import * as core from '@actions/core'
|
||||
import {Annotation, FileContent, ParseOptions, TestResult} from '../parser-types'
|
||||
|
||||
import getReport from '../../report/get-report'
|
||||
|
|
@ -85,8 +86,21 @@ export async function parseDartJson(files: FileContent[], options: ParseOptions)
|
|||
}
|
||||
|
||||
function getTestRun(path: string, content: string): TestRun {
|
||||
const lines = content.split(/\n\r?/g).filter(line => line !== '')
|
||||
const events = lines.map(str => JSON.parse(str)) as ReportEvent[]
|
||||
core.info(`Parsing content of '${path}'`)
|
||||
const lines = content.split(/\n\r?/g)
|
||||
const events = lines
|
||||
.map((str, i) => {
|
||||
if (str.trim() === '') {
|
||||
return null
|
||||
}
|
||||
try {
|
||||
return JSON.parse(str)
|
||||
} catch (e) {
|
||||
const col = e.columnNumber !== undefined ? `:${e.columnNumber}` : ''
|
||||
new Error(`Invalid JSON at ${path}:${i + 1}${col}\n\n${e}`)
|
||||
}
|
||||
})
|
||||
.filter(evt => evt != null) as ReportEvent[]
|
||||
|
||||
let success = false
|
||||
let totalTime = 0
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
import * as core from '@actions/core'
|
||||
import {ErrorInfo, Outcome, TestMethod, TrxReport} from './dotnet-trx-types'
|
||||
|
||||
import {Annotation, FileContent, ParseOptions, TestResult} from '../parser-types'
|
||||
|
|
@ -29,7 +30,7 @@ class Test {
|
|||
readonly error?: ErrorInfo
|
||||
) {}
|
||||
|
||||
get result(): TestExecutionResult {
|
||||
get result(): TestExecutionResult | undefined {
|
||||
switch (this.outcome) {
|
||||
case 'Passed':
|
||||
return 'success'
|
||||
|
|
@ -46,7 +47,7 @@ export async function parseDotnetTrx(files: FileContent[], options: ParseOptions
|
|||
const testClasses: TestClass[] = []
|
||||
|
||||
for (const file of files) {
|
||||
const trx = await getTrxReport(file.content)
|
||||
const trx = await getTrxReport(file)
|
||||
const tc = getTestClasses(trx)
|
||||
const tr = getTestRunResult(file.path, trx, tc)
|
||||
testRuns.push(tr)
|
||||
|
|
@ -66,10 +67,15 @@ export async function parseDotnetTrx(files: FileContent[], options: ParseOptions
|
|||
}
|
||||
}
|
||||
|
||||
async function getTrxReport(content: string): Promise<TrxReport> {
|
||||
return (await parseStringPromise(content, {
|
||||
attrValueProcessors: [parseAttribute]
|
||||
})) as TrxReport
|
||||
async function getTrxReport(file: FileContent): Promise<TrxReport> {
|
||||
core.info(`Parsing content of '${file.path}'`)
|
||||
try {
|
||||
return (await parseStringPromise(file.content, {
|
||||
attrValueProcessors: [parseAttribute]
|
||||
})) as TrxReport
|
||||
} catch (e) {
|
||||
throw new Error(`Invalid XML at ${file.path}\n\n${e}`)
|
||||
}
|
||||
}
|
||||
|
||||
function getTestRunResult(path: string, trx: TrxReport, testClasses: TestClass[]): TestRunResult {
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
import * as core from '@actions/core'
|
||||
import {Annotation, FileContent, ParseOptions, TestResult} from '../parser-types'
|
||||
import {parseStringPromise} from 'xml2js'
|
||||
|
||||
|
|
@ -20,7 +21,7 @@ export async function parseJestJunit(files: FileContent[], options: ParseOptions
|
|||
const testRuns: TestRunResult[] = []
|
||||
|
||||
for (const file of files) {
|
||||
const ju = await getJunitReport(file.content)
|
||||
const ju = await getJunitReport(file)
|
||||
const tr = getTestRunResult(file.path, ju)
|
||||
junit.push(ju)
|
||||
testRuns.push(tr)
|
||||
|
|
@ -39,10 +40,15 @@ export async function parseJestJunit(files: FileContent[], options: ParseOptions
|
|||
}
|
||||
}
|
||||
|
||||
async function getJunitReport(content: string): Promise<JunitReport> {
|
||||
return (await parseStringPromise(content, {
|
||||
attrValueProcessors: [parseAttribute]
|
||||
})) as JunitReport
|
||||
async function getJunitReport(file: FileContent): Promise<JunitReport> {
|
||||
core.info(`Parsing content of '${file.path}'`)
|
||||
try {
|
||||
return (await parseStringPromise(file.content, {
|
||||
attrValueProcessors: [parseAttribute]
|
||||
})) as JunitReport
|
||||
} catch (e) {
|
||||
throw new Error(`Invalid XML at ${file.path}\n\n${e}`)
|
||||
}
|
||||
}
|
||||
|
||||
function getTestRunResult(path: string, junit: JunitReport): TestRunResult {
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
import * as core from '@actions/core'
|
||||
import {TestExecutionResult, TestRunResult, TestSuiteResult} from './test-results'
|
||||
import {Align, Icon, link, table} from '../utils/markdown-utils'
|
||||
import {slug} from '../utils/slugger'
|
||||
|
|
@ -14,6 +15,7 @@ export default function getReport(results: TestRunResult[]): string {
|
|||
}
|
||||
|
||||
function getRunSummary(tr: TestRunResult): string {
|
||||
core.info('Generating check run summary')
|
||||
const time = `${(tr.time / 1000).toFixed(3)}s`
|
||||
const headingLine1 = `### ${tr.path}`
|
||||
const headingLine2 = `**${tr.tests}** tests were completed in **${time}** with **${tr.passed}** passed, **${tr.skipped}** skipped and **${tr.failed}** failed.`
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue