本主题说明如何让测试检查发送到标准输出或标准错误流的数据。这是通过与 C++test Stream API 交互完成的,该 API 专为使用标准输入/输出流而设计。该 API 允许对流进行操作和内容验证。

各节内容包括:

使用 C++test Stream API

要使测试检查发送到标准输出或标准错误流的数据,请执行以下操作:

  1. 要在测试用例执行之前重定向流,请使用以下功能之一:

    CppTest_StreamRedirect* CppTest_RedirectStdOutput()
     
    CppTest_StreamRedirect* CppTest_RedirectStdError()

    CppTest_StreamRedirect* CppTest_RedirectStdOutput()CppTest_StreamRedirect* CppTest_RedirectStdError() 返回指向特殊内部 C++test 结构或 NULL 的指针(如果发生错误)。该指针可以稍后在其他流重定向功能中使用,如图所示Example

  2. 要将流的内容与以空值终止的字符串或数据缓冲区进行比较,请使用以下函数:

    CppTest_StreamCompare(CppTest_StreamRedirect* redirect, const char* value);
     
    CppTest_StreamNCompare(CppTest_StreamRedirect* redirect, const char* value, unsigned int size);

    如果值与流值匹配,则两个函数均返回 0;如果值小于流值,则返回小于零的整数;如果值大于流值,则返回大于零的整数。

    CppTest_StreamCompare 行为类似于 strcmp。

    要使用函数从流中获取整个数据缓冲区,请使用char* CppTest_StreamReadData(CppTest_StreamRedirect* redirect, unsigned int* len); 该函数将指针与流中的数据一起返回到缓冲区。缓冲区的大小将在len 参数中传递回去。缓冲区是使用malloc函数分配的。您有责任释放此缓冲区。

  3. 要设置输入流的值,请使用以下初始化函数:

    CppTest_StreamRedirect* CppTest_RedirectStdInput(const char* value); 
     
    CppTest_StreamRedirect* CppTest_RedirectNStdInput(const char* value, unsigned int size)

    这些函数将输入流设置为提供的字符串的值(在第二种情况下使用 N 个字符)。

  4. 在测试用例结束时,将 C++test 内部流重置为默认状态

    void CppTest_StreamReset(CppTest_StreamRedirect* redirect);

示例

/* CPPTEST_TEST_CASE_BEGIN foo_test */
void TestSuite::foo_test()
{
  /* Pre-condition initialization */
  CppTest_StreamRedirect* output_stream = CppTest_RedirectStdOutput();
 
  /* Tested function call */   ::foo();
 
  /* Post-condition check */
  /* This assert validates that "Output string" is put by foo() on standard output. */
  CPPTEST_ASSERT(0 == CppTest_StreamCompare(output_stream, "Output string"));
  CppTest_StreamReset(output_stream);
}
/* CPPTEST_TEST_CASE_END foo_test */
 
/* CPPTEST_TEST_CASE_BEGIN bar_test */
void TestSuite_a_0::bar_test()
{
  /* Pre-condition initialization */
  CppTest_StreamRedirect* input_stream = CppTest_RedirectStdInput("Hello World!\n");
 
  /* Tested function call */
  /* bar() reads standard input and returns the string */   
  std::string ret = ::bar();
 
  /* Post-condition check */
  CPPTEST_ASSERT(ret == "Hello World!");   
  CppTest_StreamReset(input_stream);
}
/* CPPTEST_TEST_CASE_END bar_test */
  • No labels