test_langsmith_evaluation.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. """LangSmith 离线评估隔离测试。"""
  2. import io
  3. from pathlib import Path
  4. from tempfile import TemporaryDirectory
  5. import unittest
  6. from contextlib import redirect_stdout
  7. from unittest.mock import patch
  8. from vendor_guard.langsmith_evaluation import (
  9. _evaluate_without_sdk_console,
  10. _isolated_evaluation_workspace,
  11. )
  12. class EvaluationWorkspaceTests(unittest.TestCase):
  13. def setUp(self) -> None:
  14. self.temp_dir = TemporaryDirectory()
  15. self.addCleanup(self.temp_dir.cleanup)
  16. self.source_root = Path(self.temp_dir.name)
  17. for directory in ("data-room", "policies", "skills", "fixtures"):
  18. path = self.source_root / directory
  19. path.mkdir()
  20. (path / "source.txt").write_text(directory, encoding="utf-8")
  21. old_report = (
  22. self.source_root
  23. / "reports"
  24. / "ACME"
  25. / "onboarding-report.md"
  26. )
  27. old_report.parent.mkdir(parents=True)
  28. old_report.write_text("旧的交互报告", encoding="utf-8")
  29. def test_workspace_copies_inputs_but_not_existing_reports(self) -> None:
  30. with _isolated_evaluation_workspace(self.source_root) as workspace:
  31. self.assertEqual(
  32. (workspace / "data-room" / "source.txt").read_text(
  33. encoding="utf-8"
  34. ),
  35. "data-room",
  36. )
  37. self.assertTrue((workspace / "policies" / "source.txt").is_file())
  38. self.assertTrue((workspace / "skills" / "source.txt").is_file())
  39. self.assertTrue((workspace / "fixtures" / "source.txt").is_file())
  40. self.assertTrue((workspace / "reports").is_dir())
  41. self.assertFalse(
  42. (workspace / "reports" / "ACME" / "onboarding-report.md").exists()
  43. )
  44. def test_workspace_changes_do_not_touch_real_project(self) -> None:
  45. with _isolated_evaluation_workspace(self.source_root) as workspace:
  46. sandbox_policy = workspace / "policies" / "source.txt"
  47. sandbox_policy.write_text("被测试用例修改", encoding="utf-8")
  48. sandbox_report = (
  49. workspace / "reports" / "ACME" / "onboarding-report.md"
  50. )
  51. sandbox_report.parent.mkdir(parents=True)
  52. sandbox_report.write_text("新评估报告", encoding="utf-8")
  53. self.assertEqual(
  54. (self.source_root / "policies" / "source.txt").read_text(
  55. encoding="utf-8"
  56. ),
  57. "policies",
  58. )
  59. self.assertEqual(
  60. (
  61. self.source_root
  62. / "reports"
  63. / "ACME"
  64. / "onboarding-report.md"
  65. ).read_text(encoding="utf-8"),
  66. "旧的交互报告",
  67. )
  68. @patch("vendor_guard.langsmith_evaluation.evaluate")
  69. def test_sdk_english_output_and_progress_are_hidden(self, evaluate) -> None:
  70. expected_result = object()
  71. def noisy_evaluate(_target, **_kwargs):
  72. print("View the evaluation results for experiment")
  73. return expected_result
  74. evaluate.side_effect = noisy_evaluate
  75. visible_stdout = io.StringIO()
  76. with redirect_stdout(visible_stdout):
  77. result = _evaluate_without_sdk_console(object(), data="dataset")
  78. self.assertIs(result, expected_result)
  79. self.assertEqual(visible_stdout.getvalue(), "")
  80. if __name__ == "__main__":
  81. unittest.main()