单元测试常见问题总结
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;
}

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

被折叠的 条评论
为什么被折叠?



