Qt单元测试--基本使用-程序员宅基地

技术标签: Qt  Qt单元测试--基本使用  

Qt单元测试--基本使用

2018年03月19日 16:27:11 zzwdkxx 阅读数 332更多

个人分类: Qt

转自:http://blog.csdn.net/yizhou2010/article/details/78272505

框架生成

QtTestLib框架提供了一个简单易用的单元测试框架,首先我们通过Qt Creator自动创建一个测试框架。 

创建名为MyTest的项目 

选择QtGui和QtWidget(根据测试项目需要选定) 

类名:MyTest,槽函数testQString,类型选择“性能测试”(会自动添加宏QBENCHMARK),同时勾选“使用测试数据库”,“需要QApplication”, 
 
- 使用测试数据集:会自动添加测试数据集槽函数,即testQString_data 
- 需要QApplication:勾选的话,自动调用宏QTEST_MAIN;不勾选的话,自动调用宏 QTEST_APPLESS_MAIN;两者都是实现mian()函数,但是后者不会实例化QApplication对象; 
- 生成初始化和清理代码:如果勾选的话,会自动添加initTestCase()cleanupTestCase()函数;

之后默认选择,这样Qt Creator就为我们自动生成了一个测试模板。我们可以看到测试模板定义了一个继承于QObject的测试类MyTest,包括void testQString_data()void testQString()两个槽函数,宏QTEST_MAIN,以及#include "tst_mytest.moc"(这是因为我们的类申明和实现都在同一个.cpp文件中,所以必须包含.moc文件)。另外我们打开项目中.pro文件,可以发现已经添加了QT += testlib

下面我们来添加需要测试的内容。

QString类中函数toUpper()的测试

1.在测试数据集中添加需要测试的数据

 
  1. void MyTest::testQString_data()

  2. {

  3. QTest::addColumn<QString>("string");

  4. QTest::addColumn<QString>("result");

  5. QTest::newRow("lower") << "hello"<<"HELLO";

  6. QTest::newRow("mix")<<"HellO"<<"HELLO";

  7. QTest::newRow("upper")<<"HELLO"<<"HELLO";

  8. }

我们通过addColumn()函数定义两个为QString类型的元素列,分别取名为string和result。另外通过newRow()函数添加了三条测试数据集,分别取名为lower、mix和upper。由此,我们可以得到一张测试数据表:

序号 名称 string(QString) result(QString类)
0 lower “hello” “HELLO”
1 mix “HellO” “HELLO”
2 Upper “HELLO” “HELLO”

2.在测试槽函数中添加需要测试的函数

  1. void MyTest::testQString()

  2. {

  3. QFETCH(QString, string);

  4. QFETCH(QString, result);

  5. QCOMPARE(string.toUpper(), result);

  6. QBENCHMARK {

  7. string.toUpper();

  8. }

  9. }

我们通过宏QFETCH获取测试数据表中的测试数据,其第一个参数为元素列的类型,第二个参数为元素列名称(与数据表中定义一致),并通过宏QCOMPARE来比较函数执行返回的值与期望的值是否一致。另外通过宏QBENCHMARK来测试函数的性能,该宏会多次调用函数去做较为精确的测量。

构建并运行程序,我们可以得到如下输出:

 
  1. ********* Start testing of MyTest *********

  2. Config: Using QtTest library 5.9.1, Qt 5.9.1 (i386-little_endian-ilp32 shared (dynamic) debug build; by MSVC 2015)

  3. PASS : MyTest::initTestCase()

  4. PASS : MyTest::testQString(lower)

  5. RESULT : MyTest::testQString():"lower": 0.0015 msecs per iteration (total: 51, iterations: 32768)

  6. PASS : MyTest::testQString(mix)

  7. RESULT : MyTest::testQString():"mix": 0.0013 msecs per iteration (total: 88, iterations: 65536)

  8. PASS : MyTest::testQString(upper)

  9. RESULT : MyTest::testQString():"upper": 0.00027 msecs per iteration (total: 72, iterations: 262144)

  10. PASS : MyTest::cleanupTestCase()

  11. Totals: 5 passed, 0 failed, 0 skipped, 0 blacklisted, 936ms

  12. ********* Finished testing of MyTest *********

GUI 事件测试

