欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

use google test on vs2017

程序员文章站 2022-07-02 19:18:44
...

前言

给chromium回调加了一个参数后,在base::PostTaskAndReplyWithResult()处编译不过了,根据报错提示,看不出来哪写错了…

看到chromium自带的gtest测试工程中,有base::PostTaskAndReplyWithResult()的测试用例。

先学习一下 google test的基本用法。
做完gtest的基础实验后,感觉gtest用起来还是挺方便的,上手快,用法也相当简洁,有大厂的范。

实验效果

hello google test from d:\ls\study\helper\test_google_test\src\hello_gooogle_test\hello_gooogle_test.cpp
[==========] Running 14 tests from 2 test cases.
[----------] Global test environment set-up.
[----------] 7 tests from case_name_a
[ RUN      ] case_name_a.test_name_1
[       OK ] case_name_a.test_name_1 (0 ms)
[ RUN      ] case_name_a.test_name_2
[       OK ] case_name_a.test_name_2 (0 ms)
[ RUN      ] case_name_a.test_name_3
[       OK ] case_name_a.test_name_3 (0 ms)
[ RUN      ] case_name_a.test_name_4
[       OK ] case_name_a.test_name_4 (0 ms)
[ RUN      ] case_name_a.test_name_5
[       OK ] case_name_a.test_name_5 (0 ms)
[ RUN      ] case_name_a.test_name_err
d:\ls\study\helper\test_google_test\src\hello_gooogle_test\hello_gooogle_test.cpp(33): error: Expected: (1) >= (2), actual: 1 vs 2
[  FAILED  ] case_name_a.test_name_err (2 ms)
[ RUN      ] case_name_a.test_name_6
[       OK ] case_name_a.test_name_6 (0 ms)
[----------] 7 tests from case_name_a (10 ms total)

[----------] 7 tests from case_name_b
[ RUN      ] case_name_b.test_name_11
[       OK ] case_name_b.test_name_11 (0 ms)
[ RUN      ] case_name_b.test_name_2
[       OK ] case_name_b.test_name_2 (0 ms)
[ RUN      ] case_name_b.test_name_3
[       OK ] case_name_b.test_name_3 (0 ms)
[ RUN      ] case_name_b.test_name_4
[       OK ] case_name_b.test_name_4 (0 ms)
[ RUN      ] case_name_b.test_name_5
[       OK ] case_name_b.test_name_5 (0 ms)
[ RUN      ] case_name_b.test_name_err
d:\ls\study\helper\test_google_test\src\hello_gooogle_test\hello_gooogle_test.cpp(62): error: Expected: (1) >= (2), actual: 1 vs 2
[  FAILED  ] case_name_b.test_name_err (3 ms)
[ RUN      ] case_name_b.test_name_6
[       OK ] case_name_b.test_name_6 (0 ms)
[----------] 7 tests from case_name_b (11 ms total)

[----------] Global test environment tear-down
[==========] 14 tests from 2 test cases ran. (25 ms total)
[  PASSED  ] 12 tests.
[  FAILED  ] 2 tests, listed below:
[  FAILED  ] case_name_a.test_name_err
[  FAILED  ] case_name_b.test_name_err

 2 FAILED TESTS

D:\ls\study\helper\test_google_test\src\hello_gooogle_test\Debug\hello_gooogle_test.exe (进程 723528)已退出,返回代码为: 1。
若要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口...

实验工程下载点

src_test_google_test_v1_8_1.7z
实验工程包括:

  • gtest1.8.1原版压缩包
  • 编译好的所有静态库(md/no-md + debug/release + x86/x64) + 提出来的gtest头文件
  • 实验工程一个

实验

编译准备

gtest的发布版本
https://github.com/google/googletest/releases
https://github.com/google/googletest/archive/release-1.8.1.zip

cd D:\ls\study\helper\test_google_test\doc\googletest-release-1.8.1\googletest\msvc\2010
gtest.sln or gtest-md.sln

