Testing of gpaw is done by a nightly test suite consisting of many small and quick tests and by a weekly set of larger test.
“Quick” test suite¶
It’s not really quick - it will take almost an hour to run all the tests!
$ pytest -v -n <number-of-processes>
The test suite consists of a large number of small and quick tests found in the gpaw/test/ directory. The tests run nightly in serial and in parallel.
In order to run the tests in parallel, do this:
$ mpiexec -n <number-of-processes> pytest -v
Please report errors to the
gpaw-users mailing list so that we
can fix them (see Mail List).
Special fixtures and marks¶
Tests that should only run in serial can be marked like this:
import pytest @pytest.mark.serial def test_something(): ...
There are two special GPAW-fixtures:
Run test in a temporary directory.
Returns a dict mapping names to paths to gpw-files. If you want to reuse gpw-files from an earlier pytest session then set the
$GPW_TEST_FILESenvironment variable and the files will be written to that folder.
def test_something(gpw_files): calc = GPAW(gpw_files['h2_lcao_wfs']) ...
Possible systems are:
Bulk BCC-Li with 3x3x3 k-points:
H2 molecule (not centered):
Spin-polarized H atom:
Polyethylene chain. One unit, 3 k-points, no symmetry:
c2h4_pw_nosym. Three units:
Files with wave functions are also availabel (add
_wfsto the names).
Check the conftest.py to see which gpw-files are available.
_wfs postfix to get a gpw-file that contains the wave functions.
Adding new tests¶
A test script should fulfill a number of requirements:
It should be quick. Preferably not more than a few milliseconds. If the test takes several minutes or more, consider making the test a big test.
It should not depend on other scripts.
It should be possible to run it on 1, 2, 4, and 8 cores.
A test can produce standard output and files - it doesn’t have to
clean up. Just add the
in_tmp_dir fixture as an argument:
def test_something(in_tmp_dir): # make a mess ...
Here is a parametrized test that uses
comparing floating point numbers:
import pytest @pytest.mark.parametrize('x', [1.0, 1.5, 2.0]) def test_sqr(x): assert x**2 == pytest.approx(x * x)
The directory in gpaw/test/big/ contains a set of longer and more realistic tests that we run every weekend. These are submitted to a queueing system of a large computer.
Adding new tests¶
To add a new test, create a script somewhere in the file hierarchy ending with
submit.agts.py or just
AGTS is short
for Advanced GPAW Test System (or Another Great Time Sink). This script
defines how a number of scripts should be submitted to niflheim and how they
depend on each other. Consider an example where one script,
calculates something and saves a
.gpw file and another script,
analyse.py, analyses this output. Then the submit script should look
def create_tasks(): from myqueue.task import task return [task('calculate.py', cores=8, tmax='25m'), task('analyse.py', cores=1, tmax='5m', deps=['calculate.py'])]