我有一个简单的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"]
目前,如果要在容器中的本地计算机上运行测试,一种方法是
docker ps
docker exec -it <mycontainer> bash
并执行pytest
以查看测试通过。现在,我想在将映像推送到我的Docker注册表并触发发布管道之前,在Azure DevOps(Server)中运行测试。如果这样做听起来不错,那么正确的方法是什么?
到目前为止,我希望在构建管道中添加“ PyTest”步骤的方法能够神奇地起作用:
我当前正在使用Linux代理,并且步骤失败并
失败并不令人惊讶,因为(我认为)容器在构建后没有运行,因此pytest也不能在其中运行:(
解决此问题的另一种方法是在Dockerfile中包含pytest命令,并在发布管道中处理测试。但是,我想将测试与最终被推送到注册表并部署的容器分离。
是否存在在Azure DevOps的Docker容器中运行pytest并获取图形报告的标准方法?
答案 0 :(得分:4)
按如下所示更新您的 azure-pipelines.yml
文件,以在Azure Pipelines中运行测试
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
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中查看测试结果。