当前位置: 首页 > news >正文

完整教程:测试自动化教程:Parasoft如何流重定向与单元测试自动化

完整教程:测试自动化教程:Parasoft如何流重定向与单元测试自动化

在单元测试中,一个常见的挑战是如何对依赖于标准输入、输出和错误流的函数进行有效测试。例如,一个函数可能通过printf向控制台打印信息,或通过scanf从用户获取输入。在自动化测试环境中,我们无法进行人工交互,因此需要一种方法来模拟这些输入并捕获输出,以便进行验证。

Parasoft C/C++test提供了强大的流重定向API,专门用于解决这一难题。这些API允许测试用例在运行时动态地重定向标准流,将预设的字符串作为“模拟输入”提供给stdin,并捕获写入stdout或stderr的“实际输出”。这样,测试人员就可以像与程序交互一样,全面、自动化地验证那些涉及控制台输入输出的函数行为。

C/C++test提供的流API

定义
CppTest_StreamRedirect CppTest_RedirectStdInput(const char value);将当前测试用例的 stdin 流的值设置为提供的字符串的值。
CppTest_StreamRedirect CppTest_RedirectNStdInput(const char value, unsigned int size)将当前测试用例的 stdin 流的值设置为所提供字符串的第一个 'size' 字符的值。
CppTest_StreamRedirect* CppTest_RedirectStdOutput()重定向当前执行的测试用例的 stdout 流。返回的 CppTest_StreamRedirect 对象可用于验证测试用例后置条件部分中的流内容。在当前测试用例执行结束时自动恢复标准输出流的先前值。
CppTest_StreamRedirect* CppTest_RedirectStdError()为当前执行的测试用例重定向 stderr 流。返回的 CppTest_StreamRedirect 对象可用于验证测试用例后置条件部分中的流内容。在当前测试用例执行结束时自动恢复 stderr 流的先前值。
CppTest_StreamCompare(CppTest_StreamRedirect redirect, const char value)用于验证重定向的 stdout/stderr 流的内容。如果“值”与流值匹配,则返回 0;如果“值”小于流值,则返回小于零的整数;如果“值”大于流值,则返回大于零的整数。
CppTest_StreamNCompare(CppTest_StreamRedirect redirect, const char value, unsigned int size)用于验证重定向的 stdout/stderr 流的内容。如果“值”与流值匹配,则返回 0;如果“值”小于流值,则返回小于零的整数;如果“值”大于流值,则返回大于零的整数。仅比较流的第一个 'size’字符。
int CppTest_StreamSearch(CppTest_StreamRedirect, redirect, const char* pattern)用于验证重定向的 stdout/stderr 流的内容。在重定向流中搜索给定模式。返回在流中找到的模式的索引,如果未找到模式,则返回 -1。
int CppTest_StreamNSearch(CppTest_StreamRedirect redirect, const char pattern, unsigned int size)用于验证重定向的 stdout/stderr 流的内容。在重定向流中搜索给定模式的第一个 'size’字符。返回在流中找到的模式的索引,如果未找到模式,则返回 -1。
char CppTest_StreamReadData(CppTest_StreamRedirect redirect, unsigned int* len)返回一个指向缓冲区的指针,其中包含从重定向流中读取的数据。缓冲区的大小将在 'len' 参数中传回(如果将非空值传递给函数)。缓冲区由 cpptestMalloc()函数分配。应该使用 cpptestFree() 函数释放返回的缓冲区。
void CppTest_StreamReset(CppTest_StreamRedirect* redirect)将 C++test 内部流重置为默认状态。它在测试用例执行结束时为每个重定向流自动完成。

示例

有如下被测函数

int foo() {
int number;
// 从用户获取输入
printf("Please enter an integer: \n");
scanf("%d", &number);
// 使用if-else语句判断输入的数字是否为正数
if (number > 0) {
printf("%d is a positive number.\n", number);
} else if (number < 0) {
printf("%d is a negative number.\n",number);
} else {
printf("This is zero.\n");
}
return number;
}

示例测试用例如下:

