配置步骤
-
我的环境
同工程下的两个项目,QUnitTestDemo为待测试项目,QUnitTestDemoUnit为单元测试项目
- 配置步骤
- 新建单元测试项目,项目类型可以随意定,但是最好是基于QT的项目,没有特殊要求可以选择QT空项目,需要界面展示也可以选择GUI项目
- 增加单元测试类,继承自QObject即可。执行测试的函数可以定义为private slots类型,QTest会依次对每一个定义为private slots的函数进行测试。但是有四个(private slots)函数比较特殊
函数名 | 作用描述 |
---|---|
initTestCase() | 在第一个用例被调用之前,该函数执行,我用来做一些初始化工作 |
cleanupTestCase() | 最后一个用例执行之后,该函数执行,做一些收尾/反初始化工作 |
init() | 每一个用例执行之前,该函数会执行 |
cleanup() | 每一个用例执行之后,该函数会执行 |
-
配置测试项目的包含目录和库目录
包含目录为待测试项目的头文件所在目录,方便单元测试项目引用。
库目录为待测试项目生成编译过程的目录,根据实际情况配置为Debug/Release/其它
- 先将待测试项目编译一遍,生成*.obj文件,这是为了方便下一步操作。*.obj文件存放于待测试项目的Debug(Release)目录。也就是上一步添加的库目录
-
在链接器—输入中添加依赖项,依赖项为目标类在编译过程中产生的*.obj文件。对于每个目标类,需要添加的obj文件有两个,类名.obj和moc_类名.obj。(严格来说这种说法不准确,为了便于描述,暂时先这么说,实际上OBJ应该和CPP相关)
比如我当前需要测试的类为CReadyUnit类,需要添加的依赖项为:CReadyUnit.obj,moc_CReadyUnit.obj - 一般情况使用QTEST_MAIN宏传入测试类名来执行单元测试类,但我没有这么做,我自定义main函数,使用QTest::qExec来执行测试。这样的话即使单元测试类比较多,可以依次执行;QTEST_MAIN我不熟悉如何控制。
针对普通的数据接口
待测类定义如下
class CReadyUnit : public QObject
{
Q_OBJECT
public:
int unitSum(int x, int y);
};
int CReadyUnit::unitSum(int x, int y)
{
return x + y;
}
单元测试类定义如下
#include <QObject>
#include <QTest>
class CReadyUnitSimpleUnit : public QObject
{
Q_OBJECT
private slots:
void unitReadyUnit();
};
void CReadyUnitSimpleUnit::unitReadyUnit()
{
CReadyUnit readyUnit;
QVERIFY(readyUnit.unitSum(1, 2) == 2);
}
main函数如下
#include "CReadyUnitSimpleUnit.h"
int main()
{
CReadyUnitSimpleUnit simpleUnit;
QTest::qExec(&simpleUnit);
}
执行结果如下:
未通过,显示出错的代码行数,,如果通过的话,执行结果如下:
针对异步的信号槽机制
在基于QT的单元测试项目中,可以像普通项目一样使用信号槽连接函数connect,因此,对于信号槽机制,其实和普通的QT函数测试大同小异。只是可能需要一个成员变量类记录当前返回数值的期望结果。对于有些延迟较高的信号槽,还需要设置QEventLoop进行同步等待。
待测类定义如下:
class CReadyUnit : public QObject
{
Q_OBJECT
public:
void unitSum(int x, int y);
signals:
void sunFinished(int sum);
};
void CReadyUnit::unitSum(int x, int y)
{
emit sunFinished(x + y);
}
单元测试类定义如下:
class CReadyUnitSimpleUnit : public QObject
{
Q_OBJECT
private slots:
void unitReadyUnit();
private slots:
void slotsVerifySum(int sum);
};
void CReadyUnitSimpleUnit::unitReadyUnit()
{
CReadyUnit readyUnit;
connect(&readyUnit, &CReadyUnit::sunFinished, this, &CReadyUnitSimpleUnit::slotsVerifySum);
readyUnit.unitSum(1, 2);
}
void CReadyUnitSimpleUnit::slotsVerifySum(int sum)
{
QVERIFY(sum == 2);
}
执行结果如下
修改用例后,测试通过的结果如下:
版权声明:本文为QQ1113130712原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。