conftest.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import os
  2. import pytest
  3. import subprocess
  4. import logging
  5. import shutil
  6. import datetime
  7. SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
  8. CASES_DIR = os.path.join(SCRIPT_DIR, 'cases')
  9. AGENTHUB_DIR = os.path.join(SCRIPT_DIR, '../../', 'agenthub')
  10. def agents():
  11. agents = []
  12. for agent in os.listdir(AGENTHUB_DIR):
  13. if os.path.isdir(os.path.join(AGENTHUB_DIR, agent)) and agent.endswith('_agent'):
  14. agents.append(agent)
  15. return agents
  16. @pytest.fixture(scope="session")
  17. def test_cases_dir():
  18. return CASES_DIR
  19. @pytest.fixture
  20. def task_file(test_cases_dir, request):
  21. test_case_dir = os.path.dirname(request.module.__file__)
  22. task_file_path = os.path.join(test_case_dir, 'task.txt')
  23. return task_file_path
  24. @pytest.fixture
  25. def workspace_dir(test_cases_dir, request):
  26. test_case_dir = os.path.dirname(request.module.__file__)
  27. workspace_dir = os.path.join(test_case_dir, 'workspace')
  28. return workspace_dir
  29. @pytest.fixture
  30. def model(request):
  31. return request.config.getoption("model", default="gpt-4-0125-preview")
  32. @pytest.fixture
  33. def run_test_case(test_cases_dir, workspace_dir, request):
  34. def _run_test_case(agent, case):
  35. case_dir = os.path.join(test_cases_dir, case)
  36. task = open(os.path.join(case_dir, 'task.txt'), 'r').read().strip()
  37. outputs_dir = os.path.join(case_dir, 'outputs')
  38. agent_dir = os.path.join(outputs_dir, agent)
  39. if not os.path.exists(agent_dir):
  40. os.makedirs(agent_dir)
  41. shutil.rmtree(os.path.join(agent_dir, 'workspace'), ignore_errors=True)
  42. if os.path.isdir(os.path.join(case_dir, 'start')):
  43. os.copytree(os.path.join(case_dir, 'start'), os.path.join(agent_dir, 'workspace'))
  44. else:
  45. os.makedirs(os.path.join(agent_dir, 'workspace'))
  46. agents_ref = {
  47. "langchains_agent":"LangchainsAgent",
  48. "codeact_agent":"CodeActAgent"
  49. }
  50. process = subprocess.Popen(["python3", f"{SCRIPT_DIR}/../../opendevin/main.py", "-d", f"{os.path.join(agent_dir, 'workspace')}", "-c", f"{agents_ref[agent]}", "-t", f"{task}", "-m", "gpt-4-0125-preview"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
  51. stdout, stderr = process.communicate()
  52. logging.info(f"Stdout: {stdout}")
  53. logging.error(f"Stderr: {stderr}")
  54. assert process.returncode == 0
  55. return os.path.join(agent_dir, 'workspace')
  56. return _run_test_case
  57. def pytest_configure(config):
  58. now = datetime.datetime.now()
  59. logging.basicConfig(
  60. level=logging.INFO,
  61. format="%(asctime)s [%(levelname)s] %(message)s",
  62. handlers=[
  63. logging.FileHandler(f"test_results_{now.strftime('%Y%m%d_%H%M%S')}.log"),
  64. logging.StreamHandler()
  65. ]
  66. )