mirror of
https://github.com/microsoft/autogen.git
synced 2025-11-04 11:49:45 +00:00
test_docker_commandline_code_executor.py : 161.66s -> 108.07 (#6429)
## Why are these changes needed? Current autogen-ext's test is too slow. So, I will search slow test case and makes more fast. [init docker executor function to module 180s->140s](a3cf70bcf8) [reuse executor at some tests 140s->120s](ca15938afa) [Remove unnecessary start of docker 120s->110s](61247611e0) ## Related issue number <!-- For example: "Closes #1234" --> Part of #6376 ## Checks - [ ] I've included any doc changes needed for <https://microsoft.github.io/autogen/>. See <https://github.com/microsoft/autogen/blob/main/CONTRIBUTING.md> to build and test documentation locally. - [ ] I've added tests (if relevant) corresponding to the changes introduced in this PR. - [x] I've made sure all auto checks have passed. --------- Co-authored-by: Eric Zhu <ekzhu@users.noreply.github.com>
This commit is contained in:
parent
bfdf816f21
commit
b0c13a476b
@ -2,6 +2,7 @@
|
||||
import asyncio
|
||||
import os
|
||||
import sys
|
||||
import shutil
|
||||
import tempfile
|
||||
from pathlib import Path
|
||||
from typing import AsyncGenerator, TypeAlias
|
||||
@ -32,7 +33,7 @@ def docker_tests_enabled() -> bool:
|
||||
return False
|
||||
|
||||
|
||||
@pytest_asyncio.fixture(scope="function") # type: ignore
|
||||
@pytest_asyncio.fixture(scope="module") # type: ignore
|
||||
async def executor_and_temp_dir(
|
||||
request: pytest.FixtureRequest,
|
||||
) -> AsyncGenerator[tuple[DockerCommandLineCodeExecutor, str], None]:
|
||||
@ -47,9 +48,20 @@ async def executor_and_temp_dir(
|
||||
ExecutorFixture: TypeAlias = tuple[DockerCommandLineCodeExecutor, str]
|
||||
|
||||
|
||||
@pytest_asyncio.fixture(scope="function") # type: ignore
|
||||
async def cleanup_temp_dir(executor_and_temp_dir: ExecutorFixture) -> AsyncGenerator[None, None]:
|
||||
_executor, temp_dir = executor_and_temp_dir
|
||||
for file in Path(temp_dir).iterdir():
|
||||
if file.is_file():
|
||||
file.unlink()
|
||||
elif file.is_dir():
|
||||
shutil.rmtree(file)
|
||||
yield None
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
@pytest.mark.parametrize("executor_and_temp_dir", ["docker"], indirect=True)
|
||||
async def test_execute_code(executor_and_temp_dir: ExecutorFixture) -> None:
|
||||
async def test_execute_code(executor_and_temp_dir: ExecutorFixture, cleanup_temp_dir: None) -> None:
|
||||
executor, _temp_dir = executor_and_temp_dir
|
||||
cancellation_token = CancellationToken()
|
||||
|
||||
@ -97,7 +109,9 @@ async def test_execute_code(executor_and_temp_dir: ExecutorFixture) -> None:
|
||||
|
||||
@pytest.mark.asyncio
|
||||
@pytest.mark.parametrize("executor_and_temp_dir", ["docker"], indirect=True)
|
||||
async def test_commandline_code_executor_timeout(executor_and_temp_dir: ExecutorFixture) -> None:
|
||||
async def test_commandline_code_executor_timeout(
|
||||
executor_and_temp_dir: ExecutorFixture, cleanup_temp_dir: None
|
||||
) -> None:
|
||||
_executor, temp_dir = executor_and_temp_dir
|
||||
cancellation_token = CancellationToken()
|
||||
code_blocks = [CodeBlock(code="import time; time.sleep(10); print('hello world!')", language="python")]
|
||||
@ -110,7 +124,9 @@ async def test_commandline_code_executor_timeout(executor_and_temp_dir: Executor
|
||||
|
||||
@pytest.mark.asyncio
|
||||
@pytest.mark.parametrize("executor_and_temp_dir", ["docker"], indirect=True)
|
||||
async def test_commandline_code_executor_cancellation(executor_and_temp_dir: ExecutorFixture) -> None:
|
||||
async def test_commandline_code_executor_cancellation(
|
||||
executor_and_temp_dir: ExecutorFixture, cleanup_temp_dir: None
|
||||
) -> None:
|
||||
_executor, temp_dir = executor_and_temp_dir
|
||||
cancellation_token = CancellationToken()
|
||||
# Write code that sleep for 10 seconds and then write "hello world!"
|
||||
@ -137,7 +153,7 @@ with open("hello.txt", "w") as f:
|
||||
|
||||
@pytest.mark.asyncio
|
||||
@pytest.mark.parametrize("executor_and_temp_dir", ["docker"], indirect=True)
|
||||
async def test_invalid_relative_path(executor_and_temp_dir: ExecutorFixture) -> None:
|
||||
async def test_invalid_relative_path(executor_and_temp_dir: ExecutorFixture, cleanup_temp_dir: None) -> None:
|
||||
executor, _temp_dir = executor_and_temp_dir
|
||||
cancellation_token = CancellationToken()
|
||||
code = """# filename: /tmp/test.py
|
||||
@ -152,7 +168,7 @@ print("hello world")
|
||||
|
||||
@pytest.mark.asyncio
|
||||
@pytest.mark.parametrize("executor_and_temp_dir", ["docker"], indirect=True)
|
||||
async def test_valid_relative_path(executor_and_temp_dir: ExecutorFixture) -> None:
|
||||
async def test_valid_relative_path(executor_and_temp_dir: ExecutorFixture, cleanup_temp_dir: None) -> None:
|
||||
executor, temp_dir_str = executor_and_temp_dir
|
||||
|
||||
cancellation_token = CancellationToken()
|
||||
@ -243,18 +259,13 @@ async def test_docker_commandline_code_executor_extra_args() -> None:
|
||||
async def test_docker_commandline_code_executor_serialization() -> None:
|
||||
with tempfile.TemporaryDirectory() as temp_dir:
|
||||
executor = DockerCommandLineCodeExecutor(work_dir=temp_dir)
|
||||
await executor.start()
|
||||
|
||||
executor_config = executor.dump_component()
|
||||
loaded_executor = DockerCommandLineCodeExecutor.load_component(executor_config)
|
||||
await loaded_executor.start()
|
||||
|
||||
assert executor.bind_dir == loaded_executor.bind_dir
|
||||
assert executor.timeout == loaded_executor.timeout
|
||||
|
||||
await executor.stop()
|
||||
await loaded_executor.stop()
|
||||
|
||||
|
||||
def test_invalid_timeout() -> None:
|
||||
with pytest.raises(ValueError, match="Timeout must be greater than or equal to 1."):
|
||||
@ -269,12 +280,12 @@ async def test_directory_not_initialized() -> None:
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_error_wrong_path() -> None:
|
||||
@pytest.mark.parametrize("executor_and_temp_dir", ["docker"], indirect=True)
|
||||
async def test_error_wrong_path(executor_and_temp_dir: ExecutorFixture, cleanup_temp_dir: None) -> None:
|
||||
if not docker_tests_enabled():
|
||||
pytest.skip("Docker tests are disabled")
|
||||
|
||||
with tempfile.TemporaryDirectory() as temp_dir:
|
||||
async with DockerCommandLineCodeExecutor(work_dir=temp_dir) as executor:
|
||||
executor, _ = executor_and_temp_dir
|
||||
cancellation_token = CancellationToken()
|
||||
code_blocks = [
|
||||
CodeBlock(
|
||||
@ -364,7 +375,10 @@ async def test_delete_tmp_files() -> None:
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_docker_commandline_code_executor_with_multiple_tasks() -> None:
|
||||
@pytest.mark.parametrize("executor_and_temp_dir", ["docker"], indirect=True)
|
||||
async def test_docker_commandline_code_executor_with_multiple_tasks(
|
||||
executor_and_temp_dir: ExecutorFixture, cleanup_temp_dir: None
|
||||
) -> None:
|
||||
if not docker_tests_enabled():
|
||||
pytest.skip("Docker tests are disabled")
|
||||
|
||||
@ -382,6 +396,5 @@ async def test_docker_commandline_code_executor_with_multiple_tasks() -> None:
|
||||
def run_scenario_in_new_loop(executor_instance: DockerCommandLineCodeExecutor) -> None:
|
||||
asyncio.run(run_cancellation_scenario(executor_instance))
|
||||
|
||||
with tempfile.TemporaryDirectory() as temp_dir:
|
||||
async with DockerCommandLineCodeExecutor(work_dir=temp_dir) as executor:
|
||||
executor, _ = executor_and_temp_dir
|
||||
await asyncio.get_running_loop().run_in_executor(None, run_scenario_in_new_loop, executor)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user