问题描述 #
产品: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在自动生成测试用例时,只能对能够实例化的类里的成员函数生成测试用例。
解决方案 #
那现在的问题是,针对抽象类里的成员函数要怎么测试呢?可按照如下方式:
- 使用测试用例向导的方式手动创建测试用例,如下图所示:
在该测试用例向导中,我们看到对于输入类B的对象给予值时,显示为红色的叉,而且无法选择更改,这也是由于类B的特殊性,但是此次我们不做更改操作,直接点击Finish。 -
查看生成的测试用例
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 )); }
直接运行测试用例,失败,控制台中错误信息如下:
[ab_file.cpp] "f:\sfan\parasoft\Projects\abstract_example\abstract_example\tests\autogenerated\头文件\TestSuite_ab_file_h.cpp", line 249: error: [ab_file.cpp] identifier "_cpptest_TestObject" is undefined [ab_file.cpp] float _return = _cpptest_TestObject.B::fun3(_b); [ab_file.cpp] ^ [ab_file.cpp] [ab_file.cpp] 进程由于代码: 1 (错误)退出。
由于B无法声明一个对象,那么我们生成的测试用例中没有如下一句new一个对象的语句:
::B _cpptest_TestObject;
那在测试用例中使用_cpptest_TestObject时就会报告错误。 - 在测试用例中添加上声明对象的语句
添加上这行语句
::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是抽象类不能生成对象。
- 修改为新建一个指针
对测试用例我们做如下修改,不声明一个新的对象,而是创建一个指针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不能自动生成,但是我们可以结合手动创建以及修改的方式来完成对抽象类中的成员函数的测试。