Qt单元测试(QTestLib)
本文标题:Qt单元测试(QTestLib) 本文地址:http://techieliang.com/2017/12/483/
1. 创建
QTestLib框架提供了一个简单易用的单元测试框架,需要在工程文件中添加Qt+=testlib,或在新建项目是选择“其他项目-qt单元测试”,详细帮助请看qt4.8官方文档,Qt5官方文档
2. 基本操作
- class Untitled2Test : public QObject {
- Q_OBJECT
- public:
- Untitled2Test();
- private Q_SLOTS:
- void initTestCase();
- void cleanupTestCase();
- void testCase1();
- };
- Untitled2Test::Untitled2Test() {
- }
- void Untitled2Test::initTestCase() {
- }
- void Untitled2Test::cleanupTestCase() {
- }
- void Untitled2Test::testCase1() {
- QVERIFY2(true, "Failure");
- }
- QTEST_APPLESS_MAIN(Untitled2Test)
- #include "tst_untitled2test.moc"
注意:
1、每一个测试类(Case)中的每一项测试条目必须在Qt槽中,否则无法调用“private Q_SLOTS:”“private slots:”均可
2、最后两行必须有,单元测试不具有Main函数,使用此函数实现自动添加并调用所有槽
1、initTestCase()will be called before the first testfunction is executed.initTestCase()会在第一个测试函数执行前调用。
2、cleanupTestCase()will be called after the last testfunction was executed.cleanupTestCase()会在最后一个测试函数执行后调用。
3、init()will be called before each testfunction is executed.init()会在每一个测试函数执行前调用。
4、cleanup()will be called after every testfunction.cleanup()会在每一个测试函数执行后调用。
3. 高级操作
3.1. 命令行操作-可以输出调试结果到文本
打开cmd,通过cd命令将目录指向到项目的debug目录下的debug,在此文件内应该可以直接看到测试项目的可执行exe文件,此时出入tst_qttesttest
-xml -vs -lightxml -o testres.txt指令即可导出测试结果保存到texstres.txt文件中。
其中tst_qttesttest为测试项目对应的可执行文件名。
还可以使用以下命令行参数:
- -help
输出可能的命令行参数,并提供一些有益的帮助。 - 的功能
输出在测试中所有测试功能。 - -O?文件名
??写输出到指定的文件,而不是标准输出 - 无声的
沉默输出,只显示警告,失败和最小的状态消息 - -V1
详细输出,输出的进入和退出测试功能的信息。 - -V2
扩展的详细输出;还输出每个QCOMPARE()和QVERIFY() - -VS
输出每个被发出的信号 - -XML
输出XML格式的结果,而不是纯文本 - lightxml
输出结果作为XML标签流 - -eventdelay?毫秒
延迟,如果没有模拟键盘或鼠标(指定QTest :: keyClick(),QTest ::mouseClick()等),从这个参数的值(以毫秒为单位)取代。 - keydelay?MS
类似eventdelay,但只影响模拟键盘而不是鼠标模拟。 - mousedelay?MS
类似eventdelay,但只影响鼠标模拟,而不是键盘模拟。 - -KeyEvent的详细
输出更详细的输出模拟键盘 - – maxwarnings
numberBR设置输出最大数量的警告。无限,默认为0到2000。
- -help
3.2. GUI测试
Qtestlib单元测试提供GUI操作函数,可对控件发送消息后检测执行结果,比如QTest::keyClick(),QTest::mouseClick()等等,详情请见帮助文档
下面提供鼠标操作相关的枚举类型:
| Constant | Value | Description |
|---|---|---|
QTest::MousePress |
0 |
A mouse button is pressed. |
QTest::MouseRelease |
1 |
A mouse button is released. |
QTest::MouseClick |
2 |
A mouse button is clicked (pressed and released). |
QTest::MouseDClick |
3 |
A mouse button is double clicked (pressed and released twice). |
QTest::MouseMove |
4 |
The mouse pointer has moved. |
下面为鼠标相关的操作函数:
- void mouseClick(QWidget *widget, Qt::MouseButton button, Qt::KeyboardModifiers modifier = Qt::KeyboardModifiers(), QPoint pos = QPoint(), int delay = -1)
- void mouseClick(QWindow *window, Qt::MouseButton button, Qt::KeyboardModifiers stateKey = Qt::KeyboardModifiers(), QPoint pos = QPoint(), int delay = -1)
- void mouseDClick(QWidget *widget, Qt::MouseButton button, Qt::KeyboardModifiers modifier = Qt::KeyboardModifiers(), QPoint pos = QPoint(), int delay = -1)
- void mouseDClick(QWindow *window, Qt::MouseButton button, Qt::KeyboardModifiers stateKey = Qt::KeyboardModifiers(), QPoint pos = QPoint(), int delay = -1)
- void mouseMove(QWidget *widget, QPoint pos = QPoint(), int delay = -1)
- void mouseMove(QWindow *window, QPoint pos = QPoint(), int delay = -1)
- void mousePress(QWidget *widget, Qt::MouseButton button, Qt::KeyboardModifiers modifier = Qt::KeyboardModifiers(), QPoint pos = QPoint(), int delay = -1)
- void mousePress(QWindow *window, Qt::MouseButton button, Qt::KeyboardModifiers stateKey = Qt::KeyboardModifiers(), QPoint pos = QPoint(), int delay = -1)
- void mouseRelease(QWidget *widget, Qt::MouseButton button, Qt::KeyboardModifiers modifier = Qt::KeyboardModifiers(), QPoint pos = QPoint(), int delay = -1)
- void mouseRelease(QWindow *window, Qt::MouseButton button, Qt::KeyboardModifiers stateKey = Qt::KeyboardModifiers(), QPoint pos = QPoint(), int delay = -1)
3.3. 结果可视化-AutoTest插件

