使用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. jqGrid TreeGrid 加载数据 排序 扩展

    发现 jqGrid TreeGrid 加载的数据必须要排序 给了两种平滑数据模式尽然不内部递归 所以改了下源码加了个数据二次过滤器扩展 数据本该是这样的 结果没排序成这样了 (而且还得是从根节点到子节 ...

  2. 【SpringBoot】Web开发

    一.简介 1.1 引入SpringBoot模块 1.2 SpringBoot对静态资源的映射规则 二.模版引擎 2.1 简介 2.2 引入thymeleaf 2.3 Thymeleaf使用 一.简介 ...

  3. 【Day2】4.第三方模块的安装与使用

    课程目标 1. 使用模块 2. 安装第三方模块 使用模块 • 一个.Py文件称之为一个模块(Module) • 好处: 1. 便于代码维护,把很多函数放到不同文件,一个.py文件 的 代码数量少 2. ...

  4. Mac息屏后如何保持网络连接,方便远程访问

    1 wifi换成有线,因为息屏后WiFi就会自动断开 2 设置修改,点亮唤醒网络不勾选,进入休眠不勾选 3 目前测试用向日葵,远程这台电脑,再屏幕保护程序运行的情况下,可以远程控制.

  5. 【异常】warning: refname 'feature1.3.0' is ambiguous.导致git merge失败

    1 现象 自己git merge --no-ff feature1.3.0 无法合并代码到develop,代码还是停留在feature1.3.0的分支 并提示一下错误 warning: refname ...

  6. Linux基础知识之文件的权限(一)

    Linux基础知识之文件权限(一) Linux优点之一就是它拥有多用户多任务的环境,在提供文件共享的同时也能保证用户文件的安全性.所以,设置文件的权限管理变得尤为重要. 权限讲解 [der@Der ~ ...

  7. Centos7下搭建WebGoat 8和DVWA环境

    搭建WebGoat 安装前置条件说明 我们这里选择WebGoat的jar版本,由于WebGoat 8的jar文件已自带了tomcat和数据库,所以不需要再另外安装tomcat和mysql这种东西,只需 ...

  8. Muduo阅读

    创建了EventLoop对象的线程是IO线程,其主要功能是运行事件循环EventLoop::loop(), one loop per thread 事件循环必须在IO线程中运行 Reactor关键结构 ...

  9. HashMap源码分析二

    jdk1.2中HashMap的源码和jdk1.3中HashMap的源码基本上没变.在上篇中,我纠结的那个11和101的问题,在这边中找到答案了.   jdk1.2   public HashMap() ...

  10. integer == 号问题

    integer a=123 integer b=123 integer c=250 integer d=250 a==b(true) c==d (false) Integer中把-128-127 缓存 ...