Как протестировать докеризованное приложение в конвейере Azure DevOps (Server)? - PullRequest
7 голосов
/ 10 июля 2020

У меня есть простое python докеризованное приложение со структурой

/src
 - server.py
 - test_server.py
Dockerfile
requirements.txt

, в котором базовый образ docker основан на Linux, а server.py предоставляет конечную точку FastAPI. Для полноты, server.py выглядит так:

from fastapi import FastAPI
from pydantic import BaseModel

class Item(BaseModel):
    number: int

app = FastAPI(title="Sum one", description="Get a number, add one to it", version="0.1.0")

@app.post("/compute")
async def compute(input: Item):
    return {'result': input.number + 1}

Тесты должны выполняться с помощью pytest (после https://fastapi.tiangolo.com/tutorial/testing/) с test_server.py:

from fastapi.testclient import TestClient
from server import app
import json

client = TestClient(app)

def test_endpoint():
    """test endpoint"""
    response = client.post("/compute", json={"number": 1})
    values = json.loads(response.text)
    assert values["result"] == 2

Dockerfile выглядит так:

FROM tiangolo/uvicorn-gunicorn:python3.7

COPY . /app

RUN pip install -r requirements.txt

WORKDIR /app/src

EXPOSE 8000

CMD ["uvicorn", "server:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]

На данный момент, если я хочу запустить тесты на моем локальном компьютере в контейнере, один из способов сделать это:

  1. Создайте контейнер Docker
  2. Запустите контейнер, получите его имя через docker ps
  3. Запустите docker exec -it <mycontainer> bash и выполните pytest, чтобы увидеть прохождение тестов.

Теперь я хотел бы запустить тесты в Azure DevOps (Server), прежде чем помещать образ в мой Docker реестр и запускать конвейер выпуска. Если это звучит нормально, как это сделать?

До сих пор я надеялся, что что-то вроде добавления шага «PyTest» в конвейер сборки сработает волшебным образом:

enter image description here

I am currently using a Linux agent, and the step fails with

введите описание изображения здесь

Ошибка неудивительна, поскольку (я думаю) контейнер не запускается после сборки, и поэтому pytest также не может работать в нем: (

Другой способ Решить эту проблему можно, включив команды pytest в файл Docker и обработав тесты в конвейере выпуска. Однако я хотел бы отделить тестирование от контейнера, который в конечном итоге помещается в реестр и развертывается.

Is есть ли стандартный способ запустить pytest в контейнере Docker в Azure DevOps и получить графический отчет?

Ответы [ 2 ]

2 голосов
/ 13 июля 2020

Обновите файл azure-pipelines.yml следующим образом, чтобы запустить тесты в Azure конвейерах

Method-1 (используя docker)

trigger:
- master

pool:
  vmImage: 'ubuntu-latest'
steps:
- task: Docker@2
  inputs:
    command: 'build'
    Dockerfile: '**/Dockerfile'
    arguments: '-t fast-api:$(Build.BuildId)'
- script: |
    docker run fast-api:$(Build.BuildId) python -m pytest
  displayName: 'Run PyTest'

Успешный скриншот конвейера

Метод-2 (без docker)

trigger:
- master

pool:
  vmImage: 'ubuntu-latest'
strategy:
  matrix:
    Python37:
      python.version: '3.7'

steps:
- task: UsePythonVersion@0
  inputs:
    versionSpec: '$(python.version)'
  displayName: 'Use Python $(python.version)'

- script: |
    python -m pip install --upgrade pip
    pip install -r requirements.txt
  displayName: 'Install dependencies'

- script: |
    pip install pytest pytest-azurepipelines
    python -m pytest
  displayName: 'pytest'

Кстати, у меня есть один простой проект FastAPI , вы можете Ссылка, если хотите.

0 голосов
/ 13 июля 2020

Протестируйте свой docker скрипт, используя pytest-azurepipelines:

- script: |
    python -m pip install --upgrade pip
    pip install pytest pytest-azurepipelines
    pip install -r requirements.txt
    pip install -e .
  displayName: 'Install dependencies'

- script: |
    python -m pytest /src/test_server.py
  displayName: 'pytest'

Запуск pytest с плагином pytest-azurepipelines позволит вам увидеть результаты теста в Azure Pipelines UI.

https://pypi.org/project/pytest-azurepipelines/

...