chore: Add pytest configuration and update CI to skip DeepFace during tests
Some checks failed
CI / skip-ci-check (push) Successful in 1m27s
CI / lint-and-type-check (push) Has been cancelled
CI / python-lint (push) Has been cancelled
CI / test-backend (push) Has been cancelled
CI / build (push) Has been cancelled
CI / secret-scanning (push) Has been cancelled
CI / dependency-scan (push) Has been cancelled
CI / sast-scan (push) Has been cancelled
CI / workflow-summary (push) Has been cancelled
CI / skip-ci-check (pull_request) Successful in 1m27s
CI / lint-and-type-check (pull_request) Successful in 2m6s
CI / python-lint (pull_request) Successful in 1m54s
CI / test-backend (pull_request) Successful in 3m39s
CI / build (pull_request) Successful in 2m24s
CI / secret-scanning (pull_request) Successful in 1m40s
CI / dependency-scan (pull_request) Successful in 1m33s
CI / sast-scan (pull_request) Successful in 2m47s
CI / workflow-summary (pull_request) Successful in 1m26s

This commit introduces a new `pytest.ini` configuration file for backend tests, specifying test discovery patterns and output options. Additionally, the CI workflow is updated to set an environment variable that prevents DeepFace and TensorFlow from loading during tests, avoiding illegal instruction errors on certain CPUs. The face service and pose detection modules are modified to conditionally import DeepFace and RetinaFace based on this environment variable, enhancing test reliability. These changes improve the testing setup and contribute to a more robust CI process.
This commit is contained in:
Tanya 2026-01-07 15:02:41 -05:00
parent 77ffbdcc50
commit 364974141d
5 changed files with 53 additions and 8 deletions

View File

@ -374,7 +374,9 @@ jobs:
- name: Run backend tests
run: |
export PYTHONPATH=$(pwd)
export SKIP_DEEPFACE_IN_TESTS=1
echo "🧪 Running all backend API tests..."
echo "⚠️ DeepFace/TensorFlow disabled in tests to avoid CPU instruction errors"
python -m pytest tests/ -v --tb=short --cov=backend --cov-report=term-missing --cov-report=xml --junit-xml=test-results.xml || true
continue-on-error: true

View File

@ -14,11 +14,17 @@ from PIL import Image
from sqlalchemy.orm import Session, joinedload
from sqlalchemy import and_, func, case
try:
from deepface import DeepFace
DEEPFACE_AVAILABLE = True
except ImportError:
# Skip DeepFace import during tests to avoid illegal instruction errors
if os.getenv("SKIP_DEEPFACE_IN_TESTS") == "1":
DEEPFACE_AVAILABLE = False
DeepFace = None
else:
try:
from deepface import DeepFace
DEEPFACE_AVAILABLE = True
except ImportError:
DEEPFACE_AVAILABLE = False
DeepFace = None
from backend.config import (
CONFIDENCE_CALIBRATION_METHOD,

27
pytest.ini Normal file
View File

@ -0,0 +1,27 @@
[pytest]
# Pytest configuration for PunimTag backend tests
# Test discovery patterns
python_files = test_*.py
python_classes = Test*
python_functions = test_*
# Test paths
testpaths = tests
# Output options
addopts =
-v
--strict-markers
--tb=short
--disable-warnings
# Markers
markers =
slow: marks tests as slow (dummy marker for future use)
integration: marks tests as integration tests (dummy marker for future use)
# Environment variables set before test collection
# SKIP_DEEPFACE_IN_TESTS is set in conftest.py to prevent DeepFace/TensorFlow
# from loading during tests (avoids illegal instruction errors on some CPUs)

View File

@ -1,15 +1,21 @@
"""Face pose detection (yaw, pitch, roll) using RetinaFace landmarks"""
import os
import numpy as np
from math import atan2, degrees
from typing import Dict, Tuple, Optional, List
try:
from retinaface import RetinaFace
RETINAFACE_AVAILABLE = True
except ImportError:
# Skip RetinaFace import during tests to avoid illegal instruction errors
if os.getenv("SKIP_DEEPFACE_IN_TESTS") == "1":
RETINAFACE_AVAILABLE = False
RetinaFace = None
else:
try:
from retinaface import RetinaFace
RETINAFACE_AVAILABLE = True
except ImportError:
RETINAFACE_AVAILABLE = False
RetinaFace = None
class PoseDetector:

View File

@ -10,6 +10,10 @@ from fastapi.testclient import TestClient
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, Session
# Prevent DeepFace/TensorFlow from loading during tests (causes illegal instruction on some CPUs)
# Set environment variable BEFORE any backend imports that might trigger DeepFace/TensorFlow
os.environ["SKIP_DEEPFACE_IN_TESTS"] = "1"
from backend.app import create_app
from backend.db.base import Base
from backend.db.session import get_db