/
LKastornova
/
Python_lesson
Обзор
Документация
Войти
/
LKastornova
/
Python_lesson
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
test/test_analysis.py
139 строк
7 KB
@lvkastor
Initial commit: Finance Manager 2026 application
11 янв 2026, 19:15
11 янв 2026, 19:15
209a1c3
Код
Авторство
О чём код?
""" Модуль тестирования функций анализа финансовых данных. Содержит unit-тесты для проверки корректности работы: - Базовых функций анализа из модуля analysis.py - Расширенных функций анализа из модуля pandas_analysis.py - Функций расчета баланса и статистики Обеспечивает покрытие тестами ключевых функций анализа. """ import unittest import sys import os from datetime import datetime, timedelta # Добавляем родительскую папку в путь поиска модулей sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..')) # АБСОЛЮТНЫЙ импорт (убрали две точки) from models import FinancialOperation from analysis import ( calculate_balance, analyze_expenses_by_category, filter_operations_by_period, calculate_period_totals ) class TestFinancialAnalysis(unittest.TestCase): """Тестовый класс для проверки функций анализа.""" def setUp(self): """Подготовка тестовых данных.""" self.now = datetime.now() self.operations = [ FinancialOperation('income', 1000, 'работа', 'зарплата', self.now, 'Зарплата за месяц'), FinancialOperation('expense', 500, 'еда', 'магнолия', self.now, 'Покупка продуктов'), FinancialOperation('expense', 300, 'транспорт', 'такси', self.now - timedelta(days=1), 'Поездка на такси'), FinancialOperation('income', 200, 'прочее', None, self.now - timedelta(days=10), 'Возврат долга'), FinancialOperation('expense', 150, 'еда', 'кафе', self.now - timedelta(days=30), 'Обед в кафе') ] def test_calculate_balance(self): """Тест расчета баланса.""" balance = calculate_balance(self.operations) expected_balance = (1000 + 200) - (500 + 300 + 150) # 1200 - 950 = 250 self.assertEqual(balance, 250) def test_empty_operations(self): """Тест расчета баланса для пустого списка.""" operations = [] balance = calculate_balance(operations) self.assertEqual(balance, 0) def test_analyze_expenses_by_category(self): """Тест анализа расходов по категориям.""" expenses = analyze_expenses_by_category(self.operations) # Проверяем структуру результата self.assertIsInstance(expenses, dict) # Проверяем конкретные значения self.assertIn('еда', expenses) self.assertIn('транспорт', expenses) self.assertEqual(expenses['еда'], 650) # 500 + 150 self.assertEqual(expenses['транспорт'], 300) # Доходы не должны попасть в результат self.assertNotIn('работа', expenses) self.assertNotIn('прочее', expenses) def test_analyze_expenses_empty(self): """Тест анализа расходов для пустого списка.""" expenses = analyze_expenses_by_category([]) self.assertEqual(expenses, {}) def test_filter_operations_by_period_week(self): """Тест фильтрации операций по неделе.""" filtered = filter_operations_by_period(self.operations, 'week') # Операции должны быть отфильтрованы по текущей неделе for op in filtered: # Проверяем, что операция в пределах текущей недели start_of_week = self.now - timedelta(days=self.now.weekday()) start_of_week = datetime(start_of_week.year, start_of_week.month, start_of_week.day, 0, 0, 0) end_of_week = start_of_week + timedelta(days=6, hours=23, minutes=59, seconds=59) self.assertTrue(start_of_week <= op.date <= end_of_week) def test_filter_operations_by_period_month(self): """Тест фильтрации операций по месяцу.""" filtered = filter_operations_by_period(self.operations, 'month') # Должны остаться операции только текущего месяца current_month = self.now.month for op in filtered: self.assertEqual(op.date.month, current_month) def test_filter_operations_by_period_all(self): """Тест фильтрации операций без указания периода.""" filtered = filter_operations_by_period(self.operations, None) self.assertEqual(len(filtered), len(self.operations)) filtered = filter_operations_by_period(self.operations, 'all') self.assertEqual(len(filtered), len(self.operations)) def test_calculate_period_totals(self): """Тест расчета итогов за период.""" totals = calculate_period_totals(self.operations, 'month') self.assertIsInstance(totals, dict) self.assertIn('total_income', totals) self.assertIn('total_expense', totals) self.assertIn('profit', totals) self.assertIn('operation_count', totals) # Проверяем корректность типов self.assertIsInstance(totals['total_income'], (int, float)) self.assertIsInstance(totals['total_expense'], (int, float)) self.assertIsInstance(totals['profit'], (int, float)) self.assertIsInstance(totals['operation_count'], int) # Прибыль должна быть равна разности доходов и расходов self.assertEqual(totals['profit'], totals['total_income'] - totals['total_expense']) def test_calculate_period_totals_empty(self): """Тест расчета итогов для пустого списка.""" totals = calculate_period_totals([], 'month') self.assertEqual(totals['total_income'], 0) self.assertEqual(totals['total_expense'], 0) self.assertEqual(totals['profit'], 0) self.assertEqual(totals['operation_count'], 0) if __name__ == '__main__': unittest.main()