谷歌测试能否用于测试C代码?

98

所以我喜欢并享受在我参与的一个C++项目中使用Google Test。我现在正在启动一个将是纯C语言的库的新项目,到目前为止,我看不出为什么不能继续使用Google Test,即使它是一个C++框架。拥有可用的C++编译器将不会是一个问题。

是否有特定的原因,我不应该使用Google Test来测试纯C代码?

谢谢。


1
我能理解你为什么想这样做,gtest相当节俭。好问题。 - Matt Joiner
5个回答

95

17
作为谷歌的C++代码,Google Test并不使用异常,因此异常安全流程不会成为问题。只要您的头文件是C++兼容的(不使用C++关键字,导出符号具有正确的链接),那么就应该没有问题。

将不兼容的事物列表扩展为:在C头文件中使用<stdatomic.h>。https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60932 - Jonah
1
截至2021年8月11日,Jakub在此处提到,<stdatomic.h>现在与Google Test兼容:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60932 - ptk

10

我想再补充一点:由于gtest是C ++,因此您将以C ++解析要测试的C标头。这意味着测试不能保证头文件可从C中使用。我最近在构建C库时遇到了这个问题。


8

Jason,注意了!!! :D

正如Meekrosoft所说,是的,这是可能的。我在尝试时也使用了他的网站。它可以工作,但有一个大问题:

GTest是面向对象的工具,而C语言不是!

例如,在GTest中,你有很多函数(整个API的80%)需要对象作为参数,例如:

EXPECT_CALL(turtle, PenDown())              // turtle is object(class) and PenDown() is method of that object
      .Times(AtLeast(1));

来自GTest网站gmock_for_dummies.md 所以你将仅使用像expect_equal, expect_bigger_than这样的宏...

我想向您推荐工具CMocka(或其他C语言单元测试工具)。 它也来自谷歌(由非谷歌开发人员组成的团队进行修改),并且专门为C语言而创建。 当我想要测试C类型源代码时,我使用这个。

希望这有所帮助.. :-)祝你有一个美好的一天.. :-)


12
EXPECT_CALL 在 GoogleTest 中未定义,而是在 GoogleMock (一个模拟框架 - 而不是单元测试框架)中定义。GoogleTest 定义了像 EXPECT_EQ 和 EXPECT_TRUE 这样的宏,非常适合对过程式(非面向对象)代码进行单元测试。我目前正在使用它进行一个项目的测试,并且运行良好。 - weberc2

2

我无法具体列举出一个。我猜可能有一些在“正常”的C语言中不存在的东西。例如,我认为TestCase是从某个类派生而来的。但是,在测试中,您可以测试任何您想要测试的内容,所以为什么不使用C语言呢?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接