我的代码如下:
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 *与字符串进行比较? 我已经使用了循环,但我不知道它是否是一个好方法。 有没有更好的解决方案?非常感谢你。
答案 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::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";
肯定会产生警告,仔细阅读并尝试了解它告诉你的内容。
答案 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);
}