diff --git a/src/pytest_html/nextgen.py b/src/pytest_html/nextgen.py index 49feb366..6b8368c4 100644 --- a/src/pytest_html/nextgen.py +++ b/src/pytest_html/nextgen.py @@ -61,8 +61,19 @@ def __init__(self, title, duration_format): def data(self): return self._data - def add_test(self, test): - self._data["tests"].append(test) + def add_test(self, test, when, outcome, nodeid): + pattern = re.escape(nodeid) + r"(::(setup|teardown))?$" + if when == "call" or (when == "setup" and outcome == "failed"): + self._data["tests"].append(test) + return True + elif when == "teardown" and outcome == "failed": + tests = self._data["tests"] + tests[:] = [ + test if re.match(pattern, test["testId"]) else test + for test in tests + ] + return True + return False def set_data(self, key, value): self._data[key] = value @@ -244,7 +255,6 @@ def pytest_collection_finish(self, session): def pytest_runtest_logreport(self, report): data = { "duration": report.duration, - "when": report.when, } test_id = report.nodeid @@ -267,8 +277,11 @@ def pytest_runtest_logreport(self, report): data["tableHtml"] = table_html data["extras"] = self._process_extras(report, test_id) - self._report.add_test(data) - self._generate_report() + was_added = self._report.add_test( + data, report.when, report.outcome, report.nodeid + ) + if was_added: + self._generate_report() class NextGenReport(BaseReport): diff --git a/src/pytest_html/scripts/main.js b/src/pytest_html/scripts/main.js index aa72e945..aa3a6029 100644 --- a/src/pytest_html/scripts/main.js +++ b/src/pytest_html/scripts/main.js @@ -29,8 +29,7 @@ const renderStatic = () => { } const renderContent = (tests) => { - const renderSet = tests.filter(({ when, result }) => when === 'call' || result === 'Error' ) - const rows = renderSet.map(dom.getResultTBody) + const rows = tests.map(dom.getResultTBody) const table = document.querySelector('#results-table') removeChildren(table) const tableHeader = dom.getListHeader(manager.renderData) @@ -62,8 +61,6 @@ const renderContent = (tests) => { } const renderDerived = (tests, collectedItems, isFinished) => { - const renderSet = tests.filter(({ when, result }) => when === 'call' || result === 'Error') - const possibleResults = [ { result: 'passed', label: 'Passed' }, { result: 'skipped', label: 'Skipped' }, @@ -76,7 +73,7 @@ const renderDerived = (tests, collectedItems, isFinished) => { const currentFilter = getVisible() possibleResults.forEach(({ result, label }) => { - const count = renderSet.filter((test) => test.result.toLowerCase() === result).length + const count = tests.filter((test) => test.result.toLowerCase() === result).length const input = document.querySelector(`input[data-test-result="${result}"]`) document.querySelector(`.${result}`).innerText = `${count} ${label}` @@ -84,8 +81,8 @@ const renderDerived = (tests, collectedItems, isFinished) => { input.checked = currentFilter.includes(result) }) - const numberOfTests = renderSet.filter(({ result }) => - ['Passed', 'Failed', 'XPassed', 'XFailed'].includes(result)).length + const numberOfTests = tests.filter(({ result }) => + ['Passed', 'Failed', 'XPassed', 'XFailed'].includes(result)).length if (isFinished) { const accTime = tests.reduce((prev, { duration }) => prev + duration, 0)