如何使用.c文件在google test而不是.cpp文件中编写测试类?

时间:2014-05-14 05:49:51

标签: c++ c unit-testing googletest

我使用googletest为我的Android NDK项目包含.c文件。我使用了.cpp类型的测试类来做同样的事情。我想改用.c文件。我尝试使用它时出现以下错误:

Running main() from gtest_main.cc
[==========] Running 0 tests from 0 test cases.
[==========] 0 tests from 0 test cases ran. (1 ms total)
[  PASSED  ] 0 tests.

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:7)

您无法使用.c文件在googletest而不是.cpp文件中编写测试类。

.c文件应包含C语言源代码,C / C ++编译器将假定.c文件 将编译为C。

.cpp文件应包含C ++语言源代码,C / C ++编译器将假定.cpp文件 将被编译为C ++。

C和C ++是相关但不同的编程语言。 C比C ++更老,更简单。 C语言中没有类。包含类的C ++源代码无法编译为C。

Googletest是一个用C ++编写的单元测试框架,而不是C语言,它需要你编写 使用框架类在C ++中测试代码。您的测试必须在.cpp(和.h)个文件中进行编码 编译器将它们编译为C ++。

但是,您可以使用googletest对C代码进行单元测试。 C代码将包含在.c.h文件中,但是您 必须像往常一样在.cpp.h文件中对单元测试进行编码。 C / C ++编译器知道这一点 .c文件将编译为C,.cpp文件将编译为C ++。

当你想#include "some_header.h"时,你必须处理一个小的复杂问题 在您的C ++单元测试代码中,some_header.h是C语言头文件之一:

C ++编译器将处理some_header.h可以 正确处理 因为它知道 some_header.h 是一个C语言头文件。通知C ++编译器some_header.h 是一个C头,你写这个:

extern "C" {
#include "some_header.h"
}

如果您没有在extern "C" { ... }周围添加#include作为C语言标题,那么您将获得未定义符号 链接时的错误。

我建议你试验一个包含以下三个文件的项目:

<强> return_one.h

// return_one.h
#ifndef RETURN_ONE_H
#define RETURN_ONE_H

// A C library :)

// A C function that always return 1.
extern int return_one(void);

#endif

<强> return_one.c

// return_one.c
#include "return_one.h"

int return_one(void)
{
    return 1;
}

<强> test_return_one.cpp

// test_return_one.cpp
#include "gtest/gtest.h"
extern "C" {
#include "return_one.h"
}

TEST(t_return_one, returns_1)
{
    EXPECT_EQ(1,return_one());  
}

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

使用googletest编译,链接和运行此项目。

您可能会发现this question的答案很有帮助。