Google Test 单独项目 - 如何针对 C++ 项目运行测试

2023-12-10

我试图弄清楚如何使用 CMake 针对我的 C++ 项目运行 Google Test。到目前为止,我已经创建了一个名为 Simple 的项目和一个名为 SimpleTest 的 Google 测试项目。

对于简单的项目

这是我的 CMakeLists.txt 文件:

cmake_minimum_required(VERSION 2.8.4)
project(Simple)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(SOURCE_FILES
    main.cpp
    NewCppClass.cpp
    NewCppClass.h)

add_executable(Simple ${SOURCE_FILES})

这是我的 main.cpp 文件:

#include <iostream>

#include "NewCppClass.h"

using namespace std;

int main() {
    NewCppClass newCppClass;
    int i = newCppClass.getNumberToTest();
    cout << "i = " << i;
    return 0;
}

这是我的类标题:

#ifndef SIMPLE_NEWCPPCLASS_H
#define SIMPLE_NEWCPPCLASS_H

class NewCppClass {
    public:
        int getNumberToTest();

};

#endif //SIMPLE_NEWCPPCLASS_H

这是我的 .cpp 文件:

#include "NewCppClass.h"

int NewCppClass::getNumberToTest() {
    return 5;
}

对于 SimpleTest 项目

这是我的 CMakeLists.txt 文件:

cmake_minimum_required(VERSION 2.8.4)
project(SimpleTest)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(SOURCE_FILES
    Main_TestAll.cpp
    MyFirstTest.cpp)

enable_testing()
find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIRS})

add_executable(SimpleTest ${SOURCE_FILES})

target_link_libraries(SimpleTest ${GTEST_BOTH_LIBRARIES})

这是我的 Main_TestAll.cpp 文件:

#include "gtest/gtest.h"

