越来越多的开发人员正在使用容器来开发和部署他们的应用程序。 这意味着轻松测试容器也变得很重要。 康努 (容器实用程序的缩写)是一个 Python 库,可让您轻松为容器编写测试。 本文向您展示如何使用它来测试您的容器。
入门
首先,您需要一个容器应用程序进行测试。 为此,以下命令创建一个包含容器 Dockerfile 的新目录,以及由容器提供服务的 Flask 应用程序。
$ mkdir container_test $ cd container_test $ touch Dockerfile $ touch app.py
在 app.py 文件中复制以下代码。 这是通常的基本 Flask 应用程序,它返回字符串“Hello Container World!”
from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello Container World!' if __name__ == '__main__': app.run(debug=True,host='0.0.0.0')
创建和构建测试容器
要构建测试容器,请将以下说明添加到 Dockerfile。
FROM registry.fedoraproject.org/fedora-minimal:latest RUN microdnf -y install python3-flask && microdnf clean all ADD ./app.py /srv CMD ["python3", "/srv/app.py"]
然后使用 Docker CLI 工具构建容器。
$ sudo dnf -y install docker $ sudo systemctl start docker $ sudo docker build . -t flaskapp_container
注意:仅当您的系统上未安装 Docker 时才需要前两个命令。
构建后使用以下命令运行容器。
$ sudo docker run -p 5000:5000 --rm flaskapp_container * Running on https://0.0.0.0:5000/ (Press CTRL+C to quit) * Restarting with stat * Debugger is active! * Debugger PIN: 473-505-51
最后,使用 curl 检查 Flask 应用程序是否在容器内正确运行:
$ curl https://127.0.0.1:5000 Hello Container World!
随着 flaskapp_container 现在正在运行并准备好进行测试,您可以使用 Ctrl+C.
创建测试脚本
在编写测试脚本之前,必须安装 conu。 在之前创建的 container_test 目录中运行以下命令。
$ python3 -m venv .venv $ source .venv/bin/activate (.venv)$ pip install --upgrade pip (.venv)$ pip install conu $ touch test_container.py
然后将以下脚本复制并保存在 test_container.py 文件中。
import conu PORT = 5000 with conu.DockerBackend() as backend: image = backend.ImageClass("flaskapp_container") options = ["-p", "5000:5000"] container = image.run_via_binary(additional_opts=options) try: # Check that the container is running and wait for the flask application to start. assert container.is_running() container.wait_for_port(PORT) # Run a GET request on / port 5000. http_response = container.http_request(path="/", port=PORT) # Check the response status code is 200 assert http_response.ok # Get the response content response_content = http_response.content.decode("utf-8") # Check that the "Hello Container World!" string is served. assert "Hello Container World!" in response_content # Get the logs from the container logs = [line for line in container.logs()] # Check the the Flask application saw the GET request. assert b'"GET / HTTP/1.1" 200 -' in logs[-1] finally: container.stop() container.delete()
测试设置
该脚本首先将 conu 设置为使用 Docker 作为后端来运行容器。 然后它将容器映像设置为使用您在本教程的第一部分中构建的 flaskapp_container。
下一步是配置运行容器所需的选项。 在这个 example,Flask 应用程序在端口 5000 上提供内容。因此,您需要公开此端口并将其映射到主机上的同一端口。
最后,脚本启动容器,现在可以进行测试了。
测试方法
在测试容器之前,请检查容器是否正在运行并准备就绪。 这 example 脚本正在使用 container.is_running 和 container.wait_for_port。 这些方法确保容器正在运行并且服务在预期端口上可用。
container.http_request 是一个包装器 要求 库,可以方便地在测试期间发送 HTTP 请求。 该方法返回一个 请求.响应 对象,因此很容易访问响应的内容以进行测试。
Conu 还提供对容器日志的访问权限。 再一次,这在测试期间很有用。 在里面 example 上面,container.logs 方法返回容器日志。 您可以使用它们来断言打印了特定的日志,或者 example 测试期间没有引发异常。
Conu 提供了许多其他有用的方法来与容器交互。 API 的完整列表可在 文件. 您还可以查阅可用的示例 GitHub.
运行本教程所需的所有代码和文件都可以在 GitHub 也是。 对于想看这个的读者 example 此外,您可以查看使用 pytest 运行测试并构建容器测试套件。