Как снести контейнер Docker с помощью приспособления pytest? - PullRequest
0 голосов
/ 09 мая 2020

При 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
...