为什么代码覆盖率报告说我的图书馆没有被覆盖?

技术性

我正在尝试为小型测试库生成代码覆盖率。该库仅包含两个文件。

Calculator.cpp:

#include "calculator.h"

Calculator::Calculator()
{

}

Calculator::~Calculator()
{

}

void Calculator::addNumbers(int x, int y)
{
  this->result = x + y;
}

Calculator.h:

#ifndef CALCULATOR_H
#define CALCULATOR_H
class Calculator
{
public:
  Calculator();
  ~Calculator();
  void addNumbers(int x, int y);
};

#endif

我对此正在执行的库进行单元测试。它包括库,并且运行良好。我已将cmake_cxx_flags设置为在顶级CMakeLists.txt中包含-fprofile-arcs和-ftest-coverage。

cmake_minimum_required(VERSION 2.8.11)

set(CMAKE_CXX_FLAGS "-std=c++11")

include_directories("${PROJECT_BINARY_DIR}")

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0 --coverage")
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0 --coverage -ftest-coverage -fprofile-arcs")

add_subdirectory(src)
add_subdirectory(test)

我正在使用脚本来获取在生成时生成的gcno和gcda文件,以生成易于阅读的报告。

#!/bin/bash

OUTPUT_DIR="$1/bin/ExecutableTests/Coverage"
mkdir -p "$OUTPUT_DIR"

component=Calculator
dependency=calculator
script=test_calculator.sh
unit_test=unit_test_calculator

mkdir $OUTPUT_DIR/$component

cd "$1"/bin/

make clean || exit 1
make || exit 1
# Create baseline coverage
lcov -c -i -d "$1"/bin/src/"$component"/CMakeFiles/"$dependency".dir -o "$1/Coverage/$component"_"$dependency".coverage.base
# Run the test
$1/scripts/$script $1
# Create test coverage
lcov -c -d "$1"/bin/test/$component/CMakeFiles/"$unit_test".dir -o "$1/Coverage/$component"_"$dependency".coverage.run

lcov -d "$1/test/$component" -a "$1/Coverage/$component"_"$dependency".coverage.base -a "$1/Coverage/$component"_"$dependency".coverage.run -o "$1/Coverage/$component"_"$dependency".coverage.total

genhtml --branch-coverage -o "$OUTPUT_DIR/$component" "$1/Coverage/$component"_"$dependency".coverage.total
rm -f "$1/Coverage/$component"_"$dependency".coverage.base "$1/Coverage/$component"_"$dependency".coverage.run "$1/Coverage/$component"_"$dependency".coverage.total

我可以看到正在为库生成数据文件。但是,当我查看从脚本生成的报告时,它表明该库从未被使用过。如我的单元测试所示,这显然是错误的。

#include "lest_basic.hpp"
#include "calculator.h"
#include <memory>
#include <iostream>

int addResult(int x, int y)
{
  Calculator calc1;
  return calc1.addNumbers(x, y);
}

const lest::test specification[] =
{

  CASE( "Addition" )
  {
    std::cout << "Starting Addition testing..." << std::endl;
    std::cout << "Adding 1 and 2..." << std::endl;
    EXPECT(addResult(1, 2) == 3);
    std::cout << "Adding 2 and 8..." << std::endl;
    EXPECT(addResult(2, 8) > 1);
    std::cout << "Adding 7 and 4..." << std::endl;
    EXPECT(addResult(7, 4) < 12);
  },
};

int main(int argc, char **argv) {

  return lest::run( specification );
}

这是我的单元测试的CMakeLists.txt:

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin/ExecutableTests/)
include_directories(${CMAKE_SOURCE_DIR}/externalinclude/)
include_directories(${CMAKE_SOURCE_DIR}/src/Calculator/)
add_executable (unit_test_calculator test_calculator.cpp)
target_link_libraries(unit_test_calculator -Wl,--whole-archive calculator -Wl,--no-whole-archive)

我的问题是,为什么报告说库代码未被覆盖?数据文件有问题吗?

技术性

我已经解决了我的问题。问题是运行单元测试后,我没有针对源代码运行lcov。我的目录错误。

lcov -c -d "$1"/bin/test/$component/CMakeFiles/"$unit_test".dir -o "$1/Coverage/$component"_"$dependency".coverage.run

需要为:

lcov -c -d "$1"/bin/src/$component/CMakeFiles/"$dependency".dir -o "$1/Coverage/$component"_"$dependency".coverage.run

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在覆盖每个条件路径时,伊斯坦布尔/分站代码覆盖率报告的转换语句未被覆盖?

为什么如果我导入library.jar,则必须说出本机图书馆的位置?

为什么我的局部变量没有被覆盖?

为什么测试覆盖率还包括覆盖率报告中的烧瓶依赖关系

当我运行覆盖率测试时,得到的是测试方法代码的覆盖率,而没有要测试的方法的覆盖率

为什么不调用PHPUnit代码覆盖率报告功能?

SonarQube没有显示openclover覆盖率报告

为什么将pod中的文件添加到我的覆盖率报告中?

JaCoCo报告0%的代码覆盖率

为什么必须显式调用我的图书馆?

“图书馆没有符号”是什么意思?

为什么有些图书馆打不开?

覆盖率报告说,使用Gradle在Android上的零覆盖率

没有代码覆盖率在2017年的IntelliJ

SonarQube没有提高Cobertura的代码覆盖率

Babel Jest中没有代码覆盖率

为什么我的代码覆盖率是 0%,即使单元测试全部通过?

为什么Coverage.py会忽略没有覆盖率的文件?

我的图书馆程序有问题

什么是代码覆盖率的部分打击?

如果我使用图书馆,我必须对用户说

测试代码被包含在覆盖率报告中并扭曲了覆盖率

为什么修饰符大小没有被覆盖?

PHP Core - 我在哪里可以找到 azure 管道中的代码覆盖率报告?

maven jacoco:不生成代码覆盖率报告

在azure devops门户上查看代码覆盖率报告

Django中代码覆盖率的可视化报告

发布管道 Azure Devops 代码覆盖率报告

使用Maven生成JaCoCo代码覆盖率报告