首先我们在测试类MyTest中添加两个槽函数testGui_data()testGui()来测试QLineEdit中事件响应。 
1.添加测试数据集

  1. void MyTest::testGui_data()

  2. {

  3. QTest::addColumn<QTestEventList>("event");

  4. QTest::addColumn<QString>("result");

  5.  
  6. QTestEventList list1;

  7. list1.addKeyClicks("hello world");

  8. QTest::newRow("item 0 ")<<list1<<QString("hello world");

  9.  
  10. QTestEventList list2;

  11. list2.addKeyClicks("abs0");

  12. list2.addKeyClick(Qt::Key_Backspace);

  13. QTest::newRow("item 1")<<list2<<QString("abs");

  14. }

同样,我们通过addColumn()函数分别定义了一个名为event的QTestEventList类型和一个名为result的QStirng类型,并通过newRow()函数添加了两条测试数据集。

2.事件测试实现

  1. void MyTest::testGui()

  2. {

  3. QFETCH(QTestEventList, event);

  4. QFETCH(QString, result);

  5.  
  6. QLineEdit lineEdit;

  7. event.simulate(&lineEdit);

  8. QCOMPARE(lineEdit.text(), result);

  9. }

通过QTestEventList::simulate()来模拟列表中的事件,同样用宏QFETCH来加载测试数据,用宏QCOMPARE来进行比较。

构建并运行程序,可以在测试输出信息中发现:

  1. PASS : MyTest::testGui(item 0 )

  2. PASS : MyTest::testGui(item 1)

Qt Test命令行参数

在测试过程中,我们需要输出哪些信息,是否输出到文件,测试选项,性能测试选项等的配置,都可以通过Qt Test命令行参数进行配置,具体的语法如下:

testname [options] [testfunctions[:testdata]]...
  •  

所有选项参数说明可以官网http://doc.qt.io/qt-5/qtest-overview.html,下面是两个常用的选项: 
-o filename.format(格式包括:txt, xml, csv…… ):将测试信息输出到指定格式的指定文件; 
-silent:仅输出错误信息;

Qt Creator中配置命令行参数选项的方法:“项目”->“Run”->“Command line arguments”中配置相关选项。 

文中示例程序可参照:MyTest

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Johnable/article/details/94036715

智能推荐

经验:调教200多个ChatGPT模型后的经验分享_经验chart gpt-程序员宅基地

文章浏览阅读8.6k次,点赞4次,收藏23次。经验:调教200多个ChatGPT模型后的经验分享_经验chart gpt

tcpip测试工具软件,TCP Test Tool(TCP测试工具) V2.3 官方版-程序员宅基地

文章浏览阅读1w次。TCP Test Tool是一个小巧实用的TCP测试工具,它提供向任何WindowsPC或从任何WindowsPC启动和捕获TCP会话请求的能力。软件专为软件程序员和网络工程师设计,可用于任何IP网络,包括以太网局域网和无线IP网络,如CDPD、CDMA或GPRS。【功能特点】1.支持发送汉字。2.支持十六进制发送和接收方式。3.支持协议发送和接收数据。支持服务器模式和客户端模式。服务器模式主..._tcp测试工具

「Photoshop2021入门教程」新功能——快速操作_ps2021没有快速操作-程序员宅基地

文章浏览阅读1.1k次。PS新手教程哪里有?小编为大家带来Photoshop2021新手系列教程,今天我们来学习PS新功能——快速操作面板。打开图片菜单栏点击帮助-Photoshop帮助...弹出发现窗口,选择快速操作在快速操作中可以对图片进行快速操作,如移除背景模糊背景制作黑白背景等等,一键操作非常方便。你学会PS2021新功能快速操作了么?..._ps2021没有快速操作

如何根据程序崩溃时的DMP文件使用WinDbg查找调用堆栈_dump 直接打开看堆栈用什么工具windbg-程序员宅基地

文章浏览阅读9.6k次。如何根据程序崩溃时的DMP文件使用WinDbg查找调用堆栈 HOW TO: 查找问题的异常堆栈时出现的 UnhandledExceptionFilter 调用堆栈跟踪中http://support.microsoft.com/kb/313109/zh-cn察看本文应用于的产品 本页概要 使用 Windbg.exe 打_dump 直接打开看堆栈用什么工具windbg

学习小组结伴_第一行是一个整数n,表明n个同学。(2<=n<=50,n为偶数) 。 第二行n个整数表明n个同-程序员宅基地

