Parasoft C++test 单元测试常见问题总结-2

本文总结了使用Parasoft C++test进行QT项目单元测试时遇到的常见问题,包括:缺少moc文件、QT图形界面初始化失败、测试用例启动失败、测试超时以及桩函数的使用。提供了详细的解决方法和桩函数接口的示例。

单元测试常见问题总结

1.QT项目测试环境-没有生成moc_文件

error: LNK2001: 无法解析的外部符号 “public: virtual struct QMetaObject const * …
错误提示如图:
在这里插入图片描述
配置方法如下:
选择需要生成moc文件的类的.h文件,鼠标右键属性,配置属性->常规,在项类型中将C/C++ 标头,改为自定义生成工具,点击应用
在这里插入图片描述
然后将自定义生成工具配置如下:
命令行:“$(QTDIR)\bin\moc.exe” “%(FullPath)” -o “.\GeneratedFiles$(ConfigurationName)\moc_%(Filename).cpp” -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB “-I.\GeneratedFiles” “-I.” “-I$(QTDIR)\include” “-I.\GeneratedFiles$(ConfigurationName).” “-IKaTeX parse error: Undefined control sequence: \include at position 8: (QTDIR)\̲i̲n̲c̲l̲u̲d̲e̲\QtCore" "-I(QTDIR)\include\QtGui” “-I$(QTDIR)\include\QtWidgets” “-I…\SDK\boost” “-I…\inc”
**说明:**Moc%27ing wsthread_client.h
输出:.\GeneratedFiles$(ConfigurationName)\moc_%(Filename).cpp
附加依赖项:$(QTDIR)\bin\moc.exe;%(FullPath)
配置完成后右键点击头文件选择编译,添加筛选器:GeneratedFiles, 然后将生成的moc_XXX.cpp文件添加进项目,重新生成即可
–其他方法:
1.添加筛选器:GeneratedFiles
2.添加->现有项->找到原项目中GeneratedFiles文件夹中 已生成好的moc_文件
3.添加上moc_文件放入筛选器GeneratedFiles,重新生成

2.QT图形界面的类初始化失败的问题

QWidget/QDialog等图形界面的类初始化失败
原因:没有QApplication的实例,界面相关的类无法使用。
选择对应项目右键菜单->parasoft->属性->构建设置,添加-DCPPTEST_INIT_QT=1
在这里插入图片描述

3.测试用例程序启动失败

出现测试日志读取错误,错误信息如下:
在这里插入图片描述按照log提示进入目录,找到xxxx_utestTest.exe,双击,此时会提示却少xxx.dll
在这里插入图片描述
解决方法,找到相关的DLL文件放入该目录即可。

4.由于循环出现测试超时

1.创建该函数桩函数,控制循环条件进入或退出循环
3.其他情况可用C++ test帮助文档提供的处理方式:如下图:
CPPTEST_REGISTER_JMP (expression)
使用setjmp或sigsetjmp并计算传递的表达式。
可以使用CPPTEST_JMP API调用。此宏通常在测试用例中使用
其中它包装对测试函数的调用(请参见以下示例)
CPPTEST_JMP (value)
执行longjmp调用(longjmp或siglongjmp是
已使用),将执行状态恢复为最近调用的CPPTEST_REGISTER_JMP调用。
此宏通常在存根体内部使用。它接受一个整数参数通过cpptestGetJmpReturn函数。整数
参数可用于验证执行的跳转(参见下面的示例)。
int CDECL_CALL cpptestGetJmpReturn();
返回最近的CPPTEST_JMP调用,即longjmp/
siglongjmp,它是setmp/sigsetjmp。
示例:

/* Function to be tested */
void signalData(void)
{
 while(1) { 
 // Get the returning frequency from the frequency sensor.
 if (scanFrequencySensor(returningFrequency) == FAILURE) {
 // If sensor has an error, don't give semaphore, 
 // report error, call recovery and retry
 log_error("The sensor has encountered an error, retrying...\n");
 recover();
 } else {
 semGive(dataSemId);
 taskDelay(DELAY_TICKS);
 }
 }
} 
/* Test case */
/* CPPTEST_TEST_CASE_BEGIN test_signalData */
/* CPPTEST_TEST_CASE_CONTEXT void signalData(void) */
void TestSuite_main_c_883563c3_test_signalData()
{
 /* Pre-condition initialization */
 /* Initializing global variable returningFrequency */ 
 returningFrequency = 0;
 /* Tested function call */
 CPPTEST_REGISTER_JMP(signalData())
 /* Post-condition check */
 CPPTEST_POST_CONDITION_INTEGER("cpptestGetJmpReturn()=", ( 
cpptestGetJmpReturn() ));
 CPPTEST_ASSERT_INTEGER_EQUAL(0, ( returningFrequency ));
}
/* CPPTEST_TEST_CASE_END test_signalData */
/* Stub */
/** User stub definition for function: int scanFrequencySensor(int) */
EXTERN_C_LINKAGE int scanFrequencySensor (int returningValue) ;
EXTERN_C_LINKAGE int CppTest_Stub_scanFrequencySensor (int returningValue) 
{
 static unsigned int counter = 0;
 unsigned int ret = 0;
 counter++;
 //Simulate failure every 5 scans of the sensor
 if (counter == 5) {
 CPPTEST_REPORT("Simulating sensor scan failure")
 ret = FAILURE;
 } else if (counter == 10) {
 CPPTEST_REPORT("Testing accomplished - going back to test case for assertions 
check")
 CPPTEST_JMP(counter)
 } else {
 ret = scanFrequencySensor(returningValue);
 }
 return ret;
}

When C++test executes the TestSuite_main_c_883563c3_test_signalData test case, it saves the jump
buffer prior to calling the tested function. When the tested code executes, it performs the call to
CPPTEST_JMP from the CppTest_Stub_scanFrequencySensor stub body, which transfers code
execution back to the test case to perform assertions checks.

5.桩函数常用接口

CppTest_GetCurrentTestCaseName()
CppTest_GetCurrentTestSuitName()
获取当前测试用例及测试套件名称,由此可确认唯一测试用例,实现通过桩函数为不同的测试用例设置不同的测试条件
某待测函数中函数中多次调用某函数,且每次需返回不同的返回值,可通过桩函数执行次数设置不同的返回值。
示例:

 static int count = 0;
  ......
  if (strcmp("TestSuite_abc_cpp_f0118097", CppTest_GetCurrentTestSuiteName()) == 0 && strcmp("test_init_6", CppTest_GetCurrentTestCaseName()) == 0)
    {
        int __return;
        if (count == 3)
        {
        	count = 0;
            __return =  0;
        }
        count++;
        return __return;
    }

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值