Покрытие кода нескольких файлов с использованием Gcovr - PullRequest
0 голосов
/ 24 декабря 2018

я новичок в gcovr.В моем коде есть 3 файла, а именно main.cpp, math.cpp и math.hpp. Я скомпилировал его с помощью g ++ с помощью следующей команды

g++ -fprofile-arcs -ftest-coverage -fPIC -O0 main.cpp  math.cpp math.hpp -o math

мой код скомпилирован и успешно выполнен.когда я запускаю следующую команду для покрытия кода

 gcovr -r .

, она выдает такой вывод:

------------------------------------------------------------------------------
                       GCC Code Coverage Report
Directory: .
------------------------------------------------------------------------------
File                                       Lines    Exec  Cover   Missing
------------------------------------------------------------------------------
main.cpp                                       6       6   100%
------------------------------------------------------------------------------
TOTAL                                          6       6   100%
------------------------------------------------------------------------------ 

Показывает только покрытие кода main.cpp.Я хочу знать покрытие кода других файлов тоже. Как я могу получить это?Пожалуйста, помогите мне, если можете. Спасибо заранее.

Вот мой код main.cpp

#include "math.hpp"
int main( int argc, char **argv)
{
    Math m;
    m.Multiply(20, 50);
    m.Divide(40, 5);
}

Math.cpp

#include "math.hpp"

using namespace std;
int Math::Multiply(int Num1, int Num2){
    Mul= Num1 * Num2;
    std::cout << "Multiplication of "<<Num1<< " * " <<Num2<< " = "<< Mul<<endl;
    return Mul;
}

int Math::Divide(int Num1, int Num2){
    Div = Num1/Num2;
    std::cout << "Division of "<<Num1<< " / " <<Num2 <<" = "<< Div<<endl;
    return Div;
}

math.hpp

#include <ctime>
#include<iostream>
class Math
{
  int Num1;
  int Num2;
  int Fact, Mul, Div, Num, i;

public:
  int Multiply(int Num1,int Num2);
  int Divide(int Num1, int Num2);
};

Когда запускается команда gcovr -v -r.дается ниже

C:\Users\user\Desktop\Gcovr>gcovr -v -r .
Filters for --root: (1)
- <_sre.SRE_Pattern object at 0x01C206A0>
Filters for --filter: (1)
- DirectoryPrefixFilter(C\:\/Users\/user\/Desktop\/Gcovr\/)
Filters for --exclude: (0)
Filters for --gcov-filter: (1)
- AlwaysMatchFilter()
Filters for --gcov-exclude: (0)
Filters for --exclude-directories: (0)
Scanning directory . for gcda/gcno files...
Found 4 files (and will process 2)
Pool started with 1 threads
Processing file: C:\Users\user\Desktop\Gcovr\main.gcda
Running gcov: 'gcov C:\Users\user\Desktop\Gcovr\main.gcda --branch-counts -- 
branch-probabilities --preserve-paths --object-directory 
C:\Users\user\Desktop\Gcovr' in 'c:\users\user\appdata\local\temp\tmpyekiry'
Running gcov: 'gcov C:\Users\user\Desktop\Gcovr\main.gcda --branch-counts -- 
branch-probabilities --preserve-paths --object-directory 
C:\Users\user\Desktop\Gcovr' in 'C:\Users\user\Desktop\Gcovr'
Finding source file corresponding to a gcov data file
  currdir      C:\Users\user\Desktop\Gcovr
  gcov_fname   c:\users\user\appdata\local\temp\tmpyekiry\main.cpp.gcov
           [u'        -', u'    0', u'Source', u'main.cpp\n']
  source_fname C:\Users\user\Desktop\Gcovr\main.gcda
  root         C:\Users\user\Desktop\Gcovr
  fname        C:\Users\user\Desktop\Gcovr\main.cpp
Parsing coverage data for file C:\Users\user\Desktop\Gcovr\main.cpp
uncovered: set([])
covered:   {2: 1, 5: 1, 6: 1, 7: 4}
branches:  {5: {1: 1, 2: 0}, 6: {1: 1, 2: 0}, 7: {1: 1, 2: 0, 3: 1, 4: 0}}
noncode:   set([3])
Finding source file corresponding to a gcov data file
  currdir      C:\Users\user\Desktop\Gcovr
  gcov_fnamec:\users\user\appdata\local\temp\tmpyekiry\c~#mingw#lib#gcc#mingw32#6.3.0#include#c++#iostream.gcov
           [u'        -', u'    0', u'Source', 
u'c:/mingw/lib/gcc/mingw32/6.3.0/include/c++/iostream\n']
  source_fname C:\Users\user\Desktop\Gcovr\main.gcda
  root         C:\Users\user\Desktop\Gcovr
  fname        c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\iostream
Parsing coverage data for file c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\iostream
  Filtering coverage data for file c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\iostream
Processing file: C:\Users\user\Desktop\Gcovr\math.gcda
Running gcov: 'gcov C:\Users\user\Desktop\Gcovr\math.gcda --branch-counts --branch-probabilities --preserve-paths --object-directory C:\Users\user\Desktop\Gcovr' in 'c:\users\user\appdata\local\temp\tmpyekiry'
Gathered coveraged data for 1 files

1 Ответ

0 голосов
/ 25 декабря 2018

Проблема в том, что вы явно передаете файл заголовка math.hpp компилятору.Он не содержит никаких определений, которые бы генерировали объектный код, что приводит к следующей последовательности событий:

  1. main.cpp скомпилировано.Создается файл main.gcno, который позволяет gcov интерпретировать данные покрытия main.gcda.
  2. math.cpp компилируется, что создает файл math.gcno.
  3. math.hpp isскомпилирован, который перезаписывает math.gcno пустым файлом

Следовательно, данные покрытия для math.cpp не распознаются, и файл исключается из покрытия.

Нет необходимости передавать math.hpp компилятору, поскольку ваши исходные файлы #include этого файла.Если мы удалим заголовок из вызова компилятора, мы получим следующий вывод gcovr:

------------------------------------------------------------------------------
                           GCC Code Coverage Report
Directory: .
------------------------------------------------------------------------------
File                                       Lines    Exec  Cover   Missing
------------------------------------------------------------------------------
main.cpp                                       4       4   100%   
math.cpp                                       9       9   100%   
------------------------------------------------------------------------------
TOTAL                                         13      13   100%
------------------------------------------------------------------------------

(файл math.hpp по-прежнему не указан, но содержит ноль операторов, которые могут быть рассмотрены.)

...