Qt单元测试QTestLib

来源:互联网 发布:java手机网游有哪些 编辑:程序博客网 时间:2024/05/21 22:50

1  概述

QT提供内部的单元测试库,使用方便。

2 目的:使用内部功能进行单元测试。

2.1 功能测试

根据输入,测试输出结果。

2.2 GUI功能测试

根据UI事件输入,并测试输出结果。

3 原理:输入测试数据表结果数据表,与实际值比较。

QTest提供了一系统的单元测试功能。

3.1 测试函数:testFun(),testFun_data()

对于一个测试目标函数,需要使用两个函数进行测试,testFun(),testFun_data()。

testFun_data():数据提供类,在此函数中写入测试数据。

testFun()是测试的实体类,读取testFun_data()中的数据表,并逐行进行测试。如果测试结果与数据表中的结果不同,则认为测试失败。

3.2 测试数据构建:addColumn<T>(name),QTest::newRow(name)<<input<<result

数据由QTest::addColumn<T>(name),QTest::newRow(name)<<input<<result来构建一个数据表,其中的列可以被获取,然后将表中对应的数据按行测试,并与表中的结果列进行对比。

3.3 GUI测试:事件列表

对于GUI图形操作的测试,则将数据设置为事件列表,供模拟测试。

3.4 通信

QTest提供一系统宏来进行数据的通信。

3.5 程序启动入口: QTest_Main(),qExec()

QTest提供了QTest_Main()作为测试的启动宏,构建一个main函数,也可以直接调用QTest::qExec()来启动测试。

4 方法:使用QTestLib,将结果数据表加载后逐行与结果数据对比。

QTestLib所有相关功能都在QTest命名空间下。

1)   在PRO文件中将testlib加入QT参数中。

2)   创建测试类:需要继承自QObject(因为要用去信号-槽)。

3)   创建测试条目:所有的private slots下函数都将作为测试条目自动测试,并需要一个_data()函数提供数据。

4)   创建测试数据:QTest::addColumn(),QTest::newRow()。

5)   读取测试数据:QFETCH()

6)   对比测试结果与预期值::QCOMPARE(),QVerify()等。

7)   启动测试:QTest::qExec()或直接调用QTest_Main()宏。

8)   测试Case启动、结束事件:initTestCase(),cleanupTestCase()。

9)   测试条目启动、结束事件:init(),cleanup()。

10)  测试库:直接测试库。

11)  测试源文件:将cpp加入Test工程,测试。

5 示例

///////xx.pro

#-------------------------------------------------
#
#ProjectcreatedbyQtCreator2014-09-12T16:06:03
#
#-------------------------------------------------
 
QT       +=coreguitestlib
 
greaterThan(QT_MAJOR_VERSION,4):QT+=widgets
 
TARGET=test
TEMPLATE=app
 
 
SOURCES+=main.cpp\
        mainwindow.cpp\
    qtestxxx.cpp
 
HEADERS  +=mainwindow.h\
    qtestxxx.h
 
FORMS    +=mainwindow.ui

 

///////xx.h

#ifndefQTESTXXX_H
#defineQTESTXXX_H
#include<QtTest/QTest>
#include<QObject>
 
classQTestXXX:publicQObject
{
    Q_OBJECT
public:
    explicitQTestXXX(QObject*parent=0);
 
signals:
 
publicslots:
privateslots:
    voidtestA();
    voidtestA_data();
    voidtestE();
    voidtestE_data();
privateslots:
    virtualvoidinitTestCase();
    virtualvoidcleanupTestCase();
    virtualvoidinit();
    virtualvoidcleanup();
};
 
#endif//QTESTXXX_H

 

///////xx.cpp

#include"qtestxxx.h"

#include<QtTest/QTest>

QTestXXX::QTestXXX(QObject*parent):

    QObject(parent)

{

}

 

voidQTestXXX::testA()

{

    QFETCH(QString,input);

    QFETCH(QString,rslt);

    QCOMPARE(input,rslt);

}

 

voidQTestXXX::testA_data()

{

    QTest::addColumn<QString>("input");

    QTest::addColumn<QString>("rslt");

    QTest::newRow("a")<<"abc"<<"abc";

    QTest::newRow("b")<<"aBc"<<"abc";

    QTest::newRow("c")<<"ABC"<<"abc";

 

}

 

voidQTestXXX::initTestCase(){

    qDebug("initTestCase\n");

}

voidQTestXXX::cleanupTestCase(){

    qDebug("cleanupTestCase\n");

}

voidQTestXXX::init(){

    qDebug("init\n");

}

voidQTestXXX::cleanup(){

    qDebug("cleanup\n");

}

#include<QLineEdit>

voidQTestXXX::testE()

{

    QFETCH(QTestEventList,ev);

    QFETCH(QString,rslt);

    QLineEditlineed;

    ev.simulate(&lineed);

    QCOMPARE(lineed.text(),rslt);

}

 

 

voidQTestXXX::testE_data()

{

    QTest::addColumn<QTestEventList>("ev");

    QTest::addColumn<QString>("rslt");

 

    QTestEventListlst1;

    lst1.addKeyClick('a');

    QTest::newRow("char")<<lst1<<"a";

 

    QTestEventListlst2;

    lst2.addKeyClick('b');

    lst2.addMouseClick(Qt::LeftButton);

    QTest::newRow("clickChar")<<lst2<<"a";

 

}

 

 

