8.1 Тестирование фронтенда
На этом этапе мы рассмотрим, как провести тестирование и отладку нашего многоконтейнерного приложения. Тестирование поможет выявить и устранить ошибки, а также убедиться в корректной работе всех компонентов системы.
Для тестирования фронтенда на ReactJS мы будем использовать библиотеку Jest и React Testing Library.
Установка Jest и React Testing Library
Шаг 1. Установка зависимостей:
cd frontend
npm install --save-dev jest @testing-library/react @testing-library/jest-dom
Шаг 2. Настройка Jest:
Создайте файл jest.config.js в директории frontend:
module.exports = {
setupFilesAfterEnv: ['<rootDir>/src/setupTests.js'],
testEnvironment: 'jsdom',
};
Шаг 3. Создание файла setupTests.js:
Создайте файл setupTests.js в директории frontend/src:
import '@testing-library/jest-dom/extend-expect';
Шаг 4. Написание тестов для компонентов
Создайте тестовый файл для компонента TaskList в директории frontend/src:
import React from 'react';
import { render, screen } from '@testing-library/react';
import TaskList from './TaskList';
test('renders Task List heading', () => {
render(<TaskList />);
const headingElement = screen.getByText(/Task List/i);
expect(headingElement).toBeInTheDocument();
});
Шаг 5. Запуск тестов
Для запуска тестов используйте команду:
npm test
8.2 Тестирование бекенда
Для тестирования бекенда на Flask мы будем использовать библиотеку unittest.
Установка зависимостей:
cd ../backend
pip install Flask-Testing
Написание тестов для эндпоинтов
Создайте директорию tests и файл test_routes.py в директории backend:
import unittest
from app import app, db
from app.models import User, Task
class BasicTests(unittest.TestCase):
def setUp(self):
app.config['TESTING'] = True
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///:memory:'
self.app = app.test_client()
db.create_all()
def tearDown(self):
db.session.remove()
db.drop_all()
def test_user_registration(self):
response = self.app.post('/register', json={
'username': 'testuser',
'password': 'testpassword'
})
self.assertEqual(response.status_code, 201)
def test_task_creation(self):
self.app.post('/register', json={
'username': 'testuser',
'password': 'testpassword'
})
access_token = self.app.post('/login', json={
'username': 'testuser',
'password': 'testpassword'
}).json['access_token']
response = self.app.post('/tasks', json={
'title': 'Test Task',
'description': 'Test Description',
'owner_id': 1,
'status': 'невыполнена'
}, headers={'Authorization': f'Bearer {access_token}'})
self.assertEqual(response.status_code, 201)
if __name__ == "__main__":
unittest.main()
Запуск тестов
Для запуска тестов используйте команду:
python -m unittest discover
8.3 Интеграционное тестирование
Интеграционное тестирование проверяет взаимодействие между компонентами системы.
Настройка тестового окружения
Для интеграционного тестирования мы будем использовать Docker Compose, чтобы поднять все сервисы в тестовом окружении.
Шаг 1. Создание Docker Compose файла для тестов:
Создайте файл docker-compose.test.yml в корневой директории проекта:
version: '3'
services:
frontend:
build: ./frontend
ports:
- "3001:3000"
networks:
- task-network
backend:
build: ./backend
ports:
- "5001:5000"
depends_on:
- database
networks:
- task-network
environment:
- DATABASE_URL=postgresql://taskuser:taskpassword@database:5432/taskdb
database:
image: postgres:13
environment:
- POSTGRES_DB=taskdb
- POSTGRES_USER=taskuser
- POSTGRES_PASSWORD=taskpassword
networks:
- task-network
volumes:
- db-data:/var/lib/postgresql/data
networks:
task-network:
driver: bridge
volumes:
db-data:
Шаг 2. Запуск тестового окружения:
Для запуска всех сервисов в тестовом окружении используйте команду:
docker compose -f docker-compose.test.yml up --build
Написание интеграционных тестов
Интеграционные тесты можно писать с использованием различных инструментов. Один из подходов - использовать Selenium для автоматизированного тестирования пользовательского интерфейса.
Шаг 1. Установка Selenium:
pip install selenium
Шаг 2. Написание интеграционного теста:
Создайте файл test_integration.py в директории tests:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
def test_frontend():
driver = webdriver.Chrome()
driver.get("http://localhost:3001")
assert "Task List" in driver.title
driver.close()
if __name__ == "__main__":
test_frontend()
Шаг 3. Запуск интеграционного теста:
Для запуска интеграционного теста используйте команду:
python tests/test_integration.py
8.4 Отладка
Для отладки можно использовать логи контейнеров и инструменты мониторинга.
Просмотр логов контейнеров
Для просмотра логов используйте команду:
docker compose logs
Использование инструментов мониторинга
Используйте настроенные ранее Prometheus и Grafana для мониторинга метрик и состояния сервисов.
- Перейдите в веб-интерфейс Grafana: Откройте браузер и перейдите по адресу
http://localhost:3033. - Просмотрите дашборды: Используйте созданные дашборды для отслеживания производительности и состояния сервисов.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