我遇到过 cppunit,但它看起来并不超级好用(也许我看起来并不难,也许是因为 C++ 不像 Java/C# 那样工作)。是否有广泛使用的简单替代方案?
事实上, cppunit是C++ 的标准单元测试框架吗?
我遇到过 cppunit,但它看起来并不超级好用(也许我看起来并不难,也许是因为 C++ 不像 Java/C# 那样工作)。是否有广泛使用的简单替代方案?
事实上, cppunit是C++ 的标准单元测试框架吗?
C++没有标准的单元测试库。有很多选择可供选择;cppunit 就是其中之一。
在我的公司,我们使用Google Test及其合作伙伴Google Mock进行单元测试和对象模拟。我发现它们都比 cppunit 更易于使用且功能更强大。
我刚刚推出了我自己的框架CATCH。它仍在开发中,但我相信它已经超越了大多数其他框架。不同的人有不同的标准,但我试图在没有太多权衡的情况下涵盖大部分内容。请查看我的链接博客条目以供品酒师使用。我的前五个功能是:
它还具有 Objective-C 绑定。
例如,以下是您编写与@dmeister 引用的 gtest 示例等效的方法:
TEST_CASE( "Factorial/Handles zero input", "Tests factorial of 0.")
{
REQUIRE( Factorial(0) == 1 );
}
TEST_CASE( "Factorial/Handles positive input", "Tests factorial of positive numbers.")
{
REQUIRE( Factorial(1) == 1 );
REQUIRE( Factorial(2) == 2 );
REQUIRE( Factorial(3) == 6 );
REQUIRE( Factorial(8) == 40320 );
}
如果测试失败,您仍然会独立记录 LHS 和 RHS 值。
谷歌测试框架是一种替代方案。
这是文档中的一个简单示例:
// Tests factorial of 0.
TEST(FactorialTest, HandlesZeroInput) {
EXPECT_EQ(1, Factorial(0));
}
// Tests factorial of positive numbers.
TEST(FactorialTest, HandlesPositiveInput) {
EXPECT_EQ(1, Factorial(1));
EXPECT_EQ(2, Factorial(2));
EXPECT_EQ(6, Factorial(3));
EXPECT_EQ(40320, Factorial(8));
}
它还可以很好地与谷歌的 C++ 模拟框架gmock配合使用。
CppUnit 可能是 C++ 的第一个单元测试框架。它是著名的 Java 框架 Junit 的直接端口。这使得从 Junit 的过渡更容易,但代价是框架有点重,没有利用 RAII 等 C++ 功能。这就是创建 CppUnitLite、NanoCppUnit 等轻量级版本的原因。CppUnit2 应该改进这一点,以及其他改进。
Tut 以前很轻,只有一个 header,但最新版本引入了一个库。
就“标准”框架而言,没有,C++1X 也没有定义。
我为自己的代码开发人员创建了一个名为 saru ( http://github.com/mikeando/saru ) 的测试套件。它是一个 BSD 许可代码。我开发它是因为我不喜欢其他测试套件的几个特性。它没有被广泛使用,但我已经在分布在两家公司的几个商业项目中使用它。
所以 saru 解决了大部分这些功能。它的重点是能够运行一套用不同语言编写的测试。以最小的测试规模。这是最小的(失败的)C++ 测试
//SARU : dummy dummy
int main() { return (1==2)?0:1; }
saru 真正关心的是它编译的二进制文件的返回值。然后它解析输出以确定哪些测试失败等等。它的头文件使使用 C++ 比上面的简单示例更好一点:
//SARU : dummy dummy
#include "MyStruct.h"
#include "saru_cxx.h"
class Fixture
{
MyStruct s_;
Fixture() : s_() {}
void test_A_is_B()
{
SARU_ASSERT_EQUAL( s_.A(), s_.B() );
}
void test_C_is_7()
{
SARU_ASSERT_EQUAL( 7, s_.C() );
}
};
int main()
{
saru::TestLogger logger;
SARU_TEST( Fixture:: test_A_is_B, logger );
SARU_TEST( Fixture:: test_C_is_7, logger );
logger.printSummary();
return logger.allOK()?0:1;
}
或者,如果您不喜欢它的 C++ 头文件的工作方式,它应该能够以最小的难度与其他单元测试库集成。
但它也会运行用 PHP 和 python 编写的测试。因此,您可以使用 saru 设置完整的功能测试。或者,您可以在代码上运行类似 lint 的东西作为测试套件的一部分。
这是一个最小的 C++ 单元测试库: https ://github.com/vahidk/minimal-cpp-test
它的语法与 Google 测试库非常相似,但它只是一个标头库,因此更容易跨平台移植。
这是一个最小的单元测试:
#define DEFINE_TEST_MAIN
#include "test.h"
TEST(GroupName, TestName) {
EXPECT_EQ(1 + 2, 3);
}
还有一个最小的夹具:
class ClassName : public cyrus:Test {
public:
void Setup() override {
x = 5;
}
int x;
}
Test_F(ClassName, Test1) {
EXPECT_EQ(x, 5);
}
希望这可以帮助。
这是一个仅包含 C++ 单元测试解决方案的头文件: https ://gitlab.com/cppocl/unit_test_framework
在这里使用它的简单示例,但它也有固定装置(设置和拆卸),内存泄漏测试失败,性能测试失败(我在其他任何地方都没有看到这个功能)。
#include "test/Test.hpp"
TEST(MyTest)
{
int a = 1;
int b = 2;
CHECK_EQUAL(a + b, 3);
}
这是单元测试库的列表。
http://en.wikipedia.org/wiki/List_of_unit_testing_frameworks#C.2B.2B
但是,据我所知,cppunit 是最受欢迎的。