windows下使用gtest

我是在window下使用clion来写c++的,最近学习了gtest,中间遇到了一些问题,记录一下。

整体目录

先看一下目录结构
在这里插入图片描述
两个测试case,前面就有运行的标志,直接点击就能运行

具体的代码

CMakeLists.txt

cmake_minimum_required(VERSION 3.14)
project(my_project)

# GoogleTest requires at least C++11
set(CMAKE_CXX_STANDARD 11)

include(FetchContent)
FetchContent_Declare(
        googletest
        URL https://github.com/google/googletest/archive/609281088cfefc76f9d0ce82e1ff6c30cc3591e5.zip
)
# For Windows: Prevent overriding the parent project's compiler/linker settings
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)


enable_testing()

add_executable(
        gtest_demo
        gtest_demo_1.cc
        sample1.cc
)


target_link_libraries(
        gtest_demo
        gtest_main
)


include(GoogleTest)
gtest_discover_tests(gtest_demo)

sample1.h


#ifndef GOOGLETEST_SAMPLES_SAMPLE1_H_
#define GOOGLETEST_SAMPLES_SAMPLE1_H_

// Returns n! (the factorial of n).  For negative n, n! is defined to be 1.
int Factorial(int n);

// Returns true if and only if n is a prime number.
bool IsPrime(int n);

#endif  // GOOGLETEST_SAMPLES_SAMPLE1_H_

sample1.cc


#include "sample1.h"

// Returns n! (the factorial of n).  For negative n, n! is defined to be 1.
int Factorial(int n) {
  int result = 1;
  for (int i = 1; i <= n; i++) {
    result *= i;
  }

  return result;
}

// Returns true if and only if n is a prime number.
bool IsPrime(int n) {
  // Trivial case 1: small numbers
  if (n <= 1) return false;

  // Trivial case 2: even numbers
  if (n % 2 == 0) return n == 2;

  // Now, we have that n is odd and n >= 3.

  // Try to divide n by every odd number i, starting from 3
  for (int i = 3; ; i += 2) {
    // We only have to try i up to the square root of n
    if (i > n/i) break;

    // Now, we have i <= n/i < n.
    // If n is divisible by i, n is not prime.
    if (n % i == 0) return false;
  }

  // n has no integer factor in the range (1, n), and thus is prime.
  return true;
}

gtest_demo_1.cc

#include <iostream>
#include <gtest/gtest.h>
#include "sample1.h"

int add(int lhs, int rhs) { return lhs + rhs; }

//int main(int argc, char* argv[]) {
//    std::cout << "start gtest2222 demo \r\n" << std::endl;
//    ::testing::InitGoogleTest(&argc, argv);
//    return RUN_ALL_TESTS();
//}


TEST(FactorialTest, ZeroABC) {
    EXPECT_EQ(2,1+1);
    EXPECT_EQ(5,1+4);
}



TEST(FactorialTest, ZeroABC2) {
    EXPECT_EQ(1, Factorial(0));
}

代码已经看完了,单个测试case也可以跑完了,如果我想整体运行怎么办呢?
去掉gtest_demo_1里面main方法的注释。
在这里插入图片描述

命令行里运行

进入项目根目录
mkdir build
cd build
cmake ..
cmake --build .

运行完上面的命令,就能看到项目结构如下:
在这里插入图片描述
build文件夹里面有个debug文件,再进去就能看到gtest_demo.exe

关于Test_P

代码如下:

gtest_demo_2.cc
#include <iostream>
#include <gtest/gtest.h>

 
class Bis 
{
public:
    bool Even(int n) 
    {
        if (n % 2 == 0) 
        {
            return true;
        }
        else 
        {
            return false;
        }
    };
 
    bool Suc(bool bSuc) 
    {
        return bSuc;
    }
};
 
class CombineTest : 
    public ::testing::TestWithParam< ::testing::tuple<bool, int> > {
public:
    int a=6;
    CombineTest(){
        std::cout<<"CombineTest init a:"<< a<<std::endl;
    }

protected:
	bool checkData() {
		bool suc = ::testing::get<0>(GetParam());
        int n = ::testing::get<1>(GetParam());
		return bis.Suc(suc) && bis.Even(n);
	}
private:
	Bis bis;
};
 
 /*
TEST_P(CombineTest, Test) {
	EXPECT_TRUE(checkData());
}
*/

TEST_P(CombineTest, Testxx) {
    bool suc = ::testing::get<0>(GetParam());
    int n = ::testing::get<1>(GetParam());
    a=888;
    std::cout<<"succ-"<<suc<<" n:"<<n<< " a:"<<a<<std::endl;
    EXPECT_EQ(5, 1 + 4);
}
 
INSTANTIATE_TEST_CASE_P(TestBisValuesCombine, CombineTest, ::testing::Combine(::testing::Bool(), ::testing::Values(0, 1, 2, 3, 4)));

对应的CMakelist.txt如下:

add_executable(
        gtest_demo2
        mytest/gtest_demo_2.cc
)

target_link_libraries(
        gtest_demo2
        GTest::GTest GTest::Main
        pthread
)

使用make命令来构建

大家记住一点在windows下,其实本身并没有make这个命令,直接使用cmake也不会产生makefile文件。
如果我就是想用make命令呢?
第一步,先在C:\Program Files\mingw64\bin里面把mingw32-make.exe复制一份,重命名为make.exe
在这里插入图片描述
然后回到项目根目录,删除掉build文件夹里面的所有东西。

cd build
cmake .. -G "Unix Makefiles" 
make -j4

效果如下:
在这里插入图片描述

本地已经安装gtest

当然使用gtest还有一个方案,就是把gtest的源码下载到本地,然后编译安装。安装之后 /usr/lib64 /user/local/include 下面就有会对应的库和头文件。这种情况该怎么写cmake文件呢?如下:


enable_testing()

find_package(GTest REQUIRED)

add_executable(
        gtest_demo
        gtest_demo_1.cc
        sample1.cc
)

target_link_libraries(
        gtest_demo
        GTest::GTest GTest::Main
        pthread
)

include(GoogleTest)
gtest_discover_tests(gtest_demo)

参考资料

https://blog.csdn.net/wwwsctvcom/article/details/119173452
https://blog.csdn.net/Mingrenjiuwei/article/details/112782737

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值