Testing your Package¶
Mason provides the functionality to test packages through the mason test
subcommand. There are two styles of writing mason tests:
Tests that utilize the
UnitTest
module to determine pass/fail statusTests that rely on the exit code to determine pass/fail status
Here is an example of a UnitTest
-based test:
use UnitTest;
config const testParam: bool = true;
proc myTest(test: borrowed Test) throws{
test.assertTrue(testParam);
}
UnitTest.main();
Mason testing that uses UnitTest
will treat each individual function as a
test, and the test will be considered successful if no assertions failed and no
halts were reached within the function body.
See the UnitTest
documentation to learn more about writing unit tests in
Chapel.
Here is an example of an exit-code-based tests:
config const testParam: bool = true;
if testParam {
writeln("Test Passed!");
}
else {
exit(1);
}
Mason testing that relies on exit code tests each file as a test, and the test will be considered successful if the program compiled and exited with an exit code of 0.
These tests should be configured such that a failure produces an exit code other than 0.
Returning a non-zero exit code can be accomplished by calling exit()
or
throwing an uncaught error.
Both exit-code and UnitTest
style tests can be used within a single mason
package.
After adding our test, the package structure will be as follows:
MyPackage/
│
├── Mason.lock
├── Mason.toml
├── example/
├── src/
│ └── myPackage.chpl
├── target/
│ ├── debug/
│ │ └── myPackage/
│ ├── example/
│ ├── release/
│ │ └── myPackage
│ └── test/
└── test/
└── myPackageTest.chpl
Use mason test
to run the test(s). If tests are not explicitly
specified in Mason.toml
, Mason will gather all the tests found in test/
,
compile them with the dependencies listed in your Mason.toml
and run them
producing the following output:
--- Results ---
Test: myPackageTest Passed
--- Summary: 1 tests run ---
-----> 1 Passed
-----> 0 Failed
Specific tests can be run by listing their names or substrings of their names as command line arguments:
# Run these specific tests:
mason test test/test1.chpl test/test2.chpl
# Run any test file with 'test1' or 'test2' in the name
mason test test1 test2
# Run any test file with the '1' in the name
mason test 1
Specifying tests to run in the command line ignores the list of tests in Mason.toml, and searches all files in test/.
Additional output can be displayed by throwing the --show flag
.
Note
mason test
can also be used outside of a mason package as a
UnitTest
test runner. See UnitTest
for more information.
Tests can be listed in the Mason.toml
as a TOML array of strings for the
tests
field:
[brick]
chplVersion = "1.18.0"
license = "None"
name = "myPackage"
tests = ["test1.chpl",
"test2.chpl",
"test3.chpl"]
version = "0.1.0"
A user may also set the CHPL_COMM
value for running the tests, e.g. none
, gasnet
, ugni
using mason test --setComm
.