使用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 单元测试的更多相关文章

  1. Qt单元测试(QTestLib)

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt单元测试(QTestLib)     本文地址:http://techieliang.co ...

  2. Qt单元测试浅析

    Qt单元测试框架,使用于基于Qt的应用程序和库,先从一个简单的demo工程说起吧. 我们可以通过QtCreator来创建一个简单的Qt单元测试工程,夏天到了,这个demo工程的名字就叫Summer好了 ...

  3. Qt单元测试工具 QTestlib(QVERIFY, QFETCH, QCOMPARE等)

    优点: QTestLib提供了单元测试框架的基本功能,并提供了针对GUI测试的扩展功能. 特性 详细描述 轻量级 QTestlib 只包含 6000行代码和 60个导出符号. 自包含 对于非GUI测 ...

  4. Qt单元测试

    单元测试之作用要完成测试用例,保证设计上的耦合依赖通过测试用例,保证覆盖率,提高程序质量 QTest一些有用的静态函数QTest::qExecQTest::qSleepQTest::qWait   例 ...

  5. Qt 工程 pro文件

    工作中,感觉pro文件的有些内容真不太懂,现系统性的学习一下.于此备录,分享共勉. 为了更好的理解,先创建一个简单的工程作为实践. [1]创建一个pro文件 1.1 新建proDemo工程.步骤如下: ...

  6. PyQt类库介绍

    安装完PyQt后我们去看看这个库里面有些什么cd /usr/lib/python3/dist-packages/PyQt5/  && ls都是些.so的动态链接库,这就是为什么我们在安 ...

  7. cmake 学习笔记(六)

    希望这是现阶段阻碍阅读shiboken和PySide源码的涉及cmake的最后一个障碍 ^ _^ 学习 cmake 的单元测试部分 ctest. 简单使用 最简单的使用ctest的方法,就是在 CMa ...

  8. pyQT4和pyQT5的主要模块介绍

    下面简单介绍一下pyQT4和pyQT5的主要模块 pyQT4 的主要模块 QtCore 模块包括了核心的非GUI功能,该模块用来对时间.文件.目录.各种数据类型.流.网址.媒体类型.线程或进程进行处理 ...

  9. Python_PyQt5_库

    QtQWidgets  小组件(暂无资料,但是Python中做窗口/网页时用的很多  *-*)  QtCore 模块包括了核心的非GUI功能,该模块用来对时间.文件.目录.各种数据类型.流.网址.媒体 ...

随机推荐

  1. Advanced Installer 关于桌面的快捷方式。

    由于软件自动生成快捷方式,我发现桌面可以存在多个软件的快捷方式,因为快捷方式只要名字不同就可以存在多个,即使名字相同,只要备注不同,又可以存在多个. 那么由于软件自带生成快捷方式的功能,为了避免桌面出 ...

  2. git遇到的问题记录2019.05.07

    用sourcetree拉取代码,报错如下: error: cannot lock ref 'refs/remotes/origin/my_branch': unable to resolve refe ...

  3. Heap(堆)与Stack(栈)的区别详解

    在了解堆与栈之前,我们想来了解下程序的内存分配 一个编译的程序占用的内存分为以下几个部分  :  1.栈区(stack)—   由编译器自动分配释放   ,存放函数的参数值,局部变量的值等.其    ...

  4. 切记:永远不要在MySQL中使用UTF-8

    MySQL使用UTF-8 issue 问题描述:最近我遇到了一个bug,我试着通过Rails在以“utf8”编码的MariaDB中保存一个UTF-8字符串,然后出现了一个离奇的错误: Incorrec ...

  5. Win10系统C盘空间不足怎么安全清理?

    我们在使用电脑时,系统经常会产生许多垃圾文件,占用磁盘存储空间.在Win10系统中,我们可以通过清理系统盘的临时文件来释放一些存储空间.下面好系统U盘启动就来告诉你具体的方法步骤. Win10系统C盘 ...

  6. 如何入门Pytorch之三:如何优化神经网络

    在上一节中,我们介绍了如何使用Pytorch来搭建一个经典的分类神经网络.一般情况下,搭建完模型后训练不会一次就能达到比较好的效果,这样,就需要不断的调整和优化模型的各个部分.从而引出了本文的主旨:如 ...

  7. linux下操作用户相关

    一.添加用户 adduser test 二.为新添加用户设置密码 passwd test 根据提示输入两次密码 三.为用户配置免密码sudo权限 配置/etc/sudoers文件即可,过程如下 chm ...

  8. Redis入门(二)——基本操作

    Redis作为独立的服务端,在Java中去操作redis需要通过Redis提供的jar z在这里特别申明,除了基本数据以及String外,其余对象,要想写入redis,必须序列化(即使是对象也要实现序 ...

  9. 详解Object.create(null)

    在Vue和Vuex的源码中,作者都使用了Object.create(null)来初始化一个新对象.为什么不用更简洁的{}呢? 在SegmentFault和Stack Overflow等开发者社区中也有 ...

  10. RecursiveTask和RecursiveAction的使用 以及java 8 并行流和顺序流(转)

    什么是Fork/Join框架        Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架. 我 ...