文章浏览阅读1.2k次。题目内容:为了促进互帮互相,决定成立学习小组。小组结伴的规则是这样的:先将学号按升序排列,排在最前的一个人和排在最后的那个人结成同伴,排在第2个的与排在倒数第2个的结成同伴…依次类推,2个一组成同伴。输入格式:第一行是一个整数n,表明n个同学。(2<=n<=50,n为偶数) 。 第二行n个整数表明n个同学的学号,学号之间有一个空格,学号是无序输入的。如果输入的学生数是奇数,则输出提示信息:“odd number”输出格式:共n/2行,每行二个整数,表明结伴同学的学号,两个学_第一行是一个整数n,表明n个同学。(2<=n<=50,n为偶数) 。 第二行n个整数表明n个同

条件注解@Conditional_java 不存在才创建 @conditional-程序员宅基地

文章浏览阅读110次。如果没有havingValue,那么会采用prefix+name 或 prefix+value 的值,去和false比较,如果值等于false 那么失败, 如果不等于false 成功。定义:在spring框架中用于根据特定条件决定是否创建或者注册某个bean或配置的注解,他们可以根据运行时环境,配置属性,或其他条件来动态的控制bean的创建或者注册。在上述代码中,表示会去application文件中,读取前缀为:Spring.datasource下,名字为type的key的值,读取到之后,会跟。_java 不存在才创建 @conditional

随便推点

技术译文 | How Can ScaleFlux Handle MySQL Workload?-程序员宅基地

文章浏览阅读217次。本文是一篇译文,介绍 Percona 的工程师对 ScaleFlux 的性能压测报告翻译:杨奇龙原文地址:https://www.percona.com/blog/2020/08/06/how-can-scaleflux-handle-mysql-workload/最近作者有一个针对 ScaleFlux 的产品也叫做 CSD 2000 进行压测的机会. 本文中作者将介绍使用 Intel SSD 和 ScaleFlux 存储设备进行压测的对比结果。一 我们为什么需要不一样的 ScaleFlux?._scaleflux

electron vue vite 配置安装_wincodesign-2.5.0-程序员宅基地

文章浏览阅读460次。electon 打包安装_wincodesign-2.5.0

华为nova7可以用鸿蒙,华为鸿蒙系统再次更新7款可适配机型!对比安卓,鸿蒙OS的优势有哪些?...-程序员宅基地

文章浏览阅读6.2k次。原标题:华为鸿蒙系统再次更新7款可适配机型!对比安卓,鸿蒙OS的优势有哪些?自从鸿蒙OS系统全面启动公测以来,不断的在更新更多适配机型,就在前不久华为鸿蒙官网又新增了不少的机型,除了之前的Mate系列和P系列外,这次更新的机型有:华为nova6、nova65G、nova75G、nova7Pro5G、nova8、nova8Pro、MatePad10.8英寸。这些机型都可以体验鸿蒙OS 2.0公测版。..._nova7最好用的系统版本

Python-opencv之目标定位_python cv用于定位-程序员宅基地

文章浏览阅读1.5w次,点赞14次,收藏87次。最近团队准备参加一个无人机比赛,大致的规则是这样的:固定翼飞机从跑道起飞,然后在空中转体360°,通过GPS粗定位飞行至一个高13米左右,宽6米左右八字形框前(距离约50米左右),这时依靠计算机视觉的方法,让飞机准确的穿过去。(之后还有其他的动作,但是第一步大体就是这样)。 初步的方案:①通过机载摄像机获取图像序列 ②选取关键帧进行处_python cv用于定位

高速缓冲存储器cache介绍_c6713的第一级程序高速缓冲和第一级数据高速缓冲容量都是8kb,第一级存储器/高速缓冲的容量为32-程序员宅基地

文章浏览阅读8.4k次。cache介绍一、 Cache- 主存存储结构及其实现 为了解决存储器系统的容量、存取速度及单位成本之间的矛盾,可以采用 Cache- 主存存储结构,即在主存和 CPU 之间设置高速缓冲存储器 Cache ,把正在执行的指令代码单元附近的一部分指令代码或数据从主存装入 Cache 中,供 CPU 在一段时间内使用,由于存储器访问的局部性,在一定容量 Cache 的条件下,我_c6713的第一级程序高速缓冲和第一级数据高速缓冲容量都是8kb,第一级存储器/高速缓冲的容量为32kb。

C语言资料文章目录合集-程序员宅基地

文章浏览阅读512次,点赞12次,收藏8次。C语言资料文章目录合集

推荐文章

热门文章

相关标签