Qt 单元测试
使用Qtcreator 自带的单元测试工具框架QTestlib进行测试。
一.创建一个单元测试程序
new project->other project ->Qt unit test
二.文件列表:
qtestlib/tutorial1/testqstring.cpp
qtestlib/tutorial1/tutorial1.pro
假设我们要测试QString类的行为。首先,需要一个用于包含测试函数的类。这个类必须从QObject继承:
class TestQString: public QObject
{
Q_OBJECT
private slots:
void toUpper();
};
注意包含QTest头文件,并且测试函数必须声明为私有槽,这样测试框架才可以找到并执行他们。
然后需要实现测试函数。实现看起来类似这样:
QVERIFY()宏将计算传入的表达式的值。如果为真,则测试函数继续进行;否则会向测试日志中增加一条描述错误的信息,并且该测试函数会停止执行。
但是如果需要向测试日志中增加更多的输出信息,你应该使用QCOMPARE()宏:
void TestQString::toUpper()
{
QString str = “Hello”;
QVERIFY(str.toUpper() == “HELLO”);
}
如果两个字符串不相等,他们的值都会追加到测试日志中,这样失败的原因就一目了然了。
最后,为使我们的测试程序能够单独执行,需要加入下列两行:
QTEST_MAIN(TestQString)
#include “testqstring.moc
QTEST_MAIN()宏将扩展成一个简单的main()函数,该main()函数会执行所有的测试函数。
执行测试程序
运行生成的可执行文件,你会看到下列输出:
********* Starttesting of TestQString *********
Config: UsingQTest library 4.5.1, Qt 4.5.1
PASS :TestQString::initTestCase()
PASS :TestQString::toUpper()
PASS :TestQString::cleanupTestCase()
Totals: 3 passed,0 failed, 0 skipped
********* Finishedtesting of TestQString *********
三.由于使用Qtestlib进行的测试无法生成代码覆盖率,我们需要借助linux 下的代码覆盖率工具gcov,lcov , genhtml。
1.gcov 与lcov 简介
gcov是配合gcc产生覆盖信息报告的工具;
lcov是将gcov产生的报告信息,以更直观的方式显示出来工具
基本的使用方法分为4个阶段:
(1)、gcc编译:产生插装后的目标文件test、gcov结点文件 test.gcno
#gcc-fprofile-arcs -ftest-coverage-o test test.c
# ls
test test.c test.gcno
说明:参数fprofile-arcs 和ftest-coverage 告诉gcc编译器:a.在目标文件test 插装跟踪代码;
b.生成供gcov使用test.gcno [gcov node 文件]。
因此,这里的生成的目标文件比正常编译的文件大。
(2)、运行目标文件:收集运行覆盖信息 test.gcda
# ./test
Success -- 这里是运行结果。
# ls
test test.c test.gcno test.gcda
这里test.gcda运行结果,
(3)、gcov产生报告信息: test.c.gcov
#gcov test.c
File 'test.c'
Lines executed: 87.50% of 8
test.c: creating 'test.c.gcov'
#ls
test test.c test.c.gcov test.gcdatest.gcno
(4)、lcov:格式化test.c.gcov ,输出到 test.info文件
#lcov -d . -t 'test' -o 'test.info' -b . -c
说明:
-d . :参数 d指路径, "." 指当前路径
-t "name" :指目标文件,这里 是 test
-o "filename" :输出格式化后的信息文件名
(5)、genhtml:根据信息文件(.info)产生html 文档,输出到一个文件夹中
#genhtml -o result test.info
说明: -o directory :参数o (output)后面跟路径名称,在当前目录下创建指定目录,本例中是result。至此: 可以在result目录中打开index.html 浏览覆盖信息
四。Qt creator 下具体实现
1.首先确保安装了gcov(gcc 默认一起安装)
2.在工程文件pro中添加
QMAKE_CXXFLAGS += -g -Wall -fprofile-arcs -ftest-coverage -O0
QMAKE_LFLAGS += -g -Wall -fprofile-arcs -ftest-coverage -O0
3. 创建processCoverage.sh
#!/bin/bash
##############################################################################
# Copyright (c) 2013, Robert Wloch
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Eclipse Public License v1.0
# which accompanies this distribution, and is available at
# http://www.eclipse.org/legal/epl-v10.html
#
# Contributors:
# Robert Wloch - initial API and implementation
##############################################################################
if [ ! $# -eq 3 ]; then
echo "usage: ${0} <gcov-files-dir> \"<file-pattern>\" <target-dir>"
exit 0
fi
lcov -d ${1} -c -o ${1}/coverage.info
lcov --list-full-path -e ${1}/coverage.info ${2} –o ${1}/coverage-stripped.info
genhtml -o ${3} ${1}/coverage-stripped.info
lcov -d ${1} –z
exit 0
4.Qtcreator左侧的project->run->argument添加:
-txt > tlog && (/<path_to_script>/processCoverage.sh <path_to_gcno_files>
"*/<name_of_Qt_project_to_test>/src/*"
<target_path_for_testcoverage_report> &&
<browser_executable> <target_path_for_testcoverage_report>/index.html)
|| (test -f <path_to_UTM>UnitTestMonitor && UnitTestMonitor) &
注:上面<>中的内容替换为与自己工程相应的路径。
由于mac 下无法安装lcov ,所以只需要把lcov 工具bin目录下的二进制文件复制到.gcda文件所在的目录下。经测试在使用上述方法可以生成代码覆盖率,但在使用lcov 最后生成html 文件时出现错误。
具体实现可参考:
http://www.robertwloch.net/2013/06/generating-lcov-coverage-with-qtcreator/
Qt 单元测试的更多相关文章
- Qt单元测试(QTestLib)
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt单元测试(QTestLib) 本文地址:http://techieliang.co ...
- Qt单元测试浅析
Qt单元测试框架,使用于基于Qt的应用程序和库,先从一个简单的demo工程说起吧. 我们可以通过QtCreator来创建一个简单的Qt单元测试工程,夏天到了,这个demo工程的名字就叫Summer好了 ...
- Qt单元测试工具 QTestlib(QVERIFY, QFETCH, QCOMPARE等)
优点: QTestLib提供了单元测试框架的基本功能,并提供了针对GUI测试的扩展功能. 特性 详细描述 轻量级 QTestlib 只包含 6000行代码和 60个导出符号. 自包含 对于非GUI测 ...
- Qt单元测试
单元测试之作用要完成测试用例,保证设计上的耦合依赖通过测试用例,保证覆盖率,提高程序质量 QTest一些有用的静态函数QTest::qExecQTest::qSleepQTest::qWait 例 ...
- Qt 工程 pro文件
工作中,感觉pro文件的有些内容真不太懂,现系统性的学习一下.于此备录,分享共勉. 为了更好的理解,先创建一个简单的工程作为实践. [1]创建一个pro文件 1.1 新建proDemo工程.步骤如下: ...
- PyQt类库介绍
安装完PyQt后我们去看看这个库里面有些什么cd /usr/lib/python3/dist-packages/PyQt5/ && ls都是些.so的动态链接库,这就是为什么我们在安 ...
- cmake 学习笔记(六)
希望这是现阶段阻碍阅读shiboken和PySide源码的涉及cmake的最后一个障碍 ^ _^ 学习 cmake 的单元测试部分 ctest. 简单使用 最简单的使用ctest的方法,就是在 CMa ...
- pyQT4和pyQT5的主要模块介绍
下面简单介绍一下pyQT4和pyQT5的主要模块 pyQT4 的主要模块 QtCore 模块包括了核心的非GUI功能,该模块用来对时间.文件.目录.各种数据类型.流.网址.媒体类型.线程或进程进行处理 ...
- Python_PyQt5_库
QtQWidgets 小组件(暂无资料,但是Python中做窗口/网页时用的很多 *-*) QtCore 模块包括了核心的非GUI功能,该模块用来对时间.文件.目录.各种数据类型.流.网址.媒体 ...
随机推荐
- php 限制标题长度,将一个中文转换成一个字符
点击链接加入群[php/web 学习课堂]:https://jq.qq.com/?_wv=1027&k=5UJ9vEa 欢迎大家加入,一起讨论学习 玩这个功能的时候,我们要注意一点,我们是用中 ...
- C++ STL 之 stack
stack 是一种先进后出(first in last out,FILO)的数据结构,它只有一个出口,stack 只允许在栈顶新增元素,移除元素,获得顶端元素,但是除了顶端之外,其他地方不允许存取 元 ...
- Spring Cloud(四)服务提供者 Eureka + 服务消费者 Feign
上一篇文章,讲述了如何通过RestTemplate + Ribbon去消费服务,这篇文章主要讲述如何通过Feign去消费服务. Feign简介 Feign是一个声明式的伪Http客户端,它使得写Htt ...
- 一个用beego写的API项目
beego-api 一个使用beego写的API 支持Api日志 支持Swagger注解文档 项目地址: https://github.com/eternity-wdd/beego-api 使用说明 ...
- 面试题——SSM面试题
树木丛生红火火 树木丛生红火火 微信公众号:Java全栈开发大联盟 原文地址:https://note.youdao.com/ynoteshare1/index.html?id=3f81baea7 ...
- 关于join() 是否会释放锁的一些思考
# 首先从一个很有意思的问题开始: - 问 : Thread 的join() 方法是否会释放锁? - 答: 会! # 如果一切到这里就结束了,那可能也就没有这篇小记了,但是我的脑子却冒出了一些奇怪的想 ...
- 2019牛客暑期多校训练营(第一场)E ABBA
题意问你有多少个长度为2*(n+m)的字符串满足A和B数量相等 且可以分割为n个AB子序列和m个BA子序列 很容易得出前n个A肯定是可以给AB的 后面的m个A给BA 所以当一个字符串满足条件时要满足任 ...
- java.util.NoSuchElementException
问题引入 Java商店作业不同函数里需要获取用户输入,用Scanner的时候,出现了异常java.util.NoSuchElementException 作业中代码模式如下,func1和func2中都 ...
- 【pip】使用
错误及解决 install 1.pip install aip 报错[Windows,python3.6] ERROR: Could not find a version that satisfies ...
- hmmlearn 安装笔记
hmmlearn是在python上实现隐马可夫模型的一个组件包,原先是在sklearn中的,后来被弃用而单独分离出来. 首先安装sklearn,最好下载setup.py的安装包用命令行安装,因为安装h ...