默认测试结果显示在控制台(应用程序输出标签)以纯文本形式显示,不够直观,可使用AutoTest插件实现可视化效果
通过帮助-关于插件-AutoTest开启即可,启动此插件需要重启Qt Creator,然后再下方会多出TestResults的标签,可直接在此标签点击上方的运行按钮运行所有测试,同时在“工具-Test”也可运行所有测试
此插件可以在运行单元测试后以红、绿色表示明确标记处运行结果,并且以Case为单位显示,可以展开看到具体每一个测试用例的结果。
3.4. 可以用到的测试宏命令
- QBENCHMARK
- QBENCHMARK_ONCE
- QCOMPARE(actual, expected)
- QEXPECT_FAIL(dataIndex, comment, mode)
- QFAIL(message)
- QFETCH(type, name)
- QFINDTESTDATA(filename)
- QSKIP(description)
- QTEST(actual, testElement)
- QTEST_APPLESS_MAIN(TestClass)
- QTEST_GUILESS_MAIN(TestClass)
- QTEST_MAIN(TestClass)
- QTRY_COMPARE(actual, expected)
- QTRY_COMPARE_WITH_TIMEOUT(actual, expected, timeout)
- QTRY_VERIFY2(condition, message)
- QTRY_VERIFY(condition)
- QTRY_VERIFY2_WITH_TIMEOUT(condition, message, timeout)
- QTRY_VERIFY_WITH_TIMEOUT(condition, timeout)
- QVERIFY2(condition, message)
- QVERIFY(condition)
- QVERIFY_EXCEPTION_THROWN(expression, exceptiontype)
- QWARN(message)
3.5. 单元测试注意事项
- 单元测试类中建议不要出现私有成员,尤其是指针,同时不建议在测试函数中建立被测类的指针,而是直接建立被测类的对象,在测试结束后容易遗忘指针。若需要指针
initTestCase中new,在cleanupTestCase中delete。 - 若某个测试函数中出现了new,一定记着delete,且务必让delete在第一个断言前出现,因为断言失败函数就回立刻结束,并把当前函数标记为测试失败。若delete在第一个断言之后,而第一个断言失败则不会执行之后的delete。
- 若测试类必须有私有成员,必须注意一个测试类中的所有函数公用私有成员,不会在每个测试之前刷新状态。
3.6. 被测类为单例时
若被测类为单例,欲对其内所有函数做单元测试,会出现测试第一个函数可以保证测试环境为初始状态,后续测试回因为单例的原因,导致测试时建立在之前操作后的环境下。欲解决此问题,需要删除单例。
单例类如下:
- class SingleModel {
- public:
- static inline SingleModel* get_instance() {
- if (m_instance == nullptr) {
- m_instance = new SingleModel();
- }
- return m_instance;
- };
- private:
- SingleModel();
- class SingletonDel {
- public:
- ~SingletonDel() {
- if (m_instance != nullptr) {
- delete m_instance;
- m_instance = NULL;
- }
- }
- };
- static SingleModel* m_instance;
- static SingletonDel m_singleton_del;
- };
此时使用get_instance可以获得单例的指针,使用delete可以删除单例的空间,但是由于单例实例的指针是静态私有成员的,所以应该将其设置为NULL,否则下次调用get_instance判断非NULL会直接返回之前的已经被删除的空间指针而不进行new操作,导致后续操作错误。
由于m_instance是私有成员,在单元测试时无法进行修改,故做以下设置:
.h文件不变:
- #include <QtTest>
- class ProjectModelTest: public QObject {
- Q_OBJECT
- private Q_SLOTS:
- void TestXXX();
- };
.cpp文件修改:
- #define private public
- #include "project_model.h"
- void ProjectModelTest::TestXXX() {}
注意一定要在include前define,通过将private定义为public,从而实现将源程序的私有成员编程public。同时此处的define在cpp里面,只对此cpp有效,不会影响其余的单元测试。
Qt单元测试(QTestLib)的更多相关文章
- Qt单元测试浅析
Qt单元测试框架,使用于基于Qt的应用程序和库,先从一个简单的demo工程说起吧. 我们可以通过QtCreator来创建一个简单的Qt单元测试工程,夏天到了,这个demo工程的名字就叫Summer好了 ...
- Qt单元测试工具 QTestlib(QVERIFY, QFETCH, QCOMPARE等)
优点: QTestLib提供了单元测试框架的基本功能,并提供了针对GUI测试的扩展功能. 特性 详细描述 轻量级 QTestlib 只包含 6000行代码和 60个导出符号. 自包含 对于非GUI测 ...
- Qt高级——QTestLib单元测试框架
一.QTestLib简介 1.QTestLib简介 QTestLib是Qt提供的一种针对基于Qt编写的程序或库的单元测试框架.QTestLib提供了单元测试框架的基本功能,并提供了针对GUI测试的扩展 ...
- Qt 单元测试
使用Qtcreator 自带的单元测试工具框架QTestlib进行测试. 一.创建一个单元测试程序 new project->other project ->Qt unit test ...
- Qt单元测试
单元测试之作用要完成测试用例,保证设计上的耦合依赖通过测试用例,保证覆盖率,提高程序质量 QTest一些有用的静态函数QTest::qExecQTest::qSleepQTest::qWait 例 ...
- cmake 学习笔记(六)
希望这是现阶段阻碍阅读shiboken和PySide源码的涉及cmake的最后一个障碍 ^ _^ 学习 cmake 的单元测试部分 ctest. 简单使用 最简单的使用ctest的方法,就是在 CMa ...
- QT入门学习笔记2:QT例程
转至:http://blog.51cto.com/9291927/2138876 Qt开发学习教程 一.Qt开发基础学习教程 本部分博客主要根据狄泰学院唐老师的<QT实验分析教程>创作,同 ...
- Qt 工程 pro文件
工作中,感觉pro文件的有些内容真不太懂,现系统性的学习一下.于此备录,分享共勉. 为了更好的理解,先创建一个简单的工程作为实践. [1]创建一个pro文件 1.1 新建proDemo工程.步骤如下: ...
- PyQt类库介绍
安装完PyQt后我们去看看这个库里面有些什么cd /usr/lib/python3/dist-packages/PyQt5/ && ls都是些.so的动态链接库,这就是为什么我们在安 ...
随机推荐
- day 24 内置模块re
1.正则表达式,匹配字符串 正则表达式是对字符串操作的一种逻辑公式.我们一般使用正则表达式对字符串镜子那个匹配和过滤,使用正则的优缺点: 优点: 灵活,功能性强,逻辑性强 缺点: 上手难.一旦上手,会 ...
- centos7下使用n grok编译服务端和客户端穿透内网
(发现博客园会屏蔽一些标题中的关键词,比如ngrok.内网穿透,原因不知,所以改了标题才能正常访问,) 有时候想在自己电脑.路由器或者树莓派上搭建一些web.vpn等服务让自己用,但是自己的电脑一般没 ...
- 采用文件方式安装Python第三方库
由于Python某些第三方库仅提供源代码,通过pip下载文件后无法在Windows系统编译安装,会导致第三方库安装失败.为了解决这类第三方库的安装问题,美国加州大学尔湾分校提供了一个网页,帮助Pyth ...
- fiddler响应报文的headers属性详解
fiddler响应报文的headers属性详解 (1)Cache头域 1. Cache-Control 在请求报文已经说过了,用于设置缓存的属性,浏览内容不被缓存. 2. Data 生成消息的具体时间 ...
- 部署zabbix,自动发现lnmp环境,监控主机状态,实现 邮件及微信报警(配置server端)
二.配置server端监控 1.监控apache 首先在本机下载模板:https://github.com/rdvn/zabbix-templates/archive/master.zip 该 zi ...
- 利用谷歌翻译网站和Adobe Acrobat翻译英文文档,且鼠标放置后显示英文原文(无字数限制)(18/12/11更新)
软件:Adobe Acrobat 网页:https://translate.google.cn/?tr=f&hl=zh-CN 方法: 第一步:用Adobe Acrobat 打开英文 ...
- 关于条件约束问题的无偏差统计——一个偏差控制型生成器(Unbiased Statistics of a Constraint Satisfaction Problem – a Controlled-Bias Generator——by Denis Berthier)
论文地址:https://hal.archives-ouvertes.fr/hal-00641955 Unbiased Statistics of a Constraint Satisfaction ...
- Java设计模式(11)——结构型模式之享元模式(Flyweight)
一.概述 概念 避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类). UML简图 单纯享元模式 角色 抽象享元角色(Flyweight):定义享元子类公共接口 具体享元角色(Co ...
- 宁波Uber优步司机奖励政策(12月21日到12月27日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- ORB-SLAM(五)KeyFrame类-最小生成树
KeyFrame中维护了一个map,保存了与当前帧共视的KeyFrame*与权重(共视MapPonits数量).对关键帧之间关系是用加权有向图来完成的,那么理解其spanning tree生成树的原理 ...