run_tests.ps1 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. param(
  2. [ValidateSet("smoke", "full")]
  3. [string]$Mode = "smoke",
  4. [string]$ProjectRoot = ""
  5. )
  6. $ErrorActionPreference = "Stop"
  7. if ([string]::IsNullOrWhiteSpace($ProjectRoot)) {
  8. $ProjectRoot = (Resolve-Path (Join-Path $PSScriptRoot "..\\..")).Path
  9. } else {
  10. $ProjectRoot = (Resolve-Path $ProjectRoot).Path
  11. }
  12. Set-Location $ProjectRoot
  13. $tmpRoot = Join-Path $ProjectRoot ".tmp\\pytest"
  14. New-Item -ItemType Directory -Path $tmpRoot -Force | Out-Null
  15. $env:TMP = $tmpRoot
  16. $env:TEMP = $tmpRoot
  17. $env:PYTHONPATH = ".claude/scripts"
  18. # 避免 Windows 下 basetemp 目录因权限/残留锁导致 rm_rf 失败(会让所有用例在 setup 阶段直接报错)。
  19. $runId = Get-Date -Format "yyyyMMdd_HHmmssfff"
  20. $baseTemp = Join-Path $tmpRoot ("run-" + $Mode + "-" + $runId)
  21. Write-Host "ProjectRoot: $ProjectRoot"
  22. Write-Host "TMP/TEMP: $tmpRoot"
  23. Write-Host "Mode: $Mode"
  24. # 预检:某些 Windows Python 发行版(尤其 WindowsApps shim)在 tempfile.mkdtemp 时会创建“不可访问目录”,
  25. # 会导致 pytest 在创建/清理临时目录阶段直接 WinError 5。
  26. @'
  27. import tempfile
  28. from pathlib import Path
  29. import sys
  30. try:
  31. d = Path(tempfile.mkdtemp(prefix="webnovel_writer_pytest_"))
  32. # 既要能列目录,也要能写文件;否则 pytest 必挂。
  33. list(d.iterdir())
  34. (d / "probe.txt").write_text("ok", encoding="utf-8")
  35. except Exception as exc:
  36. print(f"PYTEST_TMPDIR_PRECHECK_FAILED: {type(exc).__name__}: {exc}", file=sys.stderr)
  37. raise
  38. '@ | python - 2>$null
  39. if ($LASTEXITCODE -ne 0) {
  40. Write-Host ""
  41. Write-Host "❌ Python 临时目录预检失败(常见原因:WindowsApps 的 python.exe shim / 权限异常)"
  42. Write-Host "建议:改用标准 Python(python.org 安装版)或用 uv/uvx 提供的 Python 运行测试。"
  43. exit 1
  44. }
  45. if ($Mode -eq "smoke") {
  46. python -m pytest -q `
  47. .claude/scripts/data_modules/tests/test_extract_chapter_context.py `
  48. .claude/scripts/data_modules/tests/test_rag_adapter.py `
  49. --basetemp $baseTemp `
  50. --no-cov `
  51. -p no:cacheprovider
  52. exit $LASTEXITCODE
  53. }
  54. python -m pytest -q `
  55. .claude/scripts/data_modules/tests `
  56. --basetemp $baseTemp `
  57. -p no:cacheprovider
  58. exit $LASTEXITCODE