# Testing Юнит-тесты для проекта Trans for Doctors. ## Структура ``` tests/ ├── __init__.py # Базовые тесты проекта ├── test_knowledge_base.py # Тесты Knowledge Base ├── test_stt.py # Тесты STT модуля └── README.md # Этот файл ``` ## Установка pytest ```bash pip install pytest pytest-cov ``` ## Запуск тестов ### Все тесты ```bash pytest tests/ ``` ### Конкретный модуль ```bash pytest tests/test_knowledge_base.py pytest tests/test_stt.py ``` ### С подробным выводом ```bash pytest tests/ -v ``` ### С покрытием кода ```bash pytest --cov=. tests/ ``` ### Только быстрые тесты (пропустить медленные) ```bash pytest tests/ -m "not slow" ``` ## Текущее покрытие - ✅ Knowledge Base: MedicalTermManager, загрузка/сохранение терминов - ✅ STT: Audio Processor (resample, duration) - ✅ Project Structure: проверка структуры проекта - ⏳ LLM Corrector: требует mock OpenAI API - ⏳ Pipeline: требует интеграционные тесты - ⏳ Report Generator: требует проверку DOCX ## Добавление новых тестов ### Пример теста для нового модуля ```python """ 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 ```yaml 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`: ```python 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() # Удалить файл ``` ## Пропуск тестов ### Пропустить если условие не выполнено ```python @pytest.mark.skipif(not model_exists(), reason="Model not found") def test_requires_model(): pass ``` ### Отметить как медленный ```python @pytest.mark.slow def test_slow_operation(): pass ``` ## Fixtures ### Общий fixture для всех тестов ```python @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: ```python 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()` если ресурсы недоступны.