Loading
0

Parasoft C/C++test如何对抽象类的成员函数做单元测试

单元测试作为软件质量保障的重要环节,对确保代码逻辑正确性具有关键作用。Parasoft C/C++test作为一款专业的自动化测试工具,广泛用于C/C++语言的静态分析、单元测试及覆盖率验证。然而,在实际测试过程中,抽象类因包含纯虚函数而无法直接实例化,导致其成员函数的自动化测试面临挑战。下面将会深入探讨如何在C++test环境中通过手动创建与适配测试用例的方式,实现对抽象类中非虚成员函数的有效测试。

>>点击获取Parasoft C/C++test试用

问题描述

产品:C++test 9.5

环境:Windows

问题:C++test抽象类单元测试

现象:对抽象类,无法声明对象,如何测试抽象类里的成员函数呢?

详细现象

现在我们对我们的两个类(类 A和类 B)生产测试用例,其中类 A是一般的类,类B为抽象类,也就是类B里含有至少一个纯虚函数:

class A
{
    public:
        virtual int fun_vir(int a){ return a;}
        A(int a);
    private:
        A();
        int c;
};

class B
{
    public:
        virtual int fun_vir_2(int a) = 0;
        float fun3(float b)
        {
            return b+3.0;
        }
        B();
    private:   
        int d;
        static A cl_a;
};

我们得到如下所示的控制台提示信息


也就是对类B里的成员函数无法生成测试用例,此处也是因为B是一个抽象类,无法声明对象,无法实例化,而C++test在自动生成测试用例时,只能对能够实例化的类里的成员函数生成测试用例。

解决方案

那现在的问题是,针对抽象类里的成员函数要怎么测试呢?可按照如下方式:

1.使用测试用例向导的方式手动创建测试用例,如下图所示:


在该测试用例向导中,我们看到对于输入类B的对象给予值时,显示为红色的叉,而且无法选择更改,这也是由于类B的特殊性,但是此次我们不做更改操作,直接点击Finish

2.查看生成的测试用例

void TestSuite_ab_file_h_4fa5696c::test_fun3()
{
/* Pre-condition initialization */
/* Initializing argument 0 (this) */

/* Initializing argument 1 (b) */
float _b  = 0.0f;
/* Tested function call */
float _return  = _cpptest_TestObject.B::fun3(_b);
/* Post-condition check */
CPPTEST_POST_CONDITION_FLOAT("float _return", ( _return ));
CPPTEST_POST_CONDITION_INTEGER(" _cpptest_TestObject.d", ( _cpptest_TestObject.d ));
}

直接运行测试用例,失败,控制台中错误信息如下:

void TestSuite_ab_file_h_4fa5696c::test_fun3()
{
/* Pre-condition initialization */
/* Initializing argument 0 (this) */

/* Initializing argument 1 (b) */
float _b  = 0.0f;
/* Tested function call */
float _return  = _cpptest_TestObject.B::fun3(_b);
/* Post-condition check */
CPPTEST_POST_CONDITION_FLOAT("float _return", ( _return ));
CPPTEST_POST_CONDITION_INTEGER(" _cpptest_TestObject.d", ( _cpptest_TestObject.d ));
}

由于B无法声明一个对象,那么我们生成的测试用例中没有如下一句new一个对象的语句:

::B _cpptest_TestObject;

那在测试用例中使用_cpptest_TestObject时就会报告错误。

3.在测试用例中添加上声明对象的语句

添加上这行语句

::B _cpptest_TestObject;

运行,仍然失败:

[ab_file.cpp] "f:\sfan\parasoft\Projects\abstract_example\abstract_example\tests\autogenerated\头文件\TestSuite_ab_file_h.cpp", line 245: error:
[ab_file.cpp]           object of abstract class type "B" is not allowed:
[ab_file.cpp]             function "B::fun_vir_2" is a pure virtual function
[ab_file.cpp]       ::B _cpptest_TestObject;
[ab_file.cpp]           ^

原因是,B是抽象类不能生成对象。

4.修改为新建一个指针

对测试用例我们做如下修改,不声明一个新的对象,而是创建一个指针

void TestSuite_ab_file_h_4fa5696c::test_fun3()
{
/* Pre-condition initialization */
/* Initializing argument 0 (this) */
::B * _cpptest_TestObject;
/* Initializing argument 1 (b) */
float _b  = 0.0f;
/* Tested function call */
float _return  = _cpptest_TestObject->B::fun3(_b);
/* Post-condition check */
CPPTEST_POST_CONDITION_FLOAT("float _return", ( _return ));
}

同样运行,成功。

测试套件开始: TestSuite_ab_file_h_4fa5696c
测试用例开始: test_fun3
结果: float _return=3.000000e+000
状态: OK
测试用例结束: test_fun3
测试套件结束: TestSuite_ab_file_h_4fa5696c

并且我们得到了覆盖率信息:

从上文中可知,对于抽象类中的成员函数,C++test不能自动生成,但是我们可以结合手动创建以及修改的方式来完成对抽象类中的成员函数的测试。

通过手动创建测试用例并结合适当的代码调整,Parasoft C/C++test能够有效解决抽象类成员函数的单元测试难题。这一方法不仅扩展了工具在复杂场景下的适用性,也体现了其灵活应对不同代码结构的能力。除抽象类测试外,C++test还提供静态代码分析、运行时错误检测、覆盖率度量等综合功能,帮助客户在持续集成与开发早期阶段发现潜在缺陷,提升代码质量与可维护性,最终为高可靠性软件的交付提供全面支撑。

关于慧都

慧都科技(EVGET)成⽴于2003年,是⼀家⾏业数字化解决⽅案公司,⻓期专注于软件、油⽓与制造⾏业。公司基于深⼊的业务理解与管理洞察,以系统化的业务建模驱动技术落地,帮助企业实现智能化运营与⻓期竞争优势。

慧都科技作为Parasoft公司在中国区的官方授权合作伙伴,为国内企业提供Parasoft C/C++test产品的正版授权、定制化部署与全生命周期技术支持与服务。我们致力于助力客户精准贯彻功能安全标准、全面提升软件开发效率、有效管控项目风险,最终构建符合国际标准的高质量软件体系。