How to create a new ctest test

Introduction

This document provides instruction for creating tests for use with The ctest Framework. To make an answer test, where results of a simulation can be run and compared from two versions of enzo-e, it is recommended to use The pytest Framework.

When adding a new function to the enzo-e project there is a possibility that it may affect the rest of the code, for this reason new code must be able to pass all existing tests as well as tests built for the new code. This means that integration tests are required. These tests are designed to stress the system. When making a new test these steps must be followed:

  • Create input parameters

  • Create a new test subdirectory

  • Integrate the test into test infrastructure

  • Running your new test

Create Input Parameters for the New Test.

Create a new subdirectory for the new tests in the input directory. Create new .in file that contains input parameters for testing the new feature. This should be a simple problem such as a 2D implosion problem (See enzo-e/input/Hydro/test_implosion.in). More details on how to set input parameters see Parameter files . As an example of a parameter file see load-balance-4.in in the enzo-e/input/Balance directory. This file will be used later on to set the parameters of the test in the running the test section

Integrating the Test into Test Infrastructure

To add a test to the ctest infrastructure, you have to add it to the test/CMakeLists.txt file. Several different options exit depending on the type of the test and how it is being run.

Direct Enzo-E tests with input file

For tests that only execute the enzo-e binary with a given parameter file and determine pass/fail by the exit code, you should use the setup_test_serial or setup_test_parallel function (in case the test should be run on more than one compute unit). Note that the number of compute units to run the parallel tests is set when the build is configured via the PARALLEL_LAUNCHER_NPROC option. Both functions take three arguments: (1) a short test name, (2) the output directory (i.e., the directory within the build/test folder where potential output from the test case is being stored), and (3) the input file. A sample test case may look like setup_test_parallel(Bound-Periodic-2D BoundaryConditions/Periodic-2D  input/Boundary/boundary_periodic-2d.in).

Enzo-E test with output being analyzed/processed by Python script

For tests that execute enzo-e but determine pass/fail by Python postprocessing, e.g., using yt. To add this kind of test use either the setup_test_serial_python or setup_test_parallel_python function. Again these functions have three mandatory arguments: (1) a short test name, (2) the output directory, and (3) the Python script to be called. Note that the Python script now includes the input file(s) that should be called and the exit code of the script is used to determine pass/fail of the entire test. Also note that these two function take additional arguments that are being passed to the Python script. A sample case is setup_test_serial_python(merge_stars_serial merge_stars/serial "input/merge_stars/run_merge_stars_test.py" "--prec=${PREC_STRING}"). We strongly encourage you to follow the overall structure used in the existing Python scripts when setting up a new test case.

Unit tests

Unit tests are self-contained test that are build as separate binaries. In order to add these kind of test use the setup_test_unit function. Again this function takes three arguments: (1) a short test name, (2) the output directory, and (3) the binary name to be called. A sample case is setup_test_unit(Array ArrayComponent/Array test_cello_array).

Note, several units test are currently commented out as there are linking issues. For more information, see GitHub issue #176.

Running Your New Test

In order to run your new test you can call it directly, e.g., through the name ctest -R my-short-test-name.

Note that in order for the test to show up in the build directory (if your build has already been configured), you need to reconfigure the build so that the new test case is being picked up.

To run all the tests use ctest in the build directory.