【问题标题】:How to compare char* with string in boost unit test?如何在 boost 单元测试中将 char* 与字符串进行比较?
【发布时间】:2016-06-10 19:59:37
【问题描述】:

我有如下代码:

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? 我使用过循环,但我不知道这是否是一个好方法。 有没有更好的解决方案?非常感谢。

【问题讨论】:

  • char* content1=new char[length]; content1="abcde"; 从修复它开始。和固定的循环长度。然后看strcpystrcmp,还有.c_str()
  • 我想知道您认为这种“单元测试”的价值是什么。您无需测试标准库类是否有效。

标签: c++ unit-testing loops testing boost


【解决方案1】:

使用strcmp比较:

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

【讨论】:

  • 这是一个很好的解决方案,但我想在 boost 单元测试中进行比较。
  • 我不知道,因为我几乎没有使用 boost 的经验,但是 BOOST_CHECK( strcmp(s.c_str(),c)==0 ); 不会工作吗?
【解决方案2】:

其实只是用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);
}

【讨论】:

    【解决方案3】:

    使用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"
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

          这与 boost 无关,您可以像在任何其他情况下一样比较 std::stringchar *

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

          如果您正在编写 C++ 并使用 std::string,那么您应该坚持使用 C++,而不是使用像 strcmp 这样的 C 函数。

          您的代码中还有其他问题。比如这件作品:

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

          并没有完全按照你的想法做。您首先分配一个chars 数组,然后立即将content1 指针设置为指向其他对象。这不会将abcde 复制到您分配的空间中,它会将实际指针更改为内存中的另一个地址。您之前为content1 分配的空间将永远丢失。

          然后你有这个:

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

          再说一次,这并不像你想象的那样。它不会释放您在程序开始时使用new 分配的空间,因为content1 不再指向该空间。它指向存储abcde 字符串的一些内存,但您尚未分配该空间,因此您不应该尝试释放它。这样做会导致未定义的行为,并且您的程序可能会崩溃或做其他奇怪的事情。

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

          content1="abcde";
          

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-05-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-08-10
            • 2019-02-27
            • 1970-01-01
            相关资源
            最近更新 更多