Files
query-orchestration/testing.md
T
Jay Brown 2ff6e05ffc Merged in feature/permit-integration-1 (pull request #172)
Permit integration - part 1

* WIP permit integration

* slim down build

* Merge branch 'main' of bitbucket.org:aarete/query-orchestration into feature/permit-integration-1

* omit swagger from auth

* clean build

* comment

* part 1 completed

this is the initial permitio parts and tests without integration. Also testing.md since we have a new test target `task test:permitio`

* feature flag for no jwt validation

* permit integration

* fix ci unit tests

* ci fix

* build fix

* fix home handler

* fix redirect

* test fix

* update docs for auth
2025-07-11 19:27:14 +00:00

7.6 KiB

Testing Documentation

This document describes all available test targets in the Task build system and their specific purposes.

Primary Test Suites

task test:functional

Default comprehensive test suite with intelligent incremental testing

  • Purpose: Main test runner that adapts behavior based on context
  • Unique Features:
    • Incremental Mode (default): Only tests packages affected by changes since origin/main
    • Coverage Merging: Maintains cumulative coverage across incremental runs
    • Full Fallback: Automatically runs full suite if no baseline exists or git branch issues
  • Coverage: 80% total threshold, 60% function threshold
  • Parallelism: Minimal settings to avoid resource contention (GOMAXPROCS=2, -p 1, -parallel 2)
  • Use Case: Development workflow, pre-commit checks

task test:functional:full

Complete test suite with coverage reset

  • Purpose: Run all tests from scratch, ignoring previous coverage
  • Unique Features:
    • Deletes existing coverage file before running
    • Forces full test execution regardless of git changes
  • Use Case: Clean slate testing, debugging coverage issues, release validation

task fullsuite:ci

CI/CD optimized complete workflow

  • Purpose: Full build, lint, and test pipeline for continuous integration
  • Unique Features:
    • Forces INCREMENTAL=false to ensure all tests run
    • Includes generation, building, linting, and testing
    • No shortcuts or incremental optimizations
  • Use Case: CI/CD pipelines, release builds, comprehensive validation

Specialized Test Types

task test:race

Race condition detection

  • Purpose: Detect data races and concurrency issues
  • Unique Features: Uses Go's -race flag to detect race conditions
  • Use Case: Debugging concurrency issues, ensuring thread safety

task test:unit:short

Fast unit tests only

  • Purpose: Quick feedback loop for development
  • Unique Features:
    • Uses -short flag to skip long-running tests
    • Focuses on ./internal/... and ./api/... packages only
    • Generates mocks automatically before running
  • Use Case: Rapid development feedback, pre-commit quick checks

task test:permitio

Permit.io integration tests

  • Purpose: Run tests that require local Permit.io PDP service
  • Unique Features:
    • Uses -tags=permitio to include only tagged integration tests
    • Requires PERMIT_IO_API_KEY environment variable
    • Requires local PDP running on port 7766
    • Provides clear error messages about requirements
  • Use Case: Testing authorization integration, local development with full Permit.io stack

task test:bench

Benchmark testing

  • Purpose: Performance testing and optimization
  • Unique Features:
    • Runs only benchmark functions (-run ^Benchmark)
    • Uses benchstat for statistical analysis of results
    • Outputs performance metrics to out/bench.out
  • Use Case: Performance optimization, regression testing for speed

Performance Analysis

task test:perf

Performance profiling and slowest test identification

  • Purpose: Identify performance bottlenecks in the test suite
  • Unique Features:
    • Reports top 5 slowest packages
    • Reports top 5 slowest individual tests
    • Deep-dives into slowest package for detailed analysis
    • Uses JSON output for precise timing analysis
  • Use Case: Test suite optimization, CI performance tuning

task test:mem

Memory usage analysis

  • Purpose: Monitor memory consumption across test packages
  • Unique Features:
    • Runs tests with memory profiling for each package
    • Ranks packages by memory usage (top 5)
    • Provides total memory consumption summary
    • Individual timeout protection (120s per package)
  • Use Case: Memory optimization, resource planning, leak detection

task test:timeline

Visual test execution timeline

  • Purpose: Visualize test execution flow and timing
  • Unique Features:
    • Uses JSON output piped to visual timeline generator
    • Shows parallel execution patterns
    • Helps identify bottlenecks and optimization opportunities
  • Use Case: Understanding test execution patterns, optimization planning

Test Infrastructure

task test:mocks:generate

Mock generation for testing

  • Purpose: Generate test mocks from interfaces
  • Unique Features:
    • Uses mockery tool to auto-generate mocks
    • Clears existing mocks before regeneration
    • Runs only once per task execution cycle
  • Use Case: Maintaining test isolation, dependency mocking

task test:wait

Test environment preparation

  • Purpose: Ensure clean test environment before running tests
  • Unique Features:
    • Waits for testcontainers cleanup (Ryuk containers)
    • Prunes Docker containers and volumes
    • Prevents resource conflicts between test runs
  • Use Case: Test environment hygiene, CI stability

task test:prune

Docker resource cleanup

  • Purpose: Clean up Docker resources left by tests
  • Unique Features:
    • Force removes unused containers and volumes
    • Prevents disk space issues from accumulated test artifacts
  • Use Case: Resource management, CI environment maintenance

Visualization and Analysis

task test:graph

Resource usage visualization during testing

  • Purpose: Monitor system resources during test execution
  • Unique Features:
    • Uses psrecord to track CPU/memory during test:functional
    • Generates visual plots of resource usage
    • Includes child processes in monitoring
  • Use Case: Performance analysis, resource optimization

task fullsuite:graph

Complete build and test resource monitoring

  • Purpose: Monitor resources during entire build and test cycle
  • Unique Features: Same as test:graph but for the complete fullsuite workflow
  • Use Case: End-to-end performance analysis, CI optimization

Test Execution Patterns

Incremental Testing Logic

The test:functional target implements sophisticated incremental testing:

  1. Full Mode Triggers:

    • INCREMENTAL=false explicitly set
    • No existing coverage file found
    • Cannot find origin/main branch reference
  2. Incremental Mode:

    • Compares against origin/main branch
    • Only tests packages with changed Go files
    • Merges coverage with existing baseline
    • Skips testing if no Go files changed
  3. Coverage Merging:

    • Preserves existing coverage for unchanged packages
    • Adds new coverage for changed packages
    • Maintains comprehensive coverage metrics

Parallelism Settings

All test targets use conservative parallelism to avoid resource contention:

  • GOMAXPROCS: 2 (fixed minimal value)
  • Package Parallelism: 1 (single package at a time)
  • Test Parallelism: 2 (minimal test parallelism)

This ensures stable execution in resource-constrained environments like CI.

Usage Recommendations

  • Development: Use task test:functional for normal development workflow
  • Pre-commit: Use task test:unit:short for quick feedback
  • CI/CD: Use task fullsuite:ci for comprehensive validation
  • Performance: Use task test:perf and task test:mem for optimization
  • Debugging: Use task test:race for concurrency issues
  • Clean Slate: Use task test:functional:full when coverage gets corrupted
  • Permit.io Integration: Use task test:permitio for testing authorization features with local PDP

Integration with Build Tags

Some tests may use build tags to control execution:

  • Tests requiring external services (like Permit.io PDP) may be tagged
  • Use -tags=tagname with go test commands to include tagged tests
  • CI typically excludes integration tests that require external dependencies