QT VS Tool添加单元测试项目

  • Post author:
  • Post category:其他




配置步骤
  • 我的环境

    同工程下的两个项目,QUnitTestDemo为待测试项目,QUnitTestDemoUnit为单元测试项目

    在这里插入图片描述
  • 配置步骤
  1. 新建单元测试项目,项目类型可以随意定,但是最好是基于QT的项目,没有特殊要求可以选择QT空项目,需要界面展示也可以选择GUI项目
  2. 增加单元测试类,继承自QObject即可。执行测试的函数可以定义为private slots类型,QTest会依次对每一个定义为private slots的函数进行测试。但是有四个(private slots)函数比较特殊
函数名 作用描述
initTestCase() 在第一个用例被调用之前,该函数执行,我用来做一些初始化工作
cleanupTestCase() 最后一个用例执行之后,该函数执行,做一些收尾/反初始化工作
init() 每一个用例执行之前,该函数会执行
cleanup() 每一个用例执行之后,该函数会执行
  1. 配置测试项目的包含目录和库目录

    包含目录为待测试项目的头文件所在目录,方便单元测试项目引用。

    库目录为待测试项目生成编译过程的目录,根据实际情况配置为Debug/Release/其它

    在这里插入图片描述
  2. 先将待测试项目编译一遍,生成*.obj文件,这是为了方便下一步操作。*.obj文件存放于待测试项目的Debug(Release)目录。也就是上一步添加的库目录
  3. 在链接器—输入中添加依赖项,依赖项为目标类在编译过程中产生的*.obj文件。对于每个目标类,需要添加的obj文件有两个,类名.obj和moc_类名.obj。(严格来说这种说法不准确,为了便于描述,暂时先这么说,实际上OBJ应该和CPP相关)

    比如我当前需要测试的类为CReadyUnit类,需要添加的依赖项为:CReadyUnit.obj,moc_CReadyUnit.obj
  4. 一般情况使用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 版权协议,转载请附上原文出处链接和本声明。