|
1 | | -import contextlib |
2 | | -import io |
3 | 1 | import os |
4 | 2 | import random |
5 | 3 | import re |
@@ -491,18 +489,31 @@ def write_github_summary(self) -> None: |
491 | 489 | self.fail_rerun) |
492 | 490 | if not filename or not exitcode: |
493 | 491 | return |
494 | | - with contextlib.redirect_stdout(io.StringIO()) as summary: |
495 | | - self.display_summary() |
496 | | - lines = ["## Test results", |
497 | | - f"```\n{decolor(summary.getvalue()).strip()}\n```"] |
498 | 492 | # Tests which failed in the last run (the re-run, if any) |
499 | | - for result in self.results.rerun_results: |
500 | | - lines.append(f"### {decolor(str(result))}") |
501 | | - for name, traceback in (result.errors or []) + (result.failures or []): |
502 | | - lines.append(f"<details><summary>{name}</summary>\n\n" |
503 | | - f"```pytb\n{decolor(traceback)}\n```\n</details>") |
| 493 | + failed = self.results.rerun_results |
| 494 | + cases = [(result.errors or []) + (result.failures or []) |
| 495 | + for result in failed] |
| 496 | + ncase = sum(map(len, cases)) |
504 | 497 | with open(filename, "a", encoding="utf-8") as fp: |
505 | | - fp.write("\n\n".join(lines) + "\n") |
| 498 | + def write(text: str) -> None: |
| 499 | + # Separate Markdown blocks with an empty line |
| 500 | + print(text, end="\n\n", file=fp) |
| 501 | + |
| 502 | + write(f"## {decolor(self.get_state())}: " |
| 503 | + f"{count(len(failed), 'test file')} and " |
| 504 | + f"{count(ncase, 'test case')} failed") |
| 505 | + for result, result_cases in zip(failed, cases): |
| 506 | + write(f"### {decolor(str(result))}") |
| 507 | + if result.env_changed_reasons: |
| 508 | + write("\n".join(f"- {reason}" |
| 509 | + for reason in result.env_changed_reasons)) |
| 510 | + for name, traceback in result_cases: |
| 511 | + # Expand short tracebacks when there are only a few |
| 512 | + is_open = ncase <= 5 and traceback.count("\n") < 30 |
| 513 | + write(f"<details{' open' if is_open else ''}>" |
| 514 | + f"<summary>{name}</summary>") |
| 515 | + write(f"```pytb\n{decolor(traceback).rstrip()}\n```") |
| 516 | + write("</details>") |
506 | 517 |
|
507 | 518 | def display_summary(self) -> None: |
508 | 519 | if self.first_runtests is None: |
|
0 commit comments