QTEST_MAIN(QTestXXX);

 

 

5.1 启动多个测试类

#include"mainwindow.h"
#include<QApplication>
#include<QtTest/QtTest>
#include"maptilecodetrutilitytest.h"
#include"maptilecodetrextenseutilitytest.h"
intmain(intargc,char*argv[])
{
    QApplicationa(argc,argv);
    MapTileCodeTrUtilityTestut;
    QTest::qExec(&ut,argc,argv);
    MapTileCodeTrExtenseUtilityTestexut;
    QTest::qExec(&exut,argc,argv);
    return0;

}


Qt单元测试框架


QTestLib 框架提供了一个简单易用的单元测试框架,需要在工程文件中添加Qt+=testlib。先看一个简单的例子 :

[cpp] view plain copy
  1. #include <QtTest/QtTest>  
  2. class TestQString: public QObject  
  3. {  
  4.   Q_OBJECT  
  5. private slots:  
  6.   // 每个private slot函数都是会被自动调用的测试函数  
  7.   void testToLower();  
  8.   // 以“_data”结尾的函数向对应的测试函数提供测试数据  
  9.   void testToLower_data();  
  10. };  
  11. void TestQString::testToLower()  
  12. {  
  13.   // 获取测试数据  
  14.   QFETCH(QString, string);  
  15.   QFETCH(QString, result);  
  16.   // 如果输入的两个参数不同,则会被认为测试失败  
  17.   QCOMPARE(string.toLower(), result);  
  18. }  
  19. void TestQString::testToLower_data()  
  20. {  
  21.   // 添加数据列  
  22.   QTest::addColumn<QString>("string");  
  23.   QTest::addColumn<QString>("result");  
  24.   // 添加测试数据  
  25.   QTest::newRow("lower") << "hello" << "hello";  
  26.   QTest::newRow("mixed") << "HeLlO" << "hello";  
  27.   QTest::newRow("upper") << "HELLO" << "hello";  
  28. }  
  29. // 用于构建可执行的测试程序  
  30. QTEST_MAIN(TestQString)  
  31. #include "testqstring.moc"  

 

此外,Qt还提供了以下四个会被自动调用的private slot:
initTestCase():在测试开始前被调用
cleanupTestCase():在测试结束后被调用
init():每个测试函数执行前被调用
cleanup():每个测试函数执行后被调用

测试完成后输出的结果如下所示:

[javascript] view plain copy
  1. ********* Start testing of TestQString *********  
  2. Config: Using QTest library 4.5.3, Qt 4.5.3  
  3. PASS   : TestQString::initTestCase()  
  4. PASS   : TestQString::testToLower()  
  5. PASS   : TestQString::cleanupTestCase()  
  6. Totals: 3 passed, 0 failed, 0 skipped  
  7. ********* Finished testing of TestQString *********  

 

为了测试GUI组件 ,可以使用诸如QTest::keyClick()函数,通过内部事件传递,来模拟本地窗口系统的事件。例如:

[cpp] view plain copy
  1. // 代码取自 http://qt.nokia.com/doc/qtestlib-tutorial4-testgui-cpp.html  
  2. #include <QtGui>  
  3. #include <QtTest/QtTest>  
  4. class TestGui: public QObject  
  5. {  
  6.   Q_OBJECT  
  7. private slots:  
  8.   void testGui_data();  
  9.   void testGui();  
  10. };  
  11. void TestGui::testGui_data()  
  12. {  
  13.   QTest::addColumn<QTestEventList>("events");  
  14.   QTest::addColumn<QString>("expected");  
  15.   // 添加按键事件  
  16.   QTestEventList list1;  
  17.   list1.addKeyClick('a');  
  18.   QTest::newRow("char") << list1 << "a";  
  19.   QTestEventList list2;  
  20.   list2.addKeyClick('a');  
  21.   list2.addKeyClick(Qt::Key_Backspace);  
  22.   QTest::newRow("there and back again") << list2 << "";  
  23. }  
  24. void TestGui::testGui()  
  25. {  
  26.   QFETCH(QTestEventList, events);  
  27.   QFETCH(QString, expected);  
  28.   QLineEdit lineEdit;  
  29.   // 模拟按键事件,并比较结果  
  30.   events.simulate(&lineEdit);  
  31.   QCOMPARE(lineEdit.text(), expected);  
  32. }  
  33. QTEST_MAIN(TestGui)  
  34. #include "testgui.moc"  

 

最后看看如何测试benchmark :

[cpp] view plain copy
  1. void TestQString::testBenchmark()  
  2. {  
  3.   QString str("HeLlO");  
  4.   // 以下代码被测试benchmark  
  5.   QBENCHMARK  
  6.   {  
  7.     str.toLower();  
  8.   }  
  9. }  

 

得到如下输出:

[javascript] view plain copy
  1. RESULT : TestQString::testBenchmark():  
  2. 0.00062 msec per iteration (total: 41, iterations: 65536)  

 

该输出表示测试共进行了65536次,共耗时41毫秒,每次测试的平均时间为0.00062毫秒。




网址:http://blog.csdn.net/sf2gis2/article/details/40451609

http://blog.csdn.net/zhu_xz/article/details/5076157

http://blog.csdn.net/fuying1234/article/details/37598103

http://blog.csdn.net/ieearth/article/details/44964437

0 0
原创粉丝点击