cpp-unit-testing
Instructions for creating unit tests for Axom
Source facts
- Repository
- llnl/axom
- Last source activity
- July 20, 2026 at 21:37
- Detected SKILL.md language
- English
- Stars
- 197
- Forks
- 37
Install options
The review-first prompt is selected by default. You can switch to a direct command or download a local copy.
Review the source files
Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.
Showing SKILL.md
SKILL.md
Source instructions · Read-only preview- name
- cpp-unit-testing
- description
- Instructions for creating unit tests for Axom
This repo’s unit tests:
- Use GoogleTest (`TEST`, `TEST_F`, etc.).
- Live close to the code they cover in a `tests/` subdirectory.
- Are registered with CTest via the CMake macro `axom_add_test(...)`.
## Where tests go
Place unit tests next to the component they cover:
- `src/axom/<component>/tests/` (recommended for library code)
- `src/thirdparty/tests/` (third-party smoke tests)
Each `tests/` directory should contain:
- One or more `*.cpp` test files
- A `CMakeLists.txt` that builds test executables with `axom_add_executable` and registers them with `axom_add_test`
Also ensure the parent component adds the tests subdirectory when tests are enabled:
```cmake
if(AXOM_ENABLE_TESTS)
add_subdirectory(tests)
endif()
```
## Writing GoogleTest unit tests
- Include GoogleTest: `#include <gtest/gtest.h>`
- Prefer fast, deterministic, CPU-only tests by default.
- Use fixtures (`TEST_F`) when setup/teardown is shared.
- Avoid depending on external files unless the test is explicitly a data-driven/integration test.
## Registering tests with `axom_add_test`
Axom tests typically create one test executable per source file with `axom_add_executable`, then register it with CTest using `axom_add_test`.
The executable name usually appends `_test`; the CTest name usually omits that suffix.
Minimal `tests/CMakeLists.txt` template:
```cmake
set(my_component_test_depends
my_component
gtest)
set(my_component_test_sources
feature_a.cpp
feature_b.cpp)
foreach(test ${my_component_test_sources})
get_filename_component(test_name ${test} NAME_WE)
axom_add_executable(NAME ${test_name}_test
SOURCES ${test}
OUTPUT_DIR ${TEST_OUTPUT_DIRECTORY}
DEPENDS_ON ${my_component_test_depends}
FOLDER axom/my_component/tests)
axom_add_test(NAME ${test_name}
COMMAND ${test_name}_test)
endforeach()
```
Notes:
- Keep test source basenames unique across the project (CMake targets are global).
- Add only the libraries you need to `DEPENDS_ON` (the library under test + `gtest` + any required Axom/TPL targets).
### MPI / OpenMP tests
If a test requires MPI, add the MPI dependency and set `NUM_MPI_TASKS`:
```cmake
axom_add_executable(NAME my_parallel_test
SOURCES my_parallel_test.cpp
OUTPUT_DIR ${TEST_OUTPUT_DIRECTORY}
DEPENDS_ON gtest blt::mpi my_component
FOLDER axom/my_component/tests)
axom_add_test(NAME my_parallel
COMMAND my_parallel_test
NUM_MPI_TASKS 4)
```
If a test requires OpenMP, set `NUM_OMP_THREADS` accordingly.
### GPU-enabled unit tests
If you need a CUDA- or HIP-enabled unit test, gate it behind the matching Axom option and add the matching BLT GPU dependency:
- CUDA: `AXOM_ENABLE_CUDA` with `blt::cuda` for CUDA-compiled sources, or the CUDA runtime target when only runtime API linkage is needed.
- HIP: `AXOM_ENABLE_HIP` with `blt::hip`.
```cmake
if(AXOM_ENABLE_HIP)
axom_add_executable(NAME my_hip_test
SOURCES my_hip_test.cpp
OUTPUT_DIR ${TEST_OUTPUT_DIRECTORY}
DEPENDS_ON gtest blt::hip my_component
FOLDER axom/my_component/tests)
axom_add_test(NAME my_hip
COMMAND my_hip_test)
endif()
```
Use the same shape for CUDA tests:
```cmake
if(AXOM_ENABLE_CUDA)
axom_add_executable(NAME my_cuda_test
SOURCES my_cuda_test.cpp
OUTPUT_DIR ${TEST_OUTPUT_DIRECTORY}
DEPENDS_ON gtest blt::cuda my_component
FOLDER axom/my_component/tests)
axom_add_test(NAME my_cuda
COMMAND my_cuda_test)
endif()
```
For tests that are always built but need GPU linkage in GPU builds, append the dependency conditionally before creating the target:
```cmake
set(my_component_test_depends
my_component
gtest)
blt_list_append(TO my_component_test_depends ELEMENTS blt::cuda IF AXOM_ENABLE_CUDA)
blt_list_append(TO my_component_test_depends ELEMENTS blt::hip IF AXOM_ENABLE_HIP)
```
Use the repository's existing local convention when modifying an existing `CMakeLists.txt`: some test directories use `ENABLE_HIP` for build-configuration workarounds such as `axom_force_release_for_target(...)`, while dependency lists commonly use `AXOM_ENABLE_HIP`.
## Running tests
- Configure with tests enabled: `-DENABLE_TESTS=ON -DAXOM_ENABLE_TESTS=ON`
- Run all tests: `ctest`
- Run a single test by name: `ctest -R test_state_manager`
## Examples in this repo
- Macro definition: `src/cmake/AxomMacros.cmake`
- Typical component tests: `src/axom/inlet/tests/CMakeLists.txt`
- Third-party smoke tests: `src/thirdparty/tests/CMakeLists.txt`
View on GitHub