8.1 Testowanie frontendu
Na tym etapie omówimy, jak przeprowadzić testowanie i debugowanie naszej aplikacji wielokontenerowej. Testowanie pomoże wykryć i naprawić błędy, a także upewnić się, że wszystkie komponenty systemu działają poprawnie.
Do testowania frontendu na ReactJS użyjemy biblioteki Jest i React Testing Library.
Instalacja Jest i React Testing Library
Krok 1. Instalacja zależności:
cd frontend
npm install --save-dev jest @testing-library/react @testing-library/jest-dom
Krok 2. Konfiguracja Jest:
Utwórz plik jest.config.js
w katalogu frontend:
module.exports = {
setupFilesAfterEnv: ['<rootDir>/src/setupTests.js'],
testEnvironment: 'jsdom',
};
Krok 3. Utworzenie pliku setupTests.js
:
Utwórz plik setupTests.js
w katalogu frontend/src:
import '@testing-library/jest-dom/extend-expect';
Krok 4. Pisanie testów dla komponentów
Utwórz plik testowy dla komponentu TaskList
w katalogu 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();
});
Krok 5. Uruchamianie testów
Aby uruchomić testy, użyj polecenia:
npm test
8.2 Testowanie backendu
Do testowania backendu na Flask użyjemy biblioteki unittest.
Instalacja zależności:
cd ../backend
pip install Flask-Testing
Tworzenie testów dla endpointów
Utwórz katalog tests
i plik test_routes.py
w katalogu 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': 'Zadanie testowe',
'description': 'Opis testowy',
'owner_id': 1,
'status': 'niewykonane'
}, headers={'Authorization': f'Bearer {access_token}'})
self.assertEqual(response.status_code, 201)
if __name__ == "__main__":
unittest.main()
Uruchamianie testów
Aby uruchomić testy, użyj polecenia:
python -m unittest discover
8.3 Testowanie integracyjne
Testowanie integracyjne sprawdza interakcje pomiędzy komponentami systemu.
Konfiguracja środowiska testowego
Do testowania integracyjnego będziemy używać Docker Compose, aby uruchomić wszystkie serwisy w środowisku testowym.
Krok 1. Tworzenie pliku Docker Compose dla testów:
Utwórz plik docker-compose.test.yml
w katalogu głównym projektu:
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:
Krok 2. Uruchomienie środowiska testowego:
Aby uruchomić wszystkie serwisy w środowisku testowym, użyj komendy:
docker compose -f docker-compose.test.yml up --build
Pisanie testów integracyjnych
Testy integracyjne można pisać przy pomocy różnych narzędzi. Jednym z podejść jest użycie Selenium do testowania zautomatyzowanego interfejsu użytkownika.
Krok 1. Instalacja Selenium:
pip install selenium
Krok 2. Pisanie testu integracyjnego:
Utwórz plik test_integration.py
w katalogu 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()
Krok 3. Uruchomienie testu integracyjnego:
Aby uruchomić test integracyjny, użyj komendy:
python tests/test_integration.py
8.4 Debugowanie
Do debugowania można używać logów kontenerów i narzędzi monitorujących.
Podgląd logów kontenerów
Aby zobaczyć logi, użyj komendy:
docker compose logs
Użycie narzędzi monitorujących
Użyj wcześniej skonfigurowanych Prometheus i Grafana, aby monitorować metryki i stan usług.
- Przejdź do interfejsu webowego Grafana: Otwórz przeglądarkę i przejdź pod adres
http://localhost:3033
. - Przeglądaj dashboardy: Użyj utworzonych dashboardów do śledzenia wydajności i stanu usług.
GO TO FULL VERSION