/* CPPTEST_TEST_CASE_BEGIN test_foo_m1 */
/* CPPTEST_TEST_CASE_CONTEXT int foo(void) */
void TestSuite_sensor_c_61678bb2_test_foo_m1()
{
/* Pre-condition initialization */
CppTest_StreamRedirect* _stdinStreamRedirect = CppTest_RedirectStdInput("-1\n");
CppTest_StreamRedirect* output_stream = CppTest_RedirectStdOutput();
/* Pre-condition report */
{
/* Tested function call */
int _return  = foo();
int len;
CppTest_StreamReset(_stdinStreamRedirect);
/* Post-condition report */
CPPTEST_REPORT_INTEGER("Output: int _return", ( _return ));
/* Post-condition check */
CPPTEST_POST_CONDITION_INTEGER("int _return", ( _return ));
CPPTEST_POST_CONDITION_CSTR("messages",CppTest_StreamReadData(output_stream, &len));
/* Post-condition check */
CPPTEST_ASSERT_CSTR_EQUAL("Please enter an integer: \n-1 is a negative number.\n",CppTest_StreamReadData(output_stream, &len));
CPPTEST_ASSERT(0 == CppTest_StreamCompare(output_stream, "Please enter an integer: \n-1 is a negative number.\n"));
CPPTEST_ASSERT_INTEGER_EQUAL(-1, ( _return ) );
}
}
/* CPPTEST_TEST_CASE_END test_foo_m1 */

下面是这条测试用例的执行结果:

通过测试结果可以看到Parasoft C/C++test成功通过流重定向API自动化完成了对交互式函数的测试:它精准地模拟了标准输入,捕获并验证了完整的输出信息及返回值,证明了​​​​​​​Parasoft C/C++test在替代人工进行I/O操作测试方面的可靠性。

Parasoft C/C++test提供的流API不仅解决了标准输入输出模拟这一具体测试难题,更体现了其作为全面测试平台的核心理念——通过集成静态分析、单元测试、合规验证等多种能力,为客户构建端到端的代码质量保障体系,最终确保关键系统满足最高的安全与可靠性要求。

http://www.hskmm.com/?act=detail&tid=18776

相关文章:

  • 用 Zig 实现英文数字验证码识别
  • 用 Crystal 实现英文数字验证码识别工具
  • 基于 Nim 的英文数字验证码识别工具实现
  • 完整教程:数组(Java基础语法)
  • AI信任心理学:构建可信赖人工智能系统的实用指南
  • 英语_阅读_Robot
  • 模仿Teamcenter(UIHealthDetector) 实现 系统托盘
  • 一个纯净的自动微分框架—autograd
  • PHP 8.2 vs PHP 8.3 对比:新功能、性能提升和迁移技巧
  • 使用油猴脚本去除浏览器搜索的URL后缀,减少广告
  • 浅谈并分享一种较为高效的学习方法
  • 英语_阅读_Industry 4.0_待读
  • Python获取CPU和内存使用率
  • 解决Python requests库POST请求参数顺序问题
  • 使用Tabs选项卡组件快速搭建鸿蒙APP框架
  • 完整教程:从另一个视角看Transformer:注意力机制就是可微分的k-NN算法
  • ACM 杂题选做 题解合集
  • | 和 || 的区别详解及应用场景对比
  • Kubernetes技巧:使用Prometheus监控Pod性能指标
  • 2025.9.27——1橙
  • 在Java 12环境中配置和部署Apache Tomcat
  • android pdf框架-14,mupdf重排 - 详解
  • 详细介绍:基于物联网的智能衣柜系统的设计(论文+源码)
  • 确定Ceph集群中OSD组件与具体物理磁盘的关联
  • JavaScript加解密实践
  • Linux系统中使用df命令详解磁盘使用情况
  • 读人形机器人24岗位替代
  • 在Ubuntu 18.04/20.04 LTS设置静态DNS服务器
  • 分布式 ID 生成方案实战指南:从选型到落地的全场景避坑手册(三) - 实践
  • 队列+宽搜(BFS)-662.二叉树最大宽度-力扣(LeetCode) - 指南