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)