Что такое Test execution failed?

Ошибка Test execution failed возникает, когда тесты в CI/CD пайплайне завершаются неудачно, что приводит к остановке процесса деплоя.

Причины возникновения

  • Ошибки в коде приложения
  • Неправильная конфигурация тестов
  • Проблемы с зависимостями
  • Нестабильные тесты (flaky tests)
  • Проблемы с окружением тестирования
  • Недостаточно ресурсов для выполнения тестов
  • Проблемы с базой данных или внешними сервисами
  • Ошибки в тестовых данных

Как отладить ошибку

  1. Проверь логи тестов - изучи детальные сообщения об ошибках
  2. Запусти тесты локально - воспроизведи проблему
  3. Проверь конфигурацию тестов - убедись в правильности настроек
  4. Проверь зависимости - убедись в наличии всех пакетов
  5. Проверь окружение - убедись в совместимости версий

Как исправить ошибку

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 логику для нестабильных тестов
  • Мониторь покрытие кода тестами
  • Используй параллельное выполнение
  • Документируй тестовые сценарии