Mintik24's picture
🎉 Полный рефакторинг проекта Medical Transcriber
e275025

Testing

Юнит-тесты для проекта Trans for Doctors.

Структура

tests/
├── __init__.py               # Базовые тесты проекта
├── test_knowledge_base.py    # Тесты Knowledge Base
├── test_stt.py               # Тесты STT модуля
└── README.md                 # Этот файл

Установка pytest

pip install pytest pytest-cov

Запуск тестов

Все тесты

pytest tests/

Конкретный модуль

pytest tests/test_knowledge_base.py
pytest tests/test_stt.py

С подробным выводом

pytest tests/ -v

С покрытием кода

pytest --cov=. tests/

Только быстрые тесты (пропустить медленные)

pytest tests/ -m "not slow"

Текущее покрытие

  • ✅ Knowledge Base: MedicalTermManager, загрузка/сохранение терминов
  • ✅ STT: Audio Processor (resample, duration)
  • ✅ Project Structure: проверка структуры проекта
  • ⏳ LLM Corrector: требует mock OpenAI API
  • ⏳ Pipeline: требует интеграционные тесты
  • ⏳ Report Generator: требует проверку DOCX

Добавление новых тестов

Пример теста для нового модуля

"""
Tests for MyModule
"""

import pytest
from my_module import MyClass


class TestMyClass:
    """Tests for MyClass"""
    
    def test_initialization(self):
        """Test basic initialization"""
        obj = MyClass()
        assert obj is not None
    
    def test_some_method(self):
        """Test some method"""
        obj = MyClass()
        result = obj.some_method()
        assert result == expected_value


if __name__ == "__main__":
    pytest.main([__file__, "-v"])

CI/CD Integration

GitHub Actions

name: Tests

on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Set up Python
        uses: actions/setup-python@v2
        with:
          python-version: 3.11
      - name: Install dependencies
        run: |
          pip install -r requirements.txt
          pip install pytest pytest-cov
      - name: Run tests
        run: pytest tests/ --cov=. --cov-report=xml

Mock данные

Для тестирования без реальных файлов используйте tempfile:

import tempfile
from pathlib import Path

def test_with_temp_file():
    with tempfile.NamedTemporaryFile(mode='w', delete=False) as f:
        f.write("test data")
        temp_file = Path(f.name)
    
    try:
        # Ваш тест
        pass
    finally:
        temp_file.unlink()  # Удалить файл

Пропуск тестов

Пропустить если условие не выполнено

@pytest.mark.skipif(not model_exists(), reason="Model not found")
def test_requires_model():
    pass

Отметить как медленный

@pytest.mark.slow
def test_slow_operation():
    pass

Fixtures

Общий fixture для всех тестов

@pytest.fixture
def medical_terms_manager():
    """Fixture providing MedicalTermManager instance"""
    manager = MedicalTermManager()
    manager.add_term("МРТ")
    manager.add_term("КТ")
    return manager

def test_using_fixture(medical_terms_manager):
    assert len(medical_terms_manager.terms) == 2

Troubleshooting

Модуль не найден

Убедитесь, что проект в PYTHONPATH:

import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).parent.parent))

Тесты не находятся

Проверьте именование:

  • Файлы должны начинаться с test_
  • Классы должны начинаться с Test
  • Методы должны начинаться с test_

Зависимости для тестов

Некоторые тесты требуют:

  • Model files (для STT тестов)
  • OpenAI API key (для LLM тестов)
  • Аудио файлы (для интеграционных тестов)

Используйте pytest.skip() если ресурсы недоступны.