EvoEngine uses CTest for local test execution. The test suite includes C++ unit tests, render/GPU tests, Python-driven render capture tests, app smoke tests, and Windows launcher smoke tests.
The default Windows Scripts/test.py tree is out/build/vs2026-x64-tests, separate from the application preset's
out/build/vs2026-x64. The script configures with BUILD_TESTING=ON; a fresh plain app installation configures it off.
To use the application tree, first run python Scripts/build_project.py and build the required test targets, then select
it explicitly. Direct CTest commands below assume that test-enabled application tree already exists.
CPU/source tests still need the native toolchain; GPU cases need their Vulkan features. Python capture tests also need the CMake-selected Python ABI and deployed module dependencies. See building for setup.
Local render/GPU tests:
python Scripts\test.pyAll CTest tests:
python Scripts\test.py --allScripts\test.py configures test builds with a local install prefix under out\install\<build-dir-name> unless
--cmake-arg -DCMAKE_INSTALL_PREFIX=... is provided. This keeps runtime package post-build deploy steps out of system
locations such as Program Files.
List tests:
python Scripts\test.py --listListing still configures and builds by default. To inspect an already built tree without either step:
python Scripts/test.py --build-dir out/build/vs2026-x64 --all --list --no-configure --no-buildFor CPU/source tests, use --exclude-render. Use --label <regex> or repeated --ctest-arg options for a focused run.
When filtering, keep prerequisite builds enabled unless the chosen test executables are already current.
Run CTest directly:
ctest --test-dir out/build/vs2026-x64 -C RelWithDebInfo --output-on-failureRun focused launcher tests:
ctest --test-dir out/build/vs2026-x64 -C RelWithDebInfo -R "Launcher" --output-on-failurepython Scripts/test.py defaults to render/GPU-labeled tests. It builds the EvoEngine_RenderTests aggregate target and runs tests such as:
- Rendering demo rasterization golden-image comparison
- Rendering demo RTX path-tracing golden-image comparison at 1280x720, 2048 SPP, and 3 bounces
- Rendering demo RayQuery golden-image comparison at 1280x720, 2048 SPP, and 3 bounces
- Python render capture workflows
- launcher/editor smoke coverage for project startup and the Rendering demo profile
The two ray-camera goldens accumulate 8 samples per frame for 256 frames. Requested ray backends must be available; the tests reject normal camera fallback so a raster image cannot be accepted as a ray baseline.
Visual artifacts are written under:
out/test-artifacts/latest/
Render comparisons report PSNR and SSIM when applicable.
GitHub Actions run repository-wide format checks and platform compilation checks. Rendering tests are intentionally local-only because they require a Vulkan-capable GPU environment and produce visual artifacts for inspection.
The formatting workflow also runs Python runtime-boundary fixtures. Run tooling-only regressions with
python -m unittest discover -s Scripts/tests; these are separate from CTest and include export/template/installer checks.
Baseline acceptance rewrites golden files; use it only for an intentional, inspected change and rerun without acceptance.
Source checks, unavailable/skipped GPU tests and finite-output smoke captures do not establish image-quality acceptance.
Cheap unit tests should stay isolated as normal CTest/GTest cases. GUI and process smoke tests can group multiple named subtests inside one launched process when the checks share a lifecycle and can report clear per-step failures. Process-boundary tests should remain separate when their purpose is to verify startup, shutdown, or child process behavior.