我想测量 OpenSSL 测试套件中不同测试的代码覆盖率。
我用这种方法成功测量了测试的总覆盖率:
$ make clean
$ export CC="gcc -fprofile-arcs -ftest-coverage"; ./config enable-unit-test
$ make
$ make tests
... then run gcov to create the .gcov files
(此后我可以对 OpenSSL 子文件夹中的 C 文件运行 gcov)
这是命令的结果make tests
:
https://github.com/istvanbohm/OpenSSLUnitTests/blob/master/TestResult
但我不能只执行一项特定测试(它们都不起作用):
$ make clean
$ export CC="gcc -fprofile-arcs -ftest-coverage"; ./config enable-unit-test
$ make
$ make TESTS="bntest" test
我从最后一个命令得到这个结果:
blackcat@ubuntu:~/my_project/projects/openssl-1.0.0$ make TESTS="bntest" test
testing...
make[1]: Entering directory `/home/blackcat/my_project/projects/openssl-1.0.0/test'
make[2]: Entering directory `/home/blackcat/my_project/projects/openssl-1.0.0'
making all in apps...
make[3]: Entering directory `/home/blackcat/my_project/projects/openssl-1.0.0/apps'
make[3]: Nothing to be done for `all'.
make[3]: Leaving directory `/home/blackcat/my_project/projects/openssl-1.0.0/apps'
make[2]: Leaving directory `/home/blackcat/my_project/projects/openssl-1.0.0'
make[1]: Leaving directory `/home/blackcat/my_project/projects/openssl-1.0.0/test'
OPENSSL_CONF=apps/openssl.cnf util/opensslwrap.sh version -a
OpenSSL 1.0.0 29 Mar 2010
built on: Wed Jul 29 12:40:53 CEST 2015
platform: linux-x86_64
options: bn(64,64) rc4(1x,char) des(idx,cisc,16,int) idea(int) blowfish(idx)
compiler: gcc -fprofile-arcs -ftest-coverage -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -m64 -DL_ENDIAN -DTERMIO -O3 -Wall -DMD32_REG_T=int -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DWHIRLPOOL_ASM
OPENSSLDIR: "/usr/local/ssl"
blackcat@ubuntu:~/my_project/projects/openssl-1.0.0$
我也尝试了其他测试,但结果是一样的。为什么?
我想这样做是因为我想将测试放入 for 循环中,并使用不同的测试一次又一次地调用它(这部分已准备好)。
答案1
我误解了 /test/Makefile 文件。一开始有一个列表,但它们不是我需要的参数名称。
BNTEST= bntest
ECTEST= ectest
ECDSATEST= ecdsatest
ECDHTEST= ecdhtest
EXPTEST= exptest
IDEATEST= ideatest
SHA1TEST= sha1test
SHA256TEST= sha256t
SHA512TEST= sha512t
MDC2TEST= mdc2test
RMDTEST= rmdtest
MD2TEST= md2test
MD4TEST= md4test
MD5TEST= md5test
HMACTEST= hmactest
WPTEST= wp_test
RC2TEST= rc2test
RC4TEST= rc4test
RC5TEST= rc5test
BFTEST= bftest
CASTTEST= casttest
DESTEST= destest
GOST2814789TEST=gost2814789test
RANDTEST= randtest
DHTEST= dhtest
DSATEST= dsatest
SSLTEST= ssltest
RSATEST= rsa_test
ENGINETEST= enginetest
EVPTEST= evp_test
EVPEXTRATEST=evp_extra_test
P5_CRPT2_TEST= p5_crpt2_test
IGETEST= igetest
JPAKETEST= jpaketest
SECMEMTEST= secmemtest
SRPTEST= srptest
V3NAMETEST= v3nametest
HEARTBEATTEST= heartbeat_test
CONSTTIMETEST= constant_time_test
VERIFYEXTRATEST= verify_extra_test
CLIENTHELLOTEST= clienthellotest
我应该更仔细地检查文件。特别是 alltests 标签。
alltests: \
test_des test_idea test_sha test_md4 test_md5 test_hmac \
test_md2 test_mdc2 test_wp \
test_rmd test_rc2 test_rc4 test_rc5 test_bf test_cast test_aes \
test_rand test_bn test_ec test_ecdsa test_ecdh \
test_enc test_x509 test_rsa test_crl test_sid \
test_gen test_req test_pkcs7 test_verify test_dh test_dsa \
test_ss test_ca test_engine test_evp test_ssl test_tsa test_ige \
test_jpake test_cms
我可以在这里找到测试的名称。所以正确的用法是这样的:
$ make clean
$ export CC="gcc -fprofile-arcs -ftest-coverage"; ./config enable-unit-test
$ make
$ make TESTS="test_cms" test
答案2
使用 command 执行所有测试时make test
,检查它STDOUT
是否打印测试套件名称,如下所示。
../test/recipes/90-test_srp.t ...................... ok
../test/recipes/90-test_sslapi.t ................... ok
../test/recipes/90-test_sslbuffers.t ............... ok
这里的测试套件名称是等test_srp
。test_sslapi
要仅运行特定的测试套件,请使用如下命令。
make TESTS="test_srp" test