[GCOV] Unit testing of shared libraries with code coverage
-
wrote on 12 Feb 2014, 11:56 last edited by
Hi!
My library looks like the following:
@lib1
lib1.pro
code
class1.h
class1.cpp
code.pro
test
test_class1.cpp
test.pro@The subproject code.pro creates a shared library.
The subproject test.pro creates an application with unit tests.Compiler and linker options for code coverage:
@QMAKE_CXXFLAGS += -fprofile-arcs -ftest-coverage
QMAKE_LDFLAGS +=-fprofile-arcs -ftest-coverage
LIBS += -lgcov@After that the .gcno files will be created in $${OBJECTS_DIR} directory.
After executing the application with unit tests, the .gcda files will be created in $${OBJECTS_DIR} directory.THE PROBLEM:
After executing the following command I get some errors:
@lcov --capture --directory $${OBJECTS_DIR} --output-file coverage_all.info@The files in subdirectory test will be found:
@Processing obj/test_class1.gcda@The files in subdirectory code will not be found:
@Processing obj/class1.gcda
class1.cpp:cannot open source file@The problem is, that the files in class1.h and class1.cpp were built in a different directory.
It does not help if I specify the test directory as --base-directory in lcov.Solution with include
I found a solution but I am not very happy about it:- create code.pri in code subdirectory
- include code.pri in test .pro: #include(../code/code.pri)
- compile class1.h and class1.cpp directly from test subproject.
Solution with shared libraries
I am looking for such a solution. It means, that the application test would use the shared library created by code subproject. Do you think is it realistic? Do you think is it a better solution as the first one? Do you have any other suggestion?Thank you!
-
wrote on 18 Feb 2014, 13:58 last edited by
To get coverage with gcov for a shared library the following steps are necessary:
- Create two different output directories in subprojects code and test for the files .o, .gcno, .gcda:
@lib1/code/bin/obj/
lib1/test/bin/obj/@- Create a configuration file for lcov in your home directory (linux) with the following content (for more details see man lcovrc):
@
geninfo_adjust_src_path = /code/bin/obj => /code
geninfo_adjust_src_path = /test/bin/obj => /test
@-
Build the executable. (It creates .gcno files.)
-
Set LD_LIBRARY_PATH to the shared libraries.
-
Run the executable. (It creates .gcda files.)
-
Run lcov:
@lcov --capture --directory path_to_lib1 --output-file coverage_all.info@ -
Run genhtml:
@genhtml coverage_all.info -o output_path@
1/2