如何在Azure DevOps(服务器)管道中测试dockerized应用程序?

时间:2020-07-10 09:59:36

标签: python docker azure-devops pytest fastapi

我有一个简单的python dockerized应用程序,其结构是

/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. 获取其名称
  4. 运行docker exec -it <mycontainer> bash并执行pytest以查看测试通过。

现在,我想在将映像推送到我的Docker注册表并触发发布管道之前,在Azure DevOps(Server)中运行测试。如果这样做听起来不错,那么正确的方法是什么?

到目前为止,我希望在构建管道中添加“ PyTest”步骤的方法能够神奇地起作用:

enter image description here

我当前正在使用Linux代理,并且步骤失败并

enter image description here

失败并不令人惊讶,因为(我认为)容器在构建后没有运行,因此pytest也不能在其中运行:(

解决此问题的另一种方法是在Dockerfile中包含pytest命令,并在发布管道中处理测试。但是,我想将测试与最终被推送到注册表并部署的容器分离。

是否存在在Azure DevOps的Docker容器中运行pytest并获取图形报告的标准方法?

2 个答案:

答案 0 :(得分:4)

按如下所示更新您的 azure-pipelines.yml 文件,以在Azure Pipelines中运行测试

方法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'

Successfull pipeline screenshot

方法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'

顺便说一句,我有一个simple FastAPI project,如果需要,您可以参考。

答案 1 :(得分:0)

使用pytest-azurepipelines测试您的docker脚本:

- 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-azurepipelines运行pytest将使您可以在Azure Pipelines UI中查看测试结果。

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