This PR implements the idea suggested in #1734#pullrequestreview-3284918572 and is based on the work from https://github.com/bitcoin/bitcoin/pull/33483.
Here is an example of the ctest output:
$ ctest --test-dir build -j $(nproc)
Test project /home/hebasto/dev/secp256k1/secp256k1/build
Start 1: secp256k1.noverify_tests.selftest_tests
Start 2: secp256k1.noverify_tests.all_proper_context_tests
Start 3: secp256k1.noverify_tests.all_static_context_tests
Start 4: secp256k1.noverify_tests.deprecated_context_flags_test
<snip>
193/196 Test [#31](/bitcoin-core-secp256k1/31/): secp256k1.noverify_tests.ecmult_constants ......................... Passed 5.32 sec
194/196 Test [#184](/bitcoin-core-secp256k1/184/): secp256k1.tests.ellswift_xdh_correctness_tests .................... Passed 5.62 sec
195/196 Test [#191](/bitcoin-core-secp256k1/191/): secp256k1.exhaustive_tests ........................................ Passed 6.97 sec
196/196 Test [#126](/bitcoin-core-secp256k1/126/): secp256k1.tests.ecmult_constants .................................. Passed 9.60 sec
100% tests passed, 0 tests failed out of 196
Label Time Summary:
secp256k1_example = 0.02 sec*proc (5 tests)
secp256k1_exhaustive = 6.97 sec*proc (1 test)
secp256k1_noverify_tests = 23.77 sec*proc (95 tests)
secp256k1_tests = 43.67 sec*proc (95 tests)
Total Test time (real) = 10.21 sec
For comparison, here is the output for the master branch on the same machine:
$ ctest --test-dir build -j $(nproc)
Test project /home/hebasto/dev/secp256k1/secp256k1/build
Start 1: secp256k1_noverify_tests
Start 2: secp256k1_tests
Start 3: secp256k1_exhaustive_tests
Start 4: secp256k1_ecdsa_example
Start 5: secp256k1_ecdh_example
Start 6: secp256k1_schnorr_example
Start 7: secp256k1_ellswift_example
Start 8: secp256k1_musig_example
1/8 Test [#4](/bitcoin-core-secp256k1/4/): secp256k1_ecdsa_example .......... Passed 0.00 sec
2/8 Test [#5](/bitcoin-core-secp256k1/5/): secp256k1_ecdh_example ........... Passed 0.00 sec
3/8 Test [#6](/bitcoin-core-secp256k1/6/): secp256k1_schnorr_example ........ Passed 0.00 sec
4/8 Test [#7](/bitcoin-core-secp256k1/7/): secp256k1_ellswift_example ....... Passed 0.00 sec
5/8 Test [#8](/bitcoin-core-secp256k1/8/): secp256k1_musig_example .......... Passed 0.00 sec
6/8 Test [#3](/bitcoin-core-secp256k1/3/): secp256k1_exhaustive_tests ....... Passed 6.26 sec
7/8 Test [#1](/bitcoin-core-secp256k1/1/): secp256k1_noverify_tests ......... Passed 14.31 sec
8/8 Test [#2](/bitcoin-core-secp256k1/2/): secp256k1_tests .................. Passed 31.65 sec
100% tests passed, 0 tests failed out of 8
Total Test time (real) = 31.65 sec
New Feature: As the number of tests has grown, the labels have been introduced to simplify test management. Now, one can run:
$ ctest --test-dir build -j $(nproc) -L example
Test project /home/hebasto/dev/secp256k1/secp256k1/build
Start 192: secp256k1.example.ecdsa
Start 193: secp256k1.example.ecdh
Start 194: secp256k1.example.schnorr
Start 195: secp256k1.example.ellswift
Start 196: secp256k1.example.musig
1/5 Test [#192](/bitcoin-core-secp256k1/192/): secp256k1.example.ecdsa .......... Passed 0.00 sec
2/5 Test [#193](/bitcoin-core-secp256k1/193/): secp256k1.example.ecdh ........... Passed 0.00 sec
3/5 Test [#194](/bitcoin-core-secp256k1/194/): secp256k1.example.schnorr ........ Passed 0.00 sec
4/5 Test [#195](/bitcoin-core-secp256k1/195/): secp256k1.example.ellswift ....... Passed 0.00 sec
5/5 Test [#196](/bitcoin-core-secp256k1/196/): secp256k1.example.musig .......... Passed 0.00 sec
100% tests passed, 0 tests failed out of 5
Label Time Summary:
secp256k1_example = 0.01 sec*proc (5 tests)
Total Test time (real) = 0.01 sec
or
$ ctest --test-dir build -j $(nproc) -LE tests
Test project /home/hebasto/dev/secp256k1/secp256k1/build
Start 192: secp256k1.example.ecdsa
Start 193: secp256k1.example.ecdh
Start 194: secp256k1.example.schnorr
Start 195: secp256k1.example.ellswift
Start 196: secp256k1.example.musig
Start 191: secp256k1.exhaustive_tests
1/6 Test [#192](/bitcoin-core-secp256k1/192/): secp256k1.example.ecdsa .......... Passed 0.00 sec
2/6 Test [#193](/bitcoin-core-secp256k1/193/): secp256k1.example.ecdh ........... Passed 0.00 sec
3/6 Test [#194](/bitcoin-core-secp256k1/194/): secp256k1.example.schnorr ........ Passed 0.00 sec
4/6 Test [#195](/bitcoin-core-secp256k1/195/): secp256k1.example.ellswift ....... Passed 0.00 sec
5/6 Test [#196](/bitcoin-core-secp256k1/196/): secp256k1.example.musig .......... Passed 0.00 sec
6/6 Test [#191](/bitcoin-core-secp256k1/191/): secp256k1.exhaustive_tests ....... Passed 6.19 sec
100% tests passed, 0 tests failed out of 6
Label Time Summary:
secp256k1_example = 0.01 sec*proc (5 tests)
secp256k1_exhaustive = 6.19 sec*proc (1 test)
Total Test time (real) = 6.20 sec