提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
原创|使用教程|编辑:龚雪|2015-12-16 14:11:59.000|阅读 933 次
概述:关于Parasoft C / C ++test的嵌入式单元测试实践,本文主要介绍了单元测试的驱动程序和故障注入。
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
相关链接:
当提到将调用原始的方法/函数替换为调用不同的,我们使用“存根(stubs)”这个词,或“驱动程序(drivers)” (因为它可以驱动执行你想要的地方)。这有利于避免与现实网络、数据库、硬件或强制执行进入指定的路径互相影响。C++test 可以使用原来的符号,自动生成存根或提供自己的存根。如果您选择提供自己的存根,它会生成一个文件,并以合适的功能命名它。你可以根据需要修改这个文件。在用户存根中,您可以使用C++test API推出给定存根的调用地址,改变相应的行为。你也可以将断言放入存根,并从存根中调用原始符号。在ASR例子中,我们不使用存根驱动执行就能够达到100%的语句覆盖率。然而,在多数情况下,存根是必要的。因此,一个简便的存根机制是不可或缺的。
尽管存根不要求实现覆盖目标,但在本例中是有用的:没有在单元测试中驱动执行,而是驱动执行整个应用程序。我们可以在工作系统中注入故障,来看看将导致什么后果。试想一下,负责测量车轮转速的光元件突然发生故障。我们如何在测试过程中模拟系统的这种情况呢?我们当然不能直接把元件破坏掉,因为价格很贵。而且不不必模拟所有可能的缺陷。我们只需模拟该存根功能的错误行为。在我们现实中,当处理程序中断时,速度从适当的端口读取。中断处理程序存根不是特别方便,它需要修改矢量地图。但有更简单的方法,我们可以直接使用已经从中断处理程序获取的数据进行存根函数。本示例中为“update_speed”函数。它是从主循环调用,根据原始数据计算速度。然后,根据从正常运作的光元件获得的实际数据,我们可以模拟故障行为:回归 非常高的速度,或者零,或两者交错。
然后,整个应用程序可以被上传到电路板,并运行常规功能,物理测试。接着,测试人员可以看到模拟系统故障下的行为方式。自动生成代码覆盖率报告。
这是一个很常见的场景,代码应与输入的参数进行多种组合测试。他们可能是数,字节流,字符缓冲区等。这样就无需准备很多测试用例了(每一种组合相当于一个测试用例)。这样从外部数据源赋值会简便的多。这对于可维护性来说有巨大的好处。C++test 支持多种类型的数据源:内置表,CSV文件,Excel电子表格,数据库连接或者几种组合。你只需要配置所选择的的数据源,然后使用测试用例向导创建测试用例。或者,你可以直接调用C++test API,从数据源中获取值。本示例中,我们需要额外添加两个测试用例,来达到100%的语句覆盖率。但如果我们需要测试更多的组合,所需测试用例的数量将开始增长。对于路径覆盖或
MC / DC覆盖,需要多引入一些测试案例。因此,使用数据源的值设计测试用例和参数是更好的选择。测试用例如下所示:
CPPTEST_TEST_SUITE(TestSuite_proc_c_1b9a6284); (…) CPPTEST_TEST_DS(TestSuite_proc_c_1b9a6284_test_brake_control_ds, CPPTEST_DS(“brake_control_data”)); CPPTEST_TEST_SUITE_END(); (…) /* CPPTEST_TEST_CASE_BEGIN test_brake_control_ds */ /* CPPTEST_TEST_CASE_CONTEXT void brake_control(s32 *, s32 *, s32) */ void TestSuite_proc_c_1b9a6284_test_brake_control_ds() { /* Pre-condition initialization */ /* Initializing argument 1 (brk1_sig_ptr) */ s32 _brk1_sig_ptr_6 = CPPTEST_DS_GET_INTEGER(“brk1_sig”); s32 * _brk1_sig_ptr = & _brk1_sig_ptr_6; /* Initializing argument 2 (brk2_sig_ptr) */ s32 _brk2_sig_ptr_7 = CPPTEST_DS_GET_INTEGER(“brk2_sig”); s32 * _brk2_sig_ptr = & _brk2_sig_ptr_7; /* Initializing argument 3 (spd_diff) */ s32 _spd_diff = CPPTEST_DS_GET_INTEGER(“speed_diff”); /* Initializing global variable Speed_Diff_Threshold */ { Speed_Diff_Threshold = 10; } /* Initializing global variable Brake_Signal_Coeff */ { Brake_Signal_Coeff = 10; } { /* Tested function call */ brake_control(_brk1_sig_ptr, _brk2_sig_ptr, _spd_diff); /* Post-condition check */ CPPTEST_ASSERT_INTEGER_EQUAL(CPPTEST_DS_GET_INTEGER(“brk1_sig_out”), *_brk1_sig_ptr ); CPPTEST_ASSERT_INTEGER_EQUAL(CPPTEST_DS_GET_INTEGER(„brk2_sig_out”), *_brk2_sig_ptr); } } /* CPPTEST_TEST_CASE_END test_brake_control_ds */
上面示例中,C++test遍历行从:“brake _control_data” 数据源;调用“brake_ control”功能的值(来自“brk1_sig_out” 和“brk2_sig_out”)。为数据源填充正确的值需要花费一段时间。若你不能当即确定正确的值,你需要执行测试用例,观察和验证结果,然后复制到数据源中。
购买最新正版授权Parasoft赠送Macbook!""
慧都年终盛典火爆开启,一年仅一次的最强促销,破冰钜惠不容错过(12.01~12.31)!!优惠详情点击查看>>
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn
本文探讨 SQL Server 中 NULL 和空值之间的区别,并讨论如何有效地处理它们。
Unity 是一款功能极其丰富的游戏引擎,允许开发人员将各种媒体集成到他们的项目中。但是,它缺少最令人兴奋的功能之一 - 将 Web 内容(例如 HTML、CSS 和 JavaScript)直接渲染到 3D 场景中的纹理上的能力。在本文中,我们将介绍如何使用 DotNetBrowser 在 Unity3D 中将 Web 内容渲染为纹理。
DevExpress v24.2帮助文档正式发布上线了,请按版本按需下载~
本教程将向您展示如何用MyEclipse构建一个Web项目,欢迎下载最新版IDE体验!
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@pclwef.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