如何在增强单元测试中将char *与字符串进行比较?

时间:2016-02-27 15:16:09

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

我的代码如下:

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;
    }
}

问题是如何在增强单元测试中将char *与字符串进行比较? 我已经使用了循环,但我不知道它是否是一个好方法。 有没有更好的解决方案?非常感谢你。

6 个答案:

答案 0 :(得分:1)

使用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 :(得分:0)

使用strcmp进行比较:

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

答案 2 :(得分:0)

您创建一个固定长度的数组时,您的代码设计存在缺陷,即使您打算将其与字符串进行比较,也不会使用空终止字符终止它。

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

它与提升无关,您可以将std::stringchar *与其他任何情况进行比较:

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";

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

答案 5 :(得分: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);
}