| # 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()` если ресурсы недоступны. | |