/
CW3
/
The_Project
Обзор
Документация
Войти
/
CW3
/
The_Project
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
tests/test_visualization.py
178 строк
7 KB
CW3
Initial project setup with structure and CI/CD
28 дек 2025, 12:40
28 дек 2025, 12:40
5cacb7a
Код
Авторство
О чём код?
""" Тесты для модуля визуализации """ import pytest import pandas as pd import numpy as np from pathlib import Path import tempfile import os # Устанавливаем переменную окружения для matplotlib os.environ['MPLBACKEND'] = 'Agg' from src.visualization.activity_charts import ActivityVisualizer class TestActivityVisualizer: """Тесты для класса ActivityVisualizer""" @pytest.fixture def sample_event_counts(self): """Примерные данные распределения событий""" return { 'login': 150, 'course_view': 300, 'assignment_submit': 200, 'quiz_attempt': 180, 'forum_post': 120, 'resource_view': 250 } @pytest.fixture def sample_logs(self): """Примерные данные логов""" np.random.seed(42) dates = pd.date_range('2024-09-01', periods=100, freq='H') return pd.DataFrame({ 'timestamp': dates, 'student_id': np.random.choice([1001, 1002, 1003, 1004], 100), 'event_type': np.random.choice(['login', 'course_view', 'assignment_submit'], 100), 'course_id': np.random.choice(['CS101', 'MATH201'], 100), 'hour': np.random.randint(0, 24, 100) }) @pytest.fixture def sample_correlation_data(self): """Примерные данные корреляции""" np.random.seed(42) return pd.DataFrame({ 'student_id': range(1001, 1021), 'total_events': np.random.randint(50, 200, 20), 'active_days': np.random.randint(10, 30, 20), 'final_grade': np.random.randint(60, 100, 20), 'assignment_submit_count': np.random.randint(5, 20, 20), 'quiz_attempt_count': np.random.randint(3, 15, 20) }) def test_initialization(self): """Тест инициализации визуализатора""" # Тест с дефолтным конструктором visualizer = ActivityVisualizer() assert visualizer is not None # Тест с указанием стиля visualizer2 = ActivityVisualizer(style='default') assert visualizer2 is not None def test_plot_event_distribution(self, sample_event_counts, tmp_path): """Тест визуализации распределения событий""" visualizer = ActivityVisualizer() # Сохраняем в временный файл temp_file = tmp_path / "test_plot.png" result = visualizer.plot_event_distribution( sample_event_counts, save_path=str(temp_file) ) # Проверяем, что файл создан assert result is not None assert temp_file.exists() def test_plot_event_distribution_no_save(self, sample_event_counts): """Тест визуализации без сохранения""" visualizer = ActivityVisualizer() # Должен работать без указания пути сохранения try: result = visualizer.plot_event_distribution(sample_event_counts) # Метод должен вернуть None при отсутствии save_path assert result is None except Exception as e: pytest.fail(f"Метод не должен падать без save_path: {e}") def test_plot_correlation_heatmap(self, sample_correlation_data, tmp_path): """Тест визуализации тепловой карты""" visualizer = ActivityVisualizer() temp_file = tmp_path / "test_heatmap.png" try: result = visualizer.plot_correlation_heatmap( sample_correlation_data, save_path=str(temp_file) ) if result is not None: print(f"Тепловая карта сохранена: {temp_file}") except Exception as e: # Не критическая ошибка, если нет числовых данных if "Недостаточно числовых данных" not in str(e): pytest.fail(f"Неожиданная ошибка: {e}") def test_empty_correlation_data(self): """Тест с пустыми данными корреляции""" visualizer = ActivityVisualizer() # Создаем DataFrame без числовых колонок empty_data = pd.DataFrame({ 'student_id': [1001, 1002], 'name': ['Alice', 'Bob'] }) try: visualizer.plot_correlation_heatmap(empty_data) # Должен вывести сообщение о недостатке данных или вернуть None except Exception as e: # Не должно быть критических ошибок assert "Недостаточно числовых данных" in str(e) or isinstance(e, TypeError) def test_create_interactive_report(self, sample_correlation_data, tmp_path): """Тест создания интерактивного отчета""" visualizer = ActivityVisualizer() # Создаем примерные метрики активности activity_metrics = pd.DataFrame({ 'student_id': range(1001, 1021), 'total_events': np.random.randint(50, 200, 20), 'active_days': np.random.randint(10, 30, 20), 'avg_events_per_day': np.random.uniform(2, 10, 20), 'learning_pattern': np.random.choice(['active_learner', 'passive_learner', 'balanced_learner'], 20) }) temp_file = tmp_path / "test_report.html" try: # Этот метод может требовать plotly, который может быть не установлен # Проверяем импорт import importlib plotly_spec = importlib.util.find_spec("plotly") if plotly_spec is not None: result_path = visualizer.create_interactive_report( activity_metrics, sample_correlation_data, output_path=str(temp_file) ) if result_path is not None: assert Path(result_path).exists() else: print("Plotly не установлен, пропускаем тест") pytest.skip("Plotly не установлен") except ImportError: pytest.skip("Plotly не установлен") except Exception as e: # Другие ошибки могут быть допустимы print(f"Создание отчета завершилось с: {e}") if __name__ == "__main__": pytest.main([__file__, "-v"])