|
|
|
@@ -113,7 +113,7 @@ def find_slow_tests_by_scan(repo_path: str) -> List[Bottleneck]:
|
|
|
|
(r"time\.sleep\((\d+(?:\.\d+)?)\)", "Contains time.sleep() — consider using mock or async wait"),
|
|
|
|
(r"time\.sleep\((\d+(?:\.\d+)?)\)", "Contains time.sleep() — consider using mock or async wait"),
|
|
|
|
(r"subprocess\.run\(.*timeout=(\d+)", "Subprocess with timeout — may block test"),
|
|
|
|
(r"subprocess\.run\(.*timeout=(\d+)", "Subprocess with timeout — may block test"),
|
|
|
|
(r"requests\.(get|post|put|delete)\(", "Real HTTP call — mock with responses or httpretty"),
|
|
|
|
(r"requests\.(get|post|put|delete)\(", "Real HTTP call — mock with responses or httpretty"),
|
|
|
|
(r"open\([^)]*['\"]w['\"]\)", "File I/O in test — use tmp_path fixture"),
|
|
|
|
(r"open\([^)]*['"]w['"]", "File I/O in test — use tmp_path fixture"),
|
|
|
|
]
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
for root, dirs, files in os.walk(repo_path):
|
|
|
|
for root, dirs, files in os.walk(repo_path):
|
|
|
|
@@ -506,13 +506,13 @@ def format_markdown(report: PerfReport) -> str:
|
|
|
|
lines.append(f"- {icon} {b.name}{loc} — ~{b.duration_s:.1f}s — {b.recommendation}")
|
|
|
|
lines.append(f"- {icon} {b.name}{loc} — ~{b.duration_s:.1f}s — {b.recommendation}")
|
|
|
|
lines.append(f"")
|
|
|
|
lines.append(f"")
|
|
|
|
|
|
|
|
|
|
|
|
return "\n".join(lines)
|
|
|
|
return "
|
|
|
|
|
|
|
|
".join(lines)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# ── Main ───────────────────────────────────────────────────────────
|
|
|
|
# ── Main ───────────────────────────────────────────────────────────
|
|
|
|
|
|
|
|
|
|
|
|
def main():
|
|
|
|
def main():
|
|
|
|
global SLOW_TEST_THRESHOLD_S
|
|
|
|
|
|
|
|
parser = argparse.ArgumentParser(description="Performance Bottleneck Finder")
|
|
|
|
parser = argparse.ArgumentParser(description="Performance Bottleneck Finder")
|
|
|
|
parser.add_argument("--repo", default=".", help="Path to repository to analyze")
|
|
|
|
parser.add_argument("--repo", default=".", help="Path to repository to analyze")
|
|
|
|
parser.add_argument("--json", action="store_true", help="Output as JSON")
|
|
|
|
parser.add_argument("--json", action="store_true", help="Output as JSON")
|
|
|
|
@@ -521,6 +521,7 @@ def main():
|
|
|
|
help="Slow test threshold in seconds")
|
|
|
|
help="Slow test threshold in seconds")
|
|
|
|
args = parser.parse_args()
|
|
|
|
args = parser.parse_args()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
global SLOW_TEST_THRESHOLD_S
|
|
|
|
SLOW_TEST_THRESHOLD_S = args.threshold
|
|
|
|
SLOW_TEST_THRESHOLD_S = args.threshold
|
|
|
|
|
|
|
|
|
|
|
|
if not os.path.isdir(args.repo):
|
|
|
|
if not os.path.isdir(args.repo):
|
|
|
|
|