我使用 Thread 进行了尝试,它成功了。
from datetime import datetime
from queue import Queue
from threading import Thread
import time
import pytest
def _pull_and_start_docker_mysql():
print(datetime.now(), "Start downloading docker_mysql")
time.sleep(5) # Simulate download
print(datetime.now(), "Finished downloading docker_mysql")
return "MySQL"
def _pull_and_start_docker_clickhouse():
print(datetime.now(), "Start downloading docker_clickhouse")
time.sleep(8) # Simulate download
print(datetime.now(), "Finished downloading docker_clickhouse")
return "Clickhouse"
@pytest.fixture(scope="session")
def docker():
results = Queue() # Needed to store the results of the threads
p1 = Thread(target=lambda: results.put(("docker_mysql", _pull_and_start_docker_mysql()))) # To identify the result, we put an identifier name "docker_mysql"
p2 = Thread(target=lambda: results.put(("docker_clickhouse", _pull_and_start_docker_clickhouse()))) # To identify the result, we put an identifier name "docker_clickhouse"
p1.start()
p2.start()
p1.join()
p2.join()
return [results.get() for _ in range(results.qsize())]
def test_func(docker):
print("Inside test_func", docker)
assert True
def test_func2(docker):
print("Inside test_func2", docker)
assert True
$ pytest -rP
=========================================================================================== test session starts ===========================================================================================
collected 2 items
test_docker.py .. [100%]
================================================================================================= PASSES ==================================================================================================
________________________________________________________________________________________________ test_func ________________________________________________________________________________________________
------------------------------------------------------------------------------------------ Captured stdout setup ------------------------------------------------------------------------------------------
2021-08-17 01:26:21.113417 Start downloading docker_mysql
2021-08-17 01:26:21.113675 Start downloading docker_clickhouse
2021-08-17 01:26:26.125081 Finished downloading docker_mysql
2021-08-17 01:26:29.122935 Finished downloading docker_clickhouse
------------------------------------------------------------------------------------------ Captured stdout call -------------------------------------------------------------------------------------------
Inside test_func [('docker_mysql', 'MySQL'), ('docker_clickhouse', 'Clickhouse')]
_______________________________________________________________________________________________ test_func2 ________________________________________________________________________________________________
------------------------------------------------------------------------------------------ Captured stdout call -------------------------------------------------------------------------------------------
Inside test_func2 [('docker_mysql', 'MySQL'), ('docker_clickhouse', 'Clickhouse')]
============================================================================================ 2 passed in 8.04s ============================================================================================
一些注意事项:
- 从日志中可以看出,
docker_mysql 和docker_clickhouse 的进程同时开始于 01:26:21,并分别在 5 秒和 8 秒的休眠后结束(模拟不同的执行时间)。
- 我使用了
"session" 范围,如记录的here 那样,它不会为每个测试重新执行夹具,在运行test_func 和test_func2 后在日志中可见。检查这是否也适用于您的场景。
- 目前,夹具响应的格式是 的列表,例如
[('docker_mysql', 'MySQL'), ...]。您可能需要重新格式化它,例如根据您的用例进行口述。