Visual Studio 的 gtest 单元计算错误的代码覆盖率
Visual Studio's gtest unit calculates incorrect code coverage
我尝试在 visual studio enterprise 2022 中使用 gtest 并生成代码覆盖率。
// pch.h
#pragma once
#include <gtest/gtest.h>
// pch.cpp
#include "pch.h"
// test.cpp
#include "pch.h"
int add(int a, int b) {
return a + b;
}
TEST(a, add) {
EXPECT_EQ(2, add(1, 1));
}
这张图片是我的测试覆盖率报告:
如此简约的代码。我认为它的代码测试覆盖率应该是100%。但实际上只有26.53%。我想这可能是因为头文件“gtest/gtest.h”中的很多东西没有被执行。
请告诉我如何编写覆盖率 100% 的 hello world 项目。
您应该在专用文件中编写测试,并从测试覆盖工具的分析中排除测试源。单元测试本质上不是任何测试覆盖工具的主题。
// First file, a subject for a tool
int add(int a, int b) {
return a + b;
}
// Second file, excluded from analysis by a tool
TEST(a, add) {
EXPECT_EQ(2, add(1, 1));
}
TEST
生成大量代码,包括多个条件分支、异常处理程序和其他内容。
EXPECT_EQ
产生至少两个分支 if (2 == add(1, 1) ... else ...
.
当然add(1, 1)
给出的结果是单一的,无法覆盖单元测试中的所有分支。
问题是你不明白你在看什么。
如果您将生产代码 (int add(int a, int b)
) 保存在单独的源文件中,那么测试它会更容易解释。请注意,您只对生产代码的覆盖率感兴趣。
还有一个视图通过标记源文件中的行来显示测试覆盖了哪些行和分支。这种观点更容易理解。
现在有一些代码没有被涵盖,因为 Catch2 有额外的代码涵盖不同的场景:过滤测试、重复它们、在出现错误时打印报告等等。由于您将所有内容都放在单个文件中,因此该统计数据也涵盖了这一点。如果您将此与您的测试代码非常简单(没有很多行)这一事实结合起来,则统计数据将由测试本身的代码覆盖率主导。
所以基本上这是一种误报。
感谢前两个答案。我使用命名空间包装我的函数。并添加 .runsettings 文件解决了问题。
// First file
namespace qingl {
int add(int a, int b) {
return a + b;
}
}
// Second file
TEST(a, add) {
EXPECT_EQ(2, qingl::add(1, 1));
}
// Add the following under the .runsettings file
// https://docs.microsoft.com/en-us/visualstudio/test/customizing-code-coverage-analysis?view=vs-2022
// .runsettings
<Functions>
<Include>
<Function>^qingl::.*</Function>
</Include>
</Functions>
我尝试在 visual studio enterprise 2022 中使用 gtest 并生成代码覆盖率。
// pch.h
#pragma once
#include <gtest/gtest.h>
// pch.cpp
#include "pch.h"
// test.cpp
#include "pch.h"
int add(int a, int b) {
return a + b;
}
TEST(a, add) {
EXPECT_EQ(2, add(1, 1));
}
这张图片是我的测试覆盖率报告:
如此简约的代码。我认为它的代码测试覆盖率应该是100%。但实际上只有26.53%。我想这可能是因为头文件“gtest/gtest.h”中的很多东西没有被执行。 请告诉我如何编写覆盖率 100% 的 hello world 项目。
您应该在专用文件中编写测试,并从测试覆盖工具的分析中排除测试源。单元测试本质上不是任何测试覆盖工具的主题。
// First file, a subject for a tool
int add(int a, int b) {
return a + b;
}
// Second file, excluded from analysis by a tool
TEST(a, add) {
EXPECT_EQ(2, add(1, 1));
}
TEST
生成大量代码,包括多个条件分支、异常处理程序和其他内容。
EXPECT_EQ
产生至少两个分支 if (2 == add(1, 1) ... else ...
.
当然add(1, 1)
给出的结果是单一的,无法覆盖单元测试中的所有分支。
问题是你不明白你在看什么。
如果您将生产代码 (int add(int a, int b)
) 保存在单独的源文件中,那么测试它会更容易解释。请注意,您只对生产代码的覆盖率感兴趣。
还有一个视图通过标记源文件中的行来显示测试覆盖了哪些行和分支。这种观点更容易理解。
现在有一些代码没有被涵盖,因为 Catch2 有额外的代码涵盖不同的场景:过滤测试、重复它们、在出现错误时打印报告等等。由于您将所有内容都放在单个文件中,因此该统计数据也涵盖了这一点。如果您将此与您的测试代码非常简单(没有很多行)这一事实结合起来,则统计数据将由测试本身的代码覆盖率主导。
所以基本上这是一种误报。
感谢前两个答案。我使用命名空间包装我的函数。并添加 .runsettings 文件解决了问题。
// First file
namespace qingl {
int add(int a, int b) {
return a + b;
}
}
// Second file
TEST(a, add) {
EXPECT_EQ(2, qingl::add(1, 1));
}
// Add the following under the .runsettings file
// https://docs.microsoft.com/en-us/visualstudio/test/customizing-code-coverage-analysis?view=vs-2022
// .runsettings
<Functions>
<Include>
<Function>^qingl::.*</Function>
</Include>
</Functions>