From 41ffe8266076a2587f280760fe98ae49010c7c2e Mon Sep 17 00:00:00 2001 From: Maximilian <40673518+Java-Fish@users.noreply.github.com> Date: Sat, 7 Jun 2025 19:38:47 +0200 Subject: [PATCH] create a simple script to run all tests --- README.md | 23 ++- rebuild_project.sh | 419 --------------------------------------------- start_test.sh | 105 ++++++++++++ 3 files changed, 123 insertions(+), 424 deletions(-) delete mode 100755 rebuild_project.sh create mode 100755 start_test.sh diff --git a/README.md b/README.md index da7244e..34a1d07 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,19 @@ Das Stop-Skript stoppt alle Container und räumt auf. Das Projekt verfügt über eine umfassende Test-Suite mit verschiedenen Test-Arten: +### Einfachster Weg (Empfohlen) +Verwenden Sie das bereitgestellte Test-Skript für einen vollständigen Test-Durchlauf: +```bash +./start_test.sh +``` + +Das Test-Skript führt automatisch folgende Tests aus: +- Django Tests (13 Tests im Docker Container) +- Pytest Unit Tests (77 Tests) +- Pytest Integration Tests (11 Tests) +- Pytest Functional Tests (6 Tests) +- Generiert einen HTML Coverage Report + ### Django Tests (im Docker Container) Führen Sie die Standard Django Tests aus: ```bash @@ -47,28 +60,28 @@ docker exec django_fbf_web_1 python manage.py test ### Komplette Test-Suite (Unit, Integration, Functional) Für die vollständige Test-Suite (94 Tests): ```bash -python -m pytest test/ -v +python3 -m pytest test/ -v ``` ### Nur Unit Tests ```bash -python -m pytest test/unit/ -v +python3 -m pytest test/unit/ -v ``` ### Nur Integration Tests ```bash -python -m pytest test/integration/ -v +python3 -m pytest test/integration/ -v ``` ### Nur Functional Tests ```bash -python -m pytest test/functional/ -v +python3 -m pytest test/functional/ -v ``` ### Test-Coverage Report Um einen Bericht über die Test-Abdeckung zu erhalten: ```bash -python -m pytest test/ --cov=app --cov-report=html +python3 -m pytest test/ --cov=app --cov-report=html ``` **Hinweis:** Stellen Sie sicher, dass das Projekt läuft (`./start_project.sh`) bevor Sie die Tests ausführen. diff --git a/rebuild_project.sh b/rebuild_project.sh deleted file mode 100755 index 5643d22..0000000 --- a/rebuild_project.sh +++ /dev/null @@ -1,419 +0,0 @@ -#!/bin/bash - -# Django FBF Project Rebuild Script -# This script stops the project, runs all tests, and restarts if tests pass - -set -e # Exit on any error - -# Colors for output -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -BLUE='\033[0;34m' -NC='\033[0m' # No Color - -# Configuration -PROJECT_DIR="/Users/maximilianfischer/git/django_fbf" -TEST_DIR="$PROJECT_DIR/test" -APP_DIR="$PROJECT_DIR/app" -DOCKER_COMPOSE_FILE="$PROJECT_DIR/docker-compose.yaml" -DOCKER_COMPOSE_PROD_FILE="$PROJECT_DIR/docker-compose.prod.yml" - -# Logging -LOG_FILE="$PROJECT_DIR/rebuild_$(date +%Y%m%d_%H%M%S).log" - -log() { - echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE" -} - -log_info() { - echo -e "${BLUE}[INFO]${NC} $1" | tee -a "$LOG_FILE" -} - -log_success() { - echo -e "${GREEN}[SUCCESS]${NC} $1" | tee -a "$LOG_FILE" -} - -log_warning() { - echo -e "${YELLOW}[WARNING]${NC} $1" | tee -a "$LOG_FILE" -} - -log_error() { - echo -e "${RED}[ERROR]${NC} $1" | tee -a "$LOG_FILE" -} - -# Function to check if Docker is running -check_docker() { - if ! docker info > /dev/null 2>&1; then - log_error "Docker is not running. Please start Docker first." - exit 1 - fi - log_info "Docker is running" -} - -# Function to stop the project -stop_project() { - log_info "Stopping Django FBF project..." - - cd "$PROJECT_DIR" - - # Stop using existing stop script if available - if [ -f "./stop_project.sh" ]; then - log_info "Using existing stop_project.sh script" - ./stop_project.sh 2>&1 | tee -a "$LOG_FILE" - else - # Stop using docker-compose - if [ -f "$DOCKER_COMPOSE_FILE" ]; then - log_info "Stopping containers using docker-compose" - docker-compose -f "$DOCKER_COMPOSE_FILE" down 2>&1 | tee -a "$LOG_FILE" - fi - - # Also stop production containers if they exist - if [ -f "$DOCKER_COMPOSE_PROD_FILE" ]; then - log_info "Stopping production containers" - docker-compose -f "$DOCKER_COMPOSE_PROD_FILE" down 2>&1 | tee -a "$LOG_FILE" - fi - fi - - log_success "Project stopped successfully" -} - -# Function to run tests -run_tests() { - log_info "Running Django FBF tests..." - - cd "$PROJECT_DIR" - - # Set up Python virtual environment if it exists - if [ -d "./venv" ]; then - log_info "Activating virtual environment" - source ./venv/bin/activate - fi - - # Method 1: Try using our custom test runner - if [ -f "$TEST_DIR/run_tests.py" ]; then - log_info "Running tests using custom test runner" - if python3 "$TEST_DIR/run_tests.py" 2>&1 | tee -a "$LOG_FILE"; then - log_success "Custom test runner completed successfully" - return 0 - else - log_warning "Custom test runner failed, trying Django manage.py" - fi - fi - - # Method 2: Try using Django's manage.py test command - if [ -f "$APP_DIR/manage.py" ]; then - log_info "Running tests using Django manage.py" - cd "$APP_DIR" - - # Set Django settings module for testing - export DJANGO_SETTINGS_MODULE="core.settings" - - # Run Django tests - if python3 manage.py test test --verbosity=2 --keepdb 2>&1 | tee -a "$LOG_FILE"; then - log_success "Django tests completed successfully" - return 0 - else - log_error "Django tests failed" - return 1 - fi - fi - - # Method 3: Try using pytest if installed - log_info "Trying pytest as fallback" - if command -v pytest &> /dev/null; then - cd "$TEST_DIR" - if pytest -v 2>&1 | tee -a "$LOG_FILE"; then - log_success "Pytest completed successfully" - return 0 - else - log_error "Pytest failed" - return 1 - fi - fi - - log_error "No suitable test runner found" - return 1 -} - -# Function to check code quality (optional) -check_code_quality() { - log_info "Checking code quality..." - - cd "$PROJECT_DIR" - - # Check if flake8 is available - if command -v flake8 &> /dev/null; then - log_info "Running flake8 linter" - if flake8 app/ --max-line-length=88 --exclude=migrations 2>&1 | tee -a "$LOG_FILE"; then - log_success "Code quality check passed" - else - log_warning "Code quality issues found (not blocking)" - fi - else - log_info "flake8 not available, skipping code quality check" - fi -} - -# Function to start the project -start_project() { - log_info "Starting Django FBF project..." - - cd "$PROJECT_DIR" - - # Start using existing start script if available - if [ -f "./start_project.sh" ]; then - log_info "Using existing start_project.sh script" - if ./start_project.sh 2>&1 | tee -a "$LOG_FILE"; then - log_success "Project started successfully using start script" - return 0 - else - log_error "Failed to start project using start script" - return 1 - fi - else - # Start using docker-compose - if [ -f "$DOCKER_COMPOSE_FILE" ]; then - log_info "Starting containers using docker-compose" - if docker-compose -f "$DOCKER_COMPOSE_FILE" up -d 2>&1 | tee -a "$LOG_FILE"; then - log_success "Containers started successfully" - - # Wait a moment for containers to be ready - log_info "Waiting for containers to be ready..." - sleep 10 - - # Check if containers are running - if docker-compose -f "$DOCKER_COMPOSE_FILE" ps | grep -q "Up"; then - log_success "Containers are running" - return 0 - else - log_error "Containers failed to start properly" - return 1 - fi - else - log_error "Failed to start containers" - return 1 - fi - else - log_error "No docker-compose.yaml file found" - return 1 - fi - fi -} - -# Function to verify project is running -verify_project() { - log_info "Verifying project is running..." - - # Check if containers are running - cd "$PROJECT_DIR" - if [ -f "$DOCKER_COMPOSE_FILE" ]; then - if docker-compose -f "$DOCKER_COMPOSE_FILE" ps | grep -q "Up"; then - log_success "Project containers are running" - - # Try to check if web service is responding - log_info "Checking web service availability..." - sleep 5 - - # Try to curl the application (adjust port as needed) - if curl -f -s http://localhost:8000 > /dev/null 2>&1; then - log_success "Web service is responding" - elif curl -f -s http://localhost:80 > /dev/null 2>&1; then - log_success "Web service is responding on port 80" - else - log_warning "Web service may not be responding yet (this might be normal)" - fi - - return 0 - else - log_error "Project containers are not running" - return 1 - fi - fi - - log_warning "Could not verify project status" - return 0 -} - -# Function to create backup before rebuild -create_backup() { - log_info "Creating backup before rebuild..." - - cd "$PROJECT_DIR" - - # Create backup directory - BACKUP_DIR="$PROJECT_DIR/backups/$(date +%Y%m%d_%H%M%S)" - mkdir -p "$BACKUP_DIR" - - # Backup database if possible - if [ -f "./bin/backupDB" ]; then - log_info "Creating database backup" - if ./bin/backupDB 2>&1 | tee -a "$LOG_FILE"; then - log_success "Database backup created" - else - log_warning "Database backup failed" - fi - fi - - # Backup important files - log_info "Backing up configuration files" - cp -r app/ "$BACKUP_DIR/" 2>/dev/null || true - cp docker-compose.yaml "$BACKUP_DIR/" 2>/dev/null || true - cp docker-compose.prod.yml "$BACKUP_DIR/" 2>/dev/null || true - - log_success "Backup created in $BACKUP_DIR" -} - -# Function to show project status -show_status() { - log_info "Project Status:" - echo "===========================================" | tee -a "$LOG_FILE" - - cd "$PROJECT_DIR" - - if [ -f "$DOCKER_COMPOSE_FILE" ]; then - echo "Docker Containers:" | tee -a "$LOG_FILE" - docker-compose -f "$DOCKER_COMPOSE_FILE" ps 2>&1 | tee -a "$LOG_FILE" - echo "" | tee -a "$LOG_FILE" - fi - - echo "Recent log entries:" | tee -a "$LOG_FILE" - tail -10 "$LOG_FILE" - echo "===========================================" | tee -a "$LOG_FILE" -} - -# Main execution -main() { - log_info "Starting Django FBF project rebuild process" - log_info "Log file: $LOG_FILE" - - # Parse command line arguments - SKIP_BACKUP=false - SKIP_QUALITY_CHECK=false - FORCE_RESTART=false - - while [[ $# -gt 0 ]]; do - case $1 in - --skip-backup) - SKIP_BACKUP=true - shift - ;; - --skip-quality-check) - SKIP_QUALITY_CHECK=true - shift - ;; - --force-restart) - FORCE_RESTART=true - shift - ;; - --help) - echo "Usage: $0 [OPTIONS]" - echo "Options:" - echo " --skip-backup Skip backup creation" - echo " --skip-quality-check Skip code quality check" - echo " --force-restart Restart even if tests fail" - echo " --help Show this help message" - exit 0 - ;; - *) - log_error "Unknown option: $1" - exit 1 - ;; - esac - done - - # Start rebuild process - trap 'log_error "Rebuild process interrupted"; exit 1' INT TERM - - # Step 1: Check prerequisites - check_docker - - # Step 2: Create backup (optional) - if [ "$SKIP_BACKUP" = false ]; then - create_backup - else - log_info "Skipping backup creation" - fi - - # Step 3: Stop the project - stop_project - - # Step 4: Run tests - if run_tests; then - log_success "All tests passed!" - - # Step 5: Check code quality (optional) - if [ "$SKIP_QUALITY_CHECK" = false ]; then - check_code_quality - else - log_info "Skipping code quality check" - fi - - # Step 6: Start the project - if start_project; then - # Step 7: Verify project is running - if verify_project; then - log_success "Project rebuild completed successfully!" - show_status - exit 0 - else - log_error "Project verification failed" - exit 1 - fi - else - log_error "Failed to start project" - exit 1 - fi - else - log_error "Tests failed!" - - if [ "$FORCE_RESTART" = true ]; then - log_warning "Force restart enabled, starting project anyway" - if start_project; then - log_warning "Project started despite test failures" - show_status - exit 2 # Different exit code to indicate tests failed but project started - else - log_error "Failed to start project even with force restart" - exit 1 - fi - else - log_error "Project not restarted due to test failures" - log_info "Use --force-restart to start anyway" - exit 1 - fi - fi -} - -# Handle help request -if [[ "${1:-}" == "--help" ]] || [[ "${1:-}" == "-h" ]]; then - echo "Django FBF Project Rebuild Script" - echo "==================================" - echo "" - echo "This script performs a complete rebuild of the Django FBF project:" - echo "1. Creates a backup (optional)" - echo "2. Stops the running project" - echo "3. Runs all tests" - echo "4. Checks code quality (optional)" - echo "5. Restarts the project if tests pass" - echo "6. Verifies the project is running" - echo "" - echo "Usage: $0 [OPTIONS]" - echo "" - echo "Options:" - echo " --skip-backup Skip backup creation before rebuild" - echo " --skip-quality-check Skip code quality check with flake8" - echo " --force-restart Restart project even if tests fail" - echo " --help, -h Show this help message" - echo "" - echo "Exit codes:" - echo " 0 - Success" - echo " 1 - Error or tests failed" - echo " 2 - Tests failed but project started (with --force-restart)" - echo "" - echo "Log files are created in the project directory with timestamp." - exit 0 -fi - -# Run main function -main "$@" diff --git a/start_test.sh b/start_test.sh new file mode 100755 index 0000000..fbddf62 --- /dev/null +++ b/start_test.sh @@ -0,0 +1,105 @@ +#!/bin/bash + +# start_test.sh - Test Runner for Fallen Birdy Form +# Führt alle Tests aus und zeigt eine Zusammenfassung an + +echo "🧪 ===== FALLEN BIRDY FORM - TEST SUITE =====" +echo "📅 Start: $(date '+%d.%m.%Y %H:%M:%S')" +echo "" + +# Farben für die Ausgabe +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' + +# Test Counters +TOTAL_TESTS=0 +TOTAL_FAILED=0 +ALL_PASSED=true + +echo -e "${BLUE}🔍 Überprüfung der Voraussetzungen...${NC}" + +# Prüfen ob Docker Container läuft +if ! docker ps | grep -q "django_fbf_web_1"; then + echo -e "${RED}❌ Django Container läuft nicht!${NC}" + echo " Bitte starten Sie das Projekt zuerst mit: ./start_project.sh" + exit 1 +fi + +echo -e "${GREEN}✅ Container läuft${NC}" +echo "" + +# 1. Django Tests +echo -e "${BLUE}1️⃣ Django Tests (im Docker Container)...${NC}" +echo "----------------------------------------" + +DJANGO_RESULT=$(docker exec django_fbf_web_1 python manage.py test 2>&1) +DJANGO_EXIT=$? + +if [ $DJANGO_EXIT -eq 0 ]; then + DJANGO_COUNT=$(echo "$DJANGO_RESULT" | grep -o "Ran [0-9]\+ tests" | grep -o "[0-9]\+" || echo "0") + echo -e "${GREEN}✅ Django Tests: $DJANGO_COUNT Tests bestanden${NC}" + TOTAL_TESTS=$((TOTAL_TESTS + DJANGO_COUNT)) +else + echo -e "${RED}❌ Django Tests: Fehler aufgetreten${NC}" + echo "$DJANGO_RESULT" | tail -5 + ALL_PASSED=false + TOTAL_FAILED=$((TOTAL_FAILED + 1)) +fi +echo "" + +# 2. Pytest Tests (alle zusammen) +echo -e "${BLUE}2️⃣ Pytest Tests (Unit, Integration, Functional)...${NC}" +echo "------------------------------------------------" + +if command -v python3 >/dev/null 2>&1 && python3 -c "import pytest" 2>/dev/null; then + PYTEST_RESULT=$(python3 -m pytest test/ -v --tb=short 2>&1) + PYTEST_EXIT=$? + + if [ $PYTEST_EXIT -eq 0 ]; then + PYTEST_COUNT=$(echo "$PYTEST_RESULT" | grep -E "=+ [0-9]+ passed" | grep -o "[0-9]\+ passed" | grep -o "[0-9]\+" || echo "0") + echo -e "${GREEN}✅ Pytest Tests: $PYTEST_COUNT Tests bestanden${NC}" + TOTAL_TESTS=$((TOTAL_TESTS + PYTEST_COUNT)) + else + PYTEST_FAILED=$(echo "$PYTEST_RESULT" | grep -E "=+ [0-9]+ failed" | grep -o "[0-9]\+ failed" | grep -o "[0-9]\+" || echo "0") + echo -e "${RED}❌ Pytest Tests: $PYTEST_FAILED Tests fehlgeschlagen${NC}" + echo "$PYTEST_RESULT" | tail -10 + ALL_PASSED=false + TOTAL_FAILED=$((TOTAL_FAILED + PYTEST_FAILED)) + fi +else + echo -e "${YELLOW}⚠️ Pytest nicht verfügbar - überspringe externe Tests${NC}" +fi +echo "" + +# Zusammenfassung +echo "🎯 ===== TEST ZUSAMMENFASSUNG =====" +echo "📊 Gesamt Tests ausgeführt: $TOTAL_TESTS" + +if [ "$ALL_PASSED" = true ] && [ $TOTAL_FAILED -eq 0 ]; then + echo -e "${GREEN}🎉 ALLE TESTS BESTANDEN! 🎉${NC}" + EXIT_CODE=0 +else + echo -e "${RED}❌ Es gab Fehler bei den Tests${NC}" + echo " Fehlgeschlagene Tests: $TOTAL_FAILED" + EXIT_CODE=1 +fi + +echo "" +echo "⏱️ Beendet: $(date '+%d.%m.%Y %H:%M:%S')" +echo "==================================" + +# Coverage Report (optional) +if [ "$ALL_PASSED" = true ] && command -v python3 >/dev/null 2>&1; then + echo "" + echo -e "${BLUE}📈 Generiere Test Coverage Report...${NC}" + if python3 -m pytest test/ --cov=app --cov-report=html -q >/dev/null 2>&1; then + echo -e "${GREEN}✅ Coverage Report: htmlcov/index.html${NC}" + else + echo -e "${YELLOW}⚠️ Coverage Report nicht verfügbar${NC}" + fi +fi + +exit $EXIT_CODE