一. 测试环境搭建:
VS2019社区版,自带gtest。 OpenCppCoverage:作为VS插件有两种方式
- 打开VisualStudio --> 工具 --> 扩展和更新 --> 联机 --> 右上角输入OpenCppCoverage,在下面的结果会出现“OpenCppCoverage Plugin”点击安装即可(安装中需要将VisualStudio重启)
- 离线下载:OpenCppCoverage离线,下载双击即可。
二. 第一次运行
1. 新建项目:
按照向导来即可
2. 改写文件:
因为大多gtest文档都是基于自建项目(linux下或者之前的VS版本)来说的,导入lib比较麻烦,所以我就用现成的向导。但是文件和教程不匹配。 需要修改源文件。 把源文件test.cpp内容删除。 填写:
#include <gtest/gtest.h>
#include <tchar.h>
int Foo(int a, int b)
{
if (a == 0 || b == 0)
{
throw "don't do that";
}
int c = a % b;
if (c == 0)
return b;
return Foo(b, c);
}
TEST(FooTest, HandleNoneZeroInput)
{
EXPECT_EQ(2, Foo(4, 10));
EXPECT_EQ(6, Foo(30, 18));
}
int _tmain(int argc, _TCHAR* argv[])
{
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
在 Main 函数中初始化环境,再使用 RUN_ALL_TEST()宏运行测试案例。案例TEST是宏,两个参数不重复就行。官方的对这两个参数的 解释为: [TestCaseName, TestName],而我对这两个参数的定义是: [TestSuiteName, TestCaseName],
3. 填坑
- 这时运行会有错误:
修改test.cpp的文件配置:选择test.cpp文件右键属性,配置属性 -> C/C++ ->预编译头 选择不使用预编译头 - 如果测试的是C文件,
则需要加入
extern "C" {
#include "main_logic.h"
}
- 外部文件
项目右键属性->VC++目录 -> 外部包含目录 - XML输出:
在t_main中加入
testing::GTEST_FLAG(output) = "xml:";
运行结果
三. 学习gtest
1. 使用 TEST 宏开始一个测试案例,使用 EXPECT_*,ASSER_*系列设置检查点
- ASSERT_* 系列的断言,当检查点失败时,退出当前函数(注意:并非退出当前案例)。
- EXPECT_* 系列的断言,当检查点失败时,继续往下执行。
- 布尔值检查
- 数值型数据检查
2. 事件
gtest 提供了多种事件机制,非常方便我们在案例之前或之后做一些操作。总结一下 gtest 的事件一共有 3 种:
- 全局的,所有案例执行前后。
- TestSuite 级别的,在某一批案例中第一个案例前,最后一个案例执行后。
- TestCase 级别的,每个 TestCase 前后。
3.参数化
bool IsPrime(int n)
{
if (n <= 1) return false;
if (n % 2 == 0) return n == 2;
for (int i = 3; ; i += 2) {
if (i > n / i) break;
if (n % i == 0) return false;
}
return true;
}
class IsPrimeParamTest : public::testing::TestWithParam<int>
{
};
TEST_P(IsPrimeParamTest, HandleTrueReturn)
{
int n = GetParam();
EXPECT_TRUE(IsPrime(n));
}
INSTANTIATE_TEST_CASE_P(TrueReturn, IsPrimeParamTest, testing::Values(3, 5, 11, 23, 17));
int _tmain(int argc, _TCHAR* argv[])
{
testing::GTEST_FLAG(output) = "xml:";
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
使用 INSTANTIATE_TEST_CASE_P 这宏来告诉 gtest 你要测试的参数范围: INSTANTIATE_TEST_CASE_P(TrueReturn, IsPrimeParamTest, testing::Values(3, 5, 11, 23, 17)); 第一个参数是测试案例的前缀,可以任意取。 第二个参数是测试案例的名称,需要和之前定义的参数化的类的名称相同,如: IsPrimeParamTest 第三个参数是可以理解为参数生成器,上面的例子使用 test::Values 表示使用括号内的参数。 Google 提供了一系列的 参数生成的函数 但是之前应先声明类IsPrimeParamTest
|