[petsc-dev] Test harness upgrade
Scott Kruger
kruger at txcorp.com
Fri Feb 10 17:18:01 CST 2017
As promised, here is the pull request discussed earlier
(before close-of-business Central time!):
https://bitbucket.org/petsc/petsc/pull-requests/633
To illustrate the point here, I will use examples
from ksp/ksp/examples/tutorials/ex10.c
Consider this test block:
test:
suffix: 19
requires: datafilespath
args: -f0 ${DATAFILESPATH}/matrices/poisson1
args: -ksp_type cg -pc_type icc -pc_factor_levels 2
test:
test:
args: -mat_type seqsbaij
which has two subtests or children tests (feel free to rename).
This will generate a shell script runex19.sh that does something like:
mpiexec -n 1 ex19 ${args} > ex19.temp
petscdiff ex19.out ex19.tmp
mpiexec -n 1 ex19 ${args} -mat_type seqsbaij > ex19.temp
petscdiff ex19.out ex19.tmp
This works because the argument '-mat_type seqsbaij'
DOES NOT CHANGE THE OUTPUT enabling the same output_file
to be used. It also makes for a nice compact specification.
But what if arguments change the output file?
Putting suffix then triggers separate "tests" (defined as
separate shell scripts):
test:
requires: datafilespath
args: -f0 ${DATAFILESPATH}/matrices/medium
args: -ksp_type bicg
test:
suffix: 4
args: -pc_type lu
test:
suffix: 5
This will generate runex4.sh and runex5.sh that only
differ in the '-pc_type lu' in the arguments and in
the output file names.
One can quickly see that they are very similar tests,
and it's very compact in it's representation.
Now consider for loops:
test:
suffix: 7_d
requires: datafilespath
args: -f0 ${DATAFILESPATH}/matrices/medium
args: -viewer_binary_skip_info -mat_type seqbaij
args: -matload_block_size {{2 3 4 5 6 7 8}}
args: -ksp_type preonly -pc_type lu
This generates:
--------------------------------------
for matload_block_size in 2 3 4 5 6 7 8; do
petsc_testrun "${mpiexec} -n 1 ${exec} ${args} -matload_block_siz
e ${matload_block_size}" ex10_7_d.tmp ${testname}.err "${label}_matlo
ad_block_size-${matload_block_size}"
petsc_testrun "${diff_exe} /Users/kruger/ptsolveall/upstream/petsc
/src/ksp/ksp/examples/tutorials/output/ex10_7_d.out ex10_7_d.tmp" dif
f-${testname}.out diff-${testname}.out diff-${label}_matload_block_si
ze-${matload_block_size} ""
done
--------------------------------------
All 7 diff tests will be against the same file.
Here, I have the reporting being labelled with
the variable name and value to make it easy to
see what is being tested.
What if your for loop creates a different output?
In most of the petsc legacy tests this seemed to be
handled by appending it to one massive file and diffing
the whole thing. Keeping with the
1 shell script => 1 file
we want to have it labelled. Tobin proposed one
naming scheme that gives a lot of developer control,
but I moved to a more automated naming scheme (we'll
see if it is sufficient or not).
Here is an example. The key variable is
separate_testvars which says that the loop
variable should create separate tests.
test:
suffix: 19
requires: datafilespath
args: -f0 ${DATAFILESPATH}/matrices/poisson1
args: -ksp_type cg -pc_type icc
args: -pc_factor_levels {{0 2 4}}
separate_testvars: pc_factor_levels
test:
args:
test:
args: -mat_type seqsbaij
This will generate 3 shell scripts:
runex10_19_pc_factor_levels-0.sh
runex10_19_pc_factor_levels-2.sh
runex10_19_pc_factor_levels-4.sh
Each with a different output file being
tested against (but each shell script
invoking ex19 twice).
Between suffixes and separate_testvars,
it's easy to go nuts (even multiple loops
can make it get very verbose). Here is
an example from ex10:
test:
suffix: 7
requires: datafilespath
args: -f0 ${DATAFILESPATH}/matrices/medium
args: -viewer_binary_skip_info -mat_type seqbaij
args: -matload_block_size {{2 3 4 5 6 7 8}}
args: -ksp_max_it 100 -ksp_gmres_cgs_refinement_type refine_always
args: -ksp_rtol 1.0e-15 -ksp_monitor_short
separate_testvars: matload_block_size
test:
suffix: a
test:
suffix: b
args: -pc_factor_mat_ordering_type nd
test:
suffix: c
args: -pc_factor_levels 1
This creates 21 shell scripts:
runex10_7_matload_block_size-2_a.sh
runex10_7_matload_block_size-2_b.sh
runex10_7_matload_block_size-2_c.sh
runex10_7_matload_block_size-3_a.sh
...
ex10 is a good example because there were
63 runex10* targets in the makefile. After
conversion, we have 110 shell scripts being
generated coming from this separation of files
instead of concatenation.
The mumps examples are also interesting because
they exercise a lot of mumps and petsc options, but they
are all diffed against the same file. This uses
the output_file parameter to enable specification
of this same output_file.
Other misc:
testparse.py gives better much better error reporting
although I highly recommend invoking it directly
during development to catch errors. It saved me
a bunch of time while converting ex10.c.
gmakegentest.py is cleaner. Many thanks to
Tobin for help in this.
--
Tech-X Corporation kruger at txcorp.com
5621 Arapahoe Ave, Suite A Phone: (720) 974-1841
Boulder, CO 80303 Fax: (303) 448-7756
More information about the petsc-dev
mailing list