При Python модульном тестировании я бы использовал классические методы setUp и tearDown. Я предпочитаю использовать pytest, чтобы использовать параметризацию теста с данными, которые я получаю из контейнера.
Для настройки контейнера я мог бы использовать функцию fixture. Но как сказать ему уничтожить контейнер после завершения выполнения теста?
Следующий код работает не так, как ожидалось:
- Кажется, Pytest воссоздает фикстуру для каждой параметризации теста.
- Кажется, настоящего контейнера не создается.
Еще несколько слов о том, чего я пытаюсь достичь:
- Необходимо протестировать анализатор ингредиентов, тесты отражены в переменной
local_data
- Анализатор ингредиентов завернут в контейнер Docker (приспособление)
import pprint
import json
import requests
import pytest
import time
local_testdata = [
("1/2 of an apple", {"product": "apple", "unit": "item", "quantity": "1/2"}),
("12 oz frozen spinach", {"product": "spinach", "unit": "oz", "quantity": "12"}),
("24 oz frozen strawberries", {"product": "strawberries", "unit": "oz", "quantity": "24"})
]
def parse_ingredient(ingredient_string):
ingreedy_path = "http://localhost:5000/query"
for tupl in ingredient_string:
payload = {"query": ingredient_string}
result = requests.post(ingreedy_path, data=json.dumps(payload))
obj = json.loads(result.text)
@pytest.fixture
def ingreedy_service():
import docker
client = docker.from_env()
ingreedy = client.containers.create("openfoodbroker/ingreedy.service", name="ingreedy_service", detach=True)
print("launch Docker container with Ingreedy service")
time.sleep(2)
pprint.pprint(client.containers.list())
yield "ingreedy"
print("destroy Docker container")
ingreedy.remove()
@pytest.mark.parametrize("ingredient_string, expected_result", local_testdata)
def test_ingredient_parser_localdata(ingredient_string, expected_result, ingreedy_service):
print()
print("execute test for: [%s]" % ingredient_string)
print()
# result = parse_ingredient(ingredient_string)
Вывод:
launch Docker container with Ingreedy service
[]
execute test for: [1/2 of an apple]
.destroy Docker container
launch Docker container with Ingreedy service
[]
execute test for: [12 oz frozen spinach]
.destroy Docker container
launch Docker container with Ingreedy service
[]
execute test for: [24 oz frozen strawberries]
.destroy Docker container