如何在boost单元测试中比较char*和字符串?

问题描述 投票:0回答:6

我有如下代码:

BOOST_FIXTURE_TEST_CASE(test, TestSuite1)
{
    unsigned int length = 5;
    char* content1=new char[length];
    content1="abcde";
    string content2("abcde");

    BOOST_REQUIRE( length == content2.length() );

    for(unsigned int i=0;i<5;++i)
    {
        BOOST_CHECK( content1[i] == content2[i] );
    }

    if(content1 != nullptr)
    {
        delete[] content1;
        content1 = nullptr;
    }
}

问题是如何在boost单元测试中比较char*和string? 我用过循环,但我不知道这是否是一个好方法。 还有更好的解决办法吗?非常感谢。

c++ unit-testing loops testing boost
6个回答
2
投票

使用

BOOST_CHECK_EQUAL
以便在发生故障时获得不错的输出。使用您的代码(修复丢失的 strcpy 后):

BOOST_FIXTURE_TEST_CASE(test, TestSuite1)
{
    // Set up for testing. I assume that in production, `content1` will
    // come from the code under test.
    char* content1=new char[6];
    strcpy(content1, "abcde");

    const std::string reference("abcde");
    BOOST_CHECK_EQUAL(reference, content1);

    delete[] content1;
}

如果

content1
与字符串引用匹配,则通过。如果失败:

Running 1 test cases...
test_demo.cpp:13: error: in "TestSuite1/test": check reference == content1 has failed [abcde != abcd2e]

*** 1 failure is detected in the test module "Test_demo"

1
投票

使用

strcmp
进行比较:

std::string s = "anything";
char* c = "anything";
BOOST_CHECK(strcmp(s.c_str(),c)==0);

0
投票

您的代码设计是有缺陷的,因为您创建了一个固定长度的数组,并且即使您打算将其与字符串进行比较,也不以空终止字符终止它。

您可以使用 c.str strin 成员函数返回 C 字符样式下的字符串,然后使用 strcmp 函数(win APi)。 但在打算将 C 数组与转换后的字符串变量进行比较之前,您确实需要确保 C 数组以 null 结尾。


0
投票

为什么不使用 std::string::compare 方法:

BOOST_CHECK(content2.compare(0, length, content1)==0)

0
投票

它与 boost 无关,您可以像在任何其他情况下一样比较

std::string
char *

content2.compare(content1) == 0
content2 == content1

如果您正在编写 C++ 并使用

std::string
那么您应该坚持使用 C++ 而不是使用像
strcmp
这样的 C 函数。

您的代码中还存在其他问题。比如这个作品:

char* content1=new char[length];
content1="abcde";

并不完全按照你的想法去做。首先分配一个

char
数组,然后立即将
content1
指针设置为指向其他内容。这不会将
abcde
复制到您分配的空间中,而是将实际指针更改为内存中的另一个地址。您之前为
content1
分配的空间将永远丢失。

然后你会得到这个:

if(content1 != nullptr)
{
    delete[] content1;
    content1 = nullptr;
}

再次强调,这并不像你想象的那样。它不会释放您在程序开始时使用

new
分配的空间,因为
content1
不再指向该空间。它指向存储
abcde
字符串的内存,但您尚未分配该空间,因此不应尝试释放它。这样做会导致未定义的行为,并且您的程序可能会崩溃或做其他奇怪的事情。

您应该学会注意编译器在编译过程中告诉您的内容。这一行:

content1="abcde";

肯定会生成警告,请仔细阅读并尝试理解它告诉您的内容。


0
投票

其实只是使用

BOOST_TEST

BOOST_TEST 无需额外步骤即可比较它们。

BOOST_AUTO_TEST_CASE( test_strings )
{
  const char* a = "test1";
  const char* b = "test2";
  const char* c = "test1";
  BOOST_TEST(a == b);
  BOOST_TEST(a == c);
}

注意:用户@Logman 在下面的评论中指出了重要问题。

© www.soinside.com 2019 - 2024. All rights reserved.