Я хотел бы создать тест, который по сути создает образ Docker моего проекта и проверяет, работает ли веб-сервер. Вот что у меня есть на данный момент:
import pytest
import requests
import subprocess
import time
from testcontainers.core.container import DockerContainer
from testcontainers.core.wait_strategies import LogMessageWaitStrategy
port = 8000
@pytest.fixture(scope="module")
def app_container():
# Build the docker image
subprocess.run(["docker", "build", "-t", "my-app:test", "."], check=True)
# Start the container
container = DockerContainer("my-app:test")
container.with_exposed_ports(port)
container.with_env("PORT", str(port))
container.with_env("DATABASE_CONNECTION_STRING", "sqlite:///:memory:")
container.with_env("ENVIRONMENT", "test")
container.waiting_for(LogMessageWaitStrategy("Uvicorn running on"))
container.start()
yield container
container.stop()
@pytest.mark.timeout(20)
def test_actuators_info(app_container):
host: str = app_container.get_container_host_ip()
container_port: int = app_container.get_exposed_port(port)
base_url = f"http://{host}:{container_port}"
# Retry logic in case the app takes a moment to be fully responsive
max_retries = 5
for _ in range(max_retries):
try:
response = requests.get(f"{base_url}/actuators/info")
if response.status_code == 200:
assert response.json() is not None
return
except requests.exceptions.ConnectionError:
pass
time.sleep(0.5)
pytest.fail("Could not connect to the application or received non-200 status")
Этот тест работает локально (почти всегда, в очень редких случаях он терпит неудачу), но он не работает при запуске в GitHub Actions.
По сути, я получаю таймаут (я установил его на 20 секунд), и если я не устанавливаю таймаут, то он зависает навсегда.
По журналам я вижу, что образ построен, и кажется, что он зависает в ожидании контейнера готово.
Это лучший способ проверить работоспособность образа Docker? какие-нибудь другие альтернативы? Есть идеи, почему происходит сбой в действиях GitHub?
Это рабочий процесс действий GitHub:
---
name: CI
on: [push]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.13"]
steps:
- uses: actions/checkout@v6
- name: Install uv
uses: astral-sh/setup-uv@v7
with:
python-version: ${{ matrix.python-version }}
- name: Set up Python
run: uv python install
- name: Install the project
run: uv sync --all-extras --dev
- name: Run tests
run: uv run pytest tests
Подробнее здесь: https://stackoverflow.com/questions/798 ... image-runs
Тест Python для «проверки» запуска образа докера ⇐ Python
Программы на Python
-
Anonymous
1766271540
Anonymous
Я хотел бы создать тест, который по сути создает образ Docker моего проекта и проверяет, работает ли веб-сервер. Вот что у меня есть на данный момент:
import pytest
import requests
import subprocess
import time
from testcontainers.core.container import DockerContainer
from testcontainers.core.wait_strategies import LogMessageWaitStrategy
port = 8000
@pytest.fixture(scope="module")
def app_container():
# Build the docker image
subprocess.run(["docker", "build", "-t", "my-app:test", "."], check=True)
# Start the container
container = DockerContainer("my-app:test")
container.with_exposed_ports(port)
container.with_env("PORT", str(port))
container.with_env("DATABASE_CONNECTION_STRING", "sqlite:///:memory:")
container.with_env("ENVIRONMENT", "test")
container.waiting_for(LogMessageWaitStrategy("Uvicorn running on"))
container.start()
yield container
container.stop()
@pytest.mark.timeout(20)
def test_actuators_info(app_container):
host: str = app_container.get_container_host_ip()
container_port: int = app_container.get_exposed_port(port)
base_url = f"http://{host}:{container_port}"
# Retry logic in case the app takes a moment to be fully responsive
max_retries = 5
for _ in range(max_retries):
try:
response = requests.get(f"{base_url}/actuators/info")
if response.status_code == 200:
assert response.json() is not None
return
except requests.exceptions.ConnectionError:
pass
time.sleep(0.5)
pytest.fail("Could not connect to the application or received non-200 status")
Этот тест работает локально (почти всегда, в очень редких случаях он терпит неудачу), но он не работает при запуске в GitHub Actions.
По сути, я получаю таймаут (я установил его на 20 секунд), и если я не устанавливаю таймаут, то он зависает навсегда.
По журналам я вижу, что образ построен, и кажется, что он зависает в ожидании контейнера готово.
Это лучший способ проверить работоспособность образа Docker? какие-нибудь другие альтернативы? Есть идеи, почему происходит сбой в действиях GitHub?
Это рабочий процесс действий GitHub:
---
name: CI
on: [push]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.13"]
steps:
- uses: actions/checkout@v6
- name: Install uv
uses: astral-sh/setup-uv@v7
with:
python-version: ${{ matrix.python-version }}
- name: Set up Python
run: uv python install
- name: Install the project
run: uv sync --all-extras --dev
- name: Run tests
run: uv run pytest tests
Подробнее здесь: [url]https://stackoverflow.com/questions/79851947/python-test-to-test-the-docker-image-runs[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия