mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-12-19 04:48:12 +00:00
feat(tests): generate UI report with all unique differing screens
[no changelog]
This commit is contained in:
parent
491a8523bc
commit
1fa9a58fa5
@ -270,6 +270,9 @@ class TestResult:
|
|||||||
json.dumps(metadata, indent=2, sort_keys=True) + "\n"
|
json.dumps(metadata, indent=2, sort_keys=True) + "\n"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def succeeded_in_ui_comparison(self) -> bool:
|
||||||
|
return self.actual_hash == self.expected_hash
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def load(cls, testdir: Path) -> Self:
|
def load(cls, testdir: Path) -> Self:
|
||||||
metadata = json.loads((testdir / "metadata.json").read_text())
|
metadata = json.loads((testdir / "metadata.json").read_text())
|
||||||
@ -294,6 +297,13 @@ class TestResult:
|
|||||||
continue
|
continue
|
||||||
yield cls.load(testdir)
|
yield cls.load(testdir)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def recent_ui_failures(cls) -> t.Iterator[Self]:
|
||||||
|
"""Returning just the results that resulted in UI failure."""
|
||||||
|
for result in cls.recent_results():
|
||||||
|
if not result.succeeded_in_ui_comparison():
|
||||||
|
yield result
|
||||||
|
|
||||||
def store_recorded(self) -> None:
|
def store_recorded(self) -> None:
|
||||||
self.expected_hash = self.actual_hash
|
self.expected_hash = self.actual_hash
|
||||||
shutil.rmtree(self.test.recorded_dir, ignore_errors=True)
|
shutil.rmtree(self.test.recorded_dir, ignore_errors=True)
|
||||||
|
@ -7,7 +7,7 @@ from pathlib import Path
|
|||||||
|
|
||||||
import dominate
|
import dominate
|
||||||
import dominate.tags as t
|
import dominate.tags as t
|
||||||
from dominate.tags import a, div, h1, h2, hr, p, span, strong, table, th, tr
|
from dominate.tags import a, div, h1, h2, hr, i, p, span, strong, table, td, th, tr
|
||||||
from dominate.util import text
|
from dominate.util import text
|
||||||
|
|
||||||
from ..common import UI_TESTS_DIR, TestCase, TestResult
|
from ..common import UI_TESTS_DIR, TestCase, TestResult
|
||||||
@ -243,6 +243,43 @@ def screen_text_report() -> None:
|
|||||||
html.write(TESTREPORT_PATH, doc, "screen_text.html")
|
html.write(TESTREPORT_PATH, doc, "screen_text.html")
|
||||||
|
|
||||||
|
|
||||||
|
def differing_screens() -> None:
|
||||||
|
"""Creating an HTML page showing all the unique screens that got changed."""
|
||||||
|
unique_diffs: set[tuple[str | None, str | None]] = set()
|
||||||
|
|
||||||
|
def already_included(left: str | None, right: str | None) -> bool:
|
||||||
|
return (left, right) in unique_diffs
|
||||||
|
|
||||||
|
def include(left: str | None, right: str | None) -> None:
|
||||||
|
unique_diffs.add((left, right))
|
||||||
|
|
||||||
|
# Only going through tests failed in UI comparison,
|
||||||
|
# there are no differing screens in UI-passed tests.
|
||||||
|
recent_ui_failures = list(TestResult.recent_ui_failures())
|
||||||
|
|
||||||
|
model = recent_ui_failures[0].test.model if recent_ui_failures else None
|
||||||
|
doc = document(title="Differing screens", model=model)
|
||||||
|
with doc:
|
||||||
|
with table(border=1, width=600):
|
||||||
|
with tr():
|
||||||
|
th("Expected")
|
||||||
|
th("Actual")
|
||||||
|
th("Testcase (link)")
|
||||||
|
|
||||||
|
for ui_failure in recent_ui_failures:
|
||||||
|
for recorded, actual in ui_failure.diff_lines():
|
||||||
|
if recorded != actual and not already_included(recorded, actual):
|
||||||
|
include(recorded, actual)
|
||||||
|
with tr(bgcolor="red"):
|
||||||
|
html.image_column(recorded, TESTREPORT_PATH)
|
||||||
|
html.image_column(actual, TESTREPORT_PATH)
|
||||||
|
with td():
|
||||||
|
with a(href=f"failed/{ui_failure.test.id}.html"):
|
||||||
|
i(ui_failure.test.id)
|
||||||
|
|
||||||
|
html.write(TESTREPORT_PATH, doc, "differing_screens.html")
|
||||||
|
|
||||||
|
|
||||||
def generate_reports(do_screen_text: bool = False) -> None:
|
def generate_reports(do_screen_text: bool = False) -> None:
|
||||||
"""Generate HTML reports for the test."""
|
"""Generate HTML reports for the test."""
|
||||||
html.set_image_dir(IMAGES_PATH)
|
html.set_image_dir(IMAGES_PATH)
|
||||||
@ -251,6 +288,7 @@ def generate_reports(do_screen_text: bool = False) -> None:
|
|||||||
all_unique_screens()
|
all_unique_screens()
|
||||||
if do_screen_text:
|
if do_screen_text:
|
||||||
screen_text_report()
|
screen_text_report()
|
||||||
|
differing_screens()
|
||||||
|
|
||||||
|
|
||||||
def _copy_deduplicated(test: TestCase) -> None:
|
def _copy_deduplicated(test: TestCase) -> None:
|
||||||
|
Loading…
Reference in New Issue
Block a user