parasoft c/c++嵌入式单元测试:驱动程序,故障注入

存根和驱动程序

当提到将调用原始的方法/函数替换为调用不同的,我们使用“存根(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 c/c++嵌入式单元测试:驱动程序,故障注入_第1张图片

 

你可能感兴趣的:(c,c,单元测试,嵌入式,/,驱动程序,Parasoft,++test,故障注入)