Что такое Test execution failed?
Ошибка Test execution failed
возникает, когда тесты в CI/CD пайплайне завершаются неудачно, что приводит к остановке процесса деплоя.
Причины возникновения
- Ошибки в коде приложения
- Неправильная конфигурация тестов
- Проблемы с зависимостями
- Нестабильные тесты (flaky tests)
- Проблемы с окружением тестирования
- Недостаточно ресурсов для выполнения тестов
- Проблемы с базой данных или внешними сервисами
- Ошибки в тестовых данных
Как отладить ошибку
- Проверь логи тестов - изучи детальные сообщения об ошибках
- Запусти тесты локально - воспроизведи проблему
- Проверь конфигурацию тестов - убедись в правильности настроек
- Проверь зависимости - убедись в наличии всех пакетов
- Проверь окружение - убедись в совместимости версий
Как исправить ошибку
1. Исправь ошибки в коде
1# Пример исправления теста в Python
2import pytest
3from myapp import MyClass
4
5def test_my_function():
6 # Неправильно - тест может падать
7 result = MyClass().my_function()
8 assert result == "expected"
9
10 # Правильно - добавь обработку ошибок
11 try:
12 result = MyClass().my_function()
13 assert result == "expected"
14 except Exception as e:
15 pytest.fail(f"Test failed with error: {e}")
2. Настрой правильную конфигурацию тестов
1# .github/workflows/test.yml
2name: Run Tests
3on: [push, pull_request]
4
5jobs:
6 test:
7 runs-on: ubuntu-latest
8 strategy:
9 matrix:
10 python-version: [3.9, 3.10, 3.11]
11
12 steps:
13 - uses: actions/checkout@v3
14
15 - name: Set up Python ${{ matrix.python-version }}
16 uses: actions/setup-python@v4
17 with:
18 python-version: ${{ matrix.python-version }}
19
20 - name: Install dependencies
21 run: |
22 python -m pip install --upgrade pip
23 pip install -r requirements.txt
24 pip install -r requirements-dev.txt
25
26 - name: Run tests with coverage
27 run: |
28 pytest tests/ --cov=src --cov-report=xml
29
30 - name: Upload coverage to Codecov
31 uses: codecov/codecov-action@v3
32 with:
33 file: ./coverage.xml
3. Исправь нестабильные тесты
1# Добавь retry логику для нестабильных тестов
2import pytest
3import time
4
5@pytest.mark.flaky(reruns=3, reruns_delay=1)
6def test_unstable_api():
7 # Тест, который может падать из-за внешних факторов
8 response = make_api_call()
9 assert response.status_code == 200
10
11# Или используй wait_for для асинхронных операций
12def test_async_operation():
13 result = None
14 for _ in range(10): # Попробуй 10 раз
15 try:
16 result = async_operation()
17 if result:
18 break
19 except Exception:
20 time.sleep(1)
21
22 assert result is not None
4. Настрой тестовое окружение
1# docker-compose.test.yml
2version: '3.8'
3services:
4 app:
5 build: .
6 environment:
7 - DATABASE_URL=postgresql://test:test@test-db:5432/test
8 - REDIS_URL=redis://test-redis:6379
9 depends_on:
10 - test-db
11 - test-redis
12 command: pytest tests/
13
14 test-db:
15 image: postgres:13
16 environment:
17 - POSTGRES_DB=test
18 - POSTGRES_USER=test
19 - POSTGRES_PASSWORD=test
20
21 test-redis:
22 image: redis:6-alpine
5. Добавь моки для внешних зависимостей
1# Используй моки для изоляции тестов
2import pytest
3from unittest.mock import patch, MagicMock
4
5@patch('myapp.external_api.requests.get')
6def test_with_mock(mock_get):
7 # Настрой мок
8 mock_response = MagicMock()
9 mock_response.status_code = 200
10 mock_response.json.return_value = {'data': 'test'}
11 mock_get.return_value = mock_response
12
13 # Выполни тест
14 result = my_function()
15 assert result == 'test'
6. Настрой параллельное выполнение тестов
1# Настрой параллельные тесты
2name: Parallel Tests
3on: [push]
4
5jobs:
6 test-unit:
7 runs-on: ubuntu-latest
8 steps:
9 - uses: actions/checkout@v3
10 - name: Run unit tests
11 run: pytest tests/unit/
12
13 test-integration:
14 runs-on: ubuntu-latest
15 steps:
16 - uses: actions/checkout@v3
17 - name: Run integration tests
18 run: pytest tests/integration/
19
20 test-e2e:
21 runs-on: ubuntu-latest
22 steps:
23 - uses: actions/checkout@v3
24 - name: Run E2E tests
25 run: pytest tests/e2e/
Как мониторить подобные ошибки
- Настрой алерты на failed tests
- Мониторь время выполнения тестов
- Отслеживай покрытие кода тестами
- Анализируй flaky tests
- Настрой дашборды для тестов
FAQ
В: Как отличить реальную ошибку от flaky test?
О: Запусти тест несколько раз. Если он падает непостоянно - это flaky test.
В: Что делать с медленными тестами?
О: Оптимизируй тесты, используй параллельное выполнение, добавь кэширование.
В: Как настроить тесты для разных окружений?
О: Используй переменные окружения, конфигурационные файлы, docker-compose.
Лучшие практики
- Пиши стабильные и изолированные тесты
- Используй моки для внешних зависимостей
- Настрой правильное тестовое окружение
- Добавь retry логику для нестабильных тестов
- Мониторь покрытие кода тестами
- Используй параллельное выполнение
- Документируй тестовые сценарии