选择gtest.sln, 用vs2017打开升级工具链, 只需要编译gtest静态库, 将能编译的选项组合都编译出来如下:
googletest-release-1.8.1\googletest\msvc\2010\gtest\x64-Debug\gtestd.lib
googletest-release-1.8.1\googletest\msvc\2010\gtest\Win32-Debug\gtestd.lib
googletest-release-1.8.1\googletest\msvc\2010\gtest\Win32-Release\gtest.lib
googletest-release-1.8.1\googletest\msvc\2010\gtest\x64-Release\gtest.lib

选择gtest-md.sln, 用vs2017打开升级工具链, 只需要编译gtest-md静态库, 将能编译的选项组合都编译出来如下:
googletest-release-1.8.1\googletest\msvc\2010\gtest-md\Win32-Debug\gtestd.lib
googletest-release-1.8.1\googletest\msvc\2010\gtest-md\x64-Debug\gtestd.lib
googletest-release-1.8.1\googletest\msvc\2010\gtest-md\Win32-Release\gtest.lib
googletest-release-1.8.1\googletest\msvc\2010\gtest-md\x64-Release\gtest.lib

新建一个控制台工程
将头文件googletest-release-1.8.1\googletest\include\gtest拷贝到工程目录下的inc目录
将上面生成的库文件拷贝到工程目录下的lib目录,将非.lib文件都删掉
添加预编译宏: _VARIADIC_MAX=10
开始写测试程序

测试工程实现

主程序写法固定,就2句,不用动。

testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();

在测试用例中,按照自己的逻辑得出bool的结果,用 ASSERT_X或EXPECT_X来比较结果是否正确即可.
增加新的测试用例就行。

TEST(case_name_x, test_name_x) {
	EXPECT_X(value_want, value_by_calculate);
}

我的测试工程,用来演示ASSERT_X或EXPECT_X的用法.

// @file hello_gooogle_test.cpp
// @brief edit on vs2017, use google test 1.8.1 static lib

#include "pch.h" // vs2017 default setting need include pch.h

// 设置./;../inc/为附加包含路径
#include "gtest/gtest.h"

// 在Debug + x86 下要包含的库
#pragma comment(lib, "../lib/gtest-md/Win32-Debug/gtestd.lib")

TEST(case_name_a, test_name_1) {
	EXPECT_EQ(0, 0); // ==
}

TEST(case_name_a, test_name_2) {
	EXPECT_NE(0, 1); // !=
}

TEST(case_name_a, test_name_3) {
	EXPECT_LT(1, 2); // <
}

TEST(case_name_a, test_name_4) {
	EXPECT_LE(1, 2); // <=
}

TEST(case_name_a, test_name_5) {
	EXPECT_GT(2, 1); // >
}

TEST(case_name_a, test_name_err) {
	EXPECT_GE(1, 2); // err
}

TEST(case_name_a, test_name_6) {
	EXPECT_GE(2, 1); // >=
}

// ASSERT_X 和 EXPECT_X 效果相同
TEST(case_name_b, test_name_11) {
	ASSERT_EQ(0, 0); // ==
}

TEST(case_name_b, test_name_2) {
	ASSERT_NE(0, 1); // !=
}

TEST(case_name_b, test_name_3) {
	ASSERT_LT(1, 2); // <
}

TEST(case_name_b, test_name_4) {
	ASSERT_LE(1, 2); // <=
}

TEST(case_name_b, test_name_5) {
	ASSERT_GT(2, 1); // >
}

TEST(case_name_b, test_name_err) {
	ASSERT_GE(1, 2); // err
}

TEST(case_name_b, test_name_6) {
	ASSERT_GE(2, 1); // >=
}

// main函数之前就写各种case了, mian函数就这样, 不动了
int main(int argc, char** argv)
{
	printf("hello google test from %s\n", __FILE__);
	testing::InitGoogleTest(&argc, argv);
	return RUN_ALL_TESTS();

	return EXIT_SUCCESS;
}