int main(int argc, char **argv) {
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

这是 MyFirstTest.cpp 文件:

当然,当我弄清楚如何指向时,这个包含必须改变 我的简单项目。

#include "this/package/NewCppClass.h"
#include "gtest/gtest.h"

namespace {

// The fixture for testing class NewCppClass.
    class NewCppClassTest : public ::testing::Test {
    protected:
        // You can remove any or all of the following functions if its body
        // is empty.

        NewCppClassTest() {
            // You can do set-up work for each test here.
        }

        virtual ~NewCppClassTest() {
            // You can do clean-up work that doesn't throw exceptions here.
        }

        // If the constructor and destructor are not enough for setting up
        // and cleaning up each test, you can define the following methods:

        virtual void SetUp() {
            // Code here will be called immediately after the constructor (right
            // before each test).
        }

        virtual void TearDown() {
            // Code here will be called immediately after each test (right
            // before the destructor).
        }

        // Objects declared here can be used by all tests in the test case for Foo.
    };

// Tests that NewCppClass::getNumberToTest() is not equal to this fixed mumber.
    TEST_F(NewCppClassTest, ThisTestShallFail) {
        NewCppClass newCppClass;
        int i = newCppClass.getNumberToTest();
        EXPECT_EQ(i, 2);
    }

}  // namespace

UPDATE:


πάντα-ῥεῖ 写了这个question:

我建议将所有测试用例类(作为普通的 .cpp 源)到一个单独的项目中,并与被测试的类链接 来自一个单独的图书馆项目。将 gtest_all.cc 包含在 main() 中 函数,或与测试项目链接到 gtest 库。

要运行测试用例,请添加运行 UnitTester 工件构建 该项目作为额外的构建步骤。

我认为这是正确的方向,所以我将其添加到问题中以提醒自己,并且可能对其他人有帮助。

同样在下面,由 πάντα-ῥεῖ 撰写:

...被测试的类应该捆绑到一个单独的库中 工件,并链接到测试运行程序应用程序。

当我尝试在脑海中整理需要做什么时,我将所有这些信息都包含在这里。


如果我了解需要正确完成哪些操作,那么我需要(在我的 C++ 项目中)添加到 CMakeLists.txt 文件以将 GTest 添加为外部项目,并在 add_executable 中添加测试。像这样的事情:

################################
# GTest
################################
include(ExternalProject)
enable_testing()
find_package(GTest REQUIRED)

################################
# Unit Tests
################################
# Add test cpp file
# Link test executable against gtest & gtest_main
add_executable(SimpleTest
    Main_TestAll.cpp
    MyFirstTest.cpp)
target_link_libraries(Test GTest)
add_test( runUnitTests runUnitTests )

问题似乎出在代码模块的组织上。假设您有一个 C++ 目标项目,它提供了一个可执行程序作为最终输出:

  • I suppose you want to create two executable artifacts
    • 您的最终申请
    • 运行您指定的所有测试用例的测试运行器应用程序
  • 这应该是你的误解,如何正确设置这个场景:
    您无法将可执行工件(应用程序)中的函数链接到另一个可执行工件(测试运行程序)中。
  • You can either
    • 在库中单独提供核心类,并将其链接到您的最终应用程序和测试运行程序。应用程序应该提供一个薄包装main()入口点。
    • 添加被测类的源链接,并在测试运行器环境中完全编译它们
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Google Test 单独项目 - 如何针对 C++ 项目运行测试 的相关文章

随机推荐

  • KeyListener 未到达我的 switch 语句

    我有这个代码 import java awt Color import java awt Graphics import java awt event KeyEvent import java awt event KeyListener i
  • 在 JavaScript 中选择目录路径[重复]

    这个问题在这里已经有答案了 有没有办法通过 JavaScript 选择目录 不是用于上传文件 只是选择目录路径 目录对话框什么的 出于安全原因 您不能这样做 您不希望网站能够了解您的文件系统 参见下文 当您获取文件输入的值时 它将被破坏 例
  • 所有文档中的成对推土机距离(word2vec 表示)

    是否有一个库可以获取文档列表并集体计算 nxn 距离矩阵 其中提供了 word2vec 模型 我可以看到 genism 允许您在两个文档之间执行此操作 但我需要对所有文档进行快速比较 就像 sklearns cosine similarit
  • PHP获取存储过程的返回值

    我很高兴通过 PDO 使用 SQL Server 来处理旧版 PHP 应用程序 在 PHP 中如何检索正在使用的存储过程的返回值RETURN语句作为输出通道 示例程序 CREATE PROCEDURE dbo mleko test para
  • Tkinter:缩放画布上的项目

    我试图了解画布的缩放是如何工作的 以下面的代码为例 这是为什么canvas scale all 绑定到鼠标滚轮 正在缩放所有矩形 而不是文本 如何实现文本与矩形的缩放 import Tkinter as tk import random p
  • 从大量条目中实现选择框的最佳方法

    我有一大组数据 用户必须从中选择一个 我正在考虑一种实现它的方法 当然 在 GUI 中 我有几个想法 但只是想在这里发帖 因为可能有更好的选择 比如说 用户必须从大量用户群中选择一个名称 如果我只是放置一个文本字段供用户输入名称 那么可能会
  • 浏览器 cookie 域如何工作?

    由于我遇到了奇怪的域 子域 cookie 问题 我想知道浏览器如何处理 cookie 如果他们以不同的方式做事 那么了解其中的差异也很好 换句话说 当浏览器收到 cookie 时 该 cookie 可能附加一个域和一个路径 或者不是 在这种
  • 编译器何时以及为何将 malloc/free/new/delete 上的内存初始化为 0xCD、0xDD 等?

    我知道编译器有时会使用某些模式初始化内存 例如0xCD and 0xDD 我想知道的是when and why有时候是这样的 When 这是否特定于所使用的编译器 Do malloc new and free delete对此也以同样的方式
  • 使用 Powershell 调用 Web 服务上的异步 Web 方法

    我正在使用 PowerShell V2 并尝试找到使用 Web 服务代理调用异步 Web 方法的示例 这是我到目前为止的代码 Uri http localhost mywebservice asmx wsdl proxy New WebSe
  • Linq 在单个集合中检查重叠的日期范围

    Class TimeRange private DateTime StartDate get set private DateTime EndDate get set List
  • 有没有办法告诉 Rust 编译器在处理恐慌时对部分初始化的数组元素调用 drop ?

    我正在研究自定义类型 我有以下要求 避免堆分配的元素的集合 我使用数组而不是Vec 该集合包含不可复制的类型 实施Default对于也实现的类型Default 实施From这样我就可以直接从数组构建它 我最大的问题是实施Default以安全
  • java.lang.StringIndexOutOfBoundsException:字符串索引超出范围

    你好 我写了一个java代码来查找由其他单词组成的最长单词 我的逻辑是从文本文件中读取单词列表并将每个单词添加到一个数组中 在文本中单词已排序 每行中只有一个单词 之后 我们检查数组中的每个元素是否有其他元素作为子字符串 如果是这样 我们计
  • 增加字符串末尾的数字

    我正在尝试解决一个问题 该问题表示要添加1在一个的末尾string 意思是 1 abcd12会变成 abcd13 2 abcd099会变成abcd100 3 abcd01会变成abcd02 4 ddh add 2204会变成ddh add
  • Git 允许通过未暂存的更改进行分支更改

    当我有未暂存的更改 修改后的文件 时 Git 允许我更改分支 某处有这方面的配置吗 编辑 起初我认为这是一个配置 我需要将其设置为如果存在已修改的未暂存文件 则禁止在分支之间进行更改 但根据艾米丽的评论 如果分支之间的文件不同 系统似乎会提
  • 错误 438 对象不支持此属性或方法 - 带字典的类对象

    Background 这是一个后续问题this我最近问的问题是如何返回数组Class模块属性直接来自Dictionary item 我现在已经尝试过与Property Let and Property Get填充一个Private Arra
  • 扩展 UserCreationForm 时排除密码

    我想创建一个视图 用户可以在其中更改其用户对象的属性 名字 姓氏和电子邮件地址 Django 有一个内置的 UserCreationForm 用于创建用户 我已经有了一个扩展版本 其中还包括电子邮件 名字和姓氏 现在我正试图将其扩展到not
  • 如何在 Git 上发送拉取请求

    我们最近从 SVN 迁移到了 Git 我们在 LAN 网络中的一台计算机上设置了一个裸存储库 并在其他计算机上克隆 现在 当任何人进行更改并提交时 我们希望他将拉取请求发送到裸存储库 通过告诉或电子邮件或任何其他方式 之后人们将完成更改并将
  • Python:类型错误:需要 str、字节或字节数组,而不是 int

    我正在尝试创建一个简单的基于服务器到客户端的聊天程序 问题是当我尝试执行c sendto data client 出现此错误说明Client是一个 int 但它是一个包含端口号和地址的元组 我应该将元组转换为字节以便我可以将消息发送给客户端
  • 如何通过 Genson/Jersey 配置日期格式化程序?

    我使用 Jersey 来实现 RESTful 服务 使用 Genson 来执行 JSON POJO 转换 Genson 没有设置 我只是将它放入类路径中 它就可以工作 只是它会在日期解析时抛出错误 因为格式是意外的 现在 如果我要使用 Gs
  • Google Test 单独项目 - 如何针对 C++ 项目运行测试

    我试图弄清楚如何使用 CMake 针对我的 C 项目运行 Google Test 到目前为止 我已经创建了一个名为 Simple 的项目和一个名为 SimpleTest 的 Google 测试项目 对于简单的项目 这是我的 CMakeLis