Qt单元测试

转自博客:http://blog.csdn.net/zhu_xz/archive/2009/12/25/5076157.aspx

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

C/C++ code

#include <QtTest/QtTest> 

class TestQString: public QObject 

  Q_OBJECT 

private slots: 

  // 每个private slot函数都是会被自动调用的测试函数 

  void testToLower(); 

  // 以“_data”结尾的函数向对应的测试函数提供测试数据 

  void testToLower_data(); 

}; 

 

void TestQString::testToLower() 

  // 获取测试数据 

  QFETCH(QString, string); 

  QFETCH(QString, result); 

  // 如果输入的两个参数不同,则会被认为测试失败 

  QCOMPARE(string.toLower(), result); 

void TestQString::testToLower_data() 

  // 添加数据列 

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

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

  // 添加测试数据 

  QTest::newRow("lower") << "hello" << "hello"; 

  QTest::newRow("mixed") << "HeLlO" << "hello"; 

  QTest::newRow("upper") << "HELLO" << "hello"; 

// 用于构建可执行的测试程序 

QTEST_MAIN(TestQString) 

#include "testqstring.moc"

 

此外,Qt还提供了以下四个会被自动调用的

private slot:
initTestCase():在测试开始前被调用
cleanupTestCase():在测试结束后被调用
init():每个测试函数执行前被调用
cleanup():每个测试函数执行后被调用

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

JScript code

********* Start testing of TestQString ********* 

Config: Using QTest library 4.5.3, Qt 4.5.3 

PASS   : TestQString::initTestCase() 

PASS   : TestQString::testToLower() 

PASS   : TestQString::cleanupTestCase() 

Totals: 3 passed, 0 failed, 0 skipped 

********* Finished testing of TestQString ********* 

 

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

C/C++ code

// 代码取自 http://qt.nokia.com/doc/qtestlib-tutorial4-testgui-cpp.html 

#include <QtGui> 

#include <QtTest/QtTest> 

class TestGui: public QObject 

  Q_OBJECT 

private slots: 

  void testGui_data(); 

  void testGui(); 

}; 

 

void TestGui::testGui_data() 

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

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

  // 添加按键事件 

  QTestEventList list1; 

  list1.addKeyClick('a'); 

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

 

  QTestEventList list2; 

  list2.addKeyClick('a'); 

  list2.addKeyClick(Qt::Key_Backspace); 

  QTest::newRow("there and back again") << list2 << ""; 

void TestGui::testGui() 

  QFETCH(QTestEventList, events); 

  QFETCH(QString, expected); 

  QLineEdit lineEdit; 

  // 模拟按键事件,并比较结果 

  events.simulate(&lineEdit); 

  QCOMPARE(lineEdit.text(), expected); 

QTEST_MAIN(TestGui) 

#include "testgui.moc"

 

最后看看如何测试benchmark

C/C++ code

void TestQString::testBenchmark() 

  QString str("HeLlO"); 

  // 以下代码被测试benchmark 

  QBENCHMARK 

  { 

    str.toLower(); 

  } 

 

得到如下输出:

JScript code

RESULT : TestQString::testBenchmark(): 

0.00062 msec per iteration (total: 41, iterations: 65536)

 

 

 

在nokia 的qt 4.7 官方文档中这个地方http://doc.qt.nokia.com/4.7/qtestlib-tutorial.html, 介绍了如何使用QTestLib框架进行单元测试。例子中多是对系统提供的类进行的测试。这里主要写下如何对自己定义的类进行单元测试。

 

测试方法:

宏:QCOMPARE, QTEST, QVERIFY, QBENCHMARK,

事件:
KeyAction(QTest::keyClick(),QTest::keyPress(), QTest::keyRelease()), 
MouseAction(QTest::mouseClick(), QTest::mouseDClick(),QTest::mouseMove(),QTest::mousePress(),QTest::mouseRelease())

类:QSignalSpy, QTouchEventSequence

 

保存测试结果:

首先我们先定义一个宏,用来定义存放我们测试结果的文件。这个宏是运行在Symbian S60平台。

• #ifndef S60UNITTEST_H_

• #define S60UNITTEST_H_

• #define QTEST_MAIN_S60(TestObject) /

• int main( int argc, char *argv[]) /

• { /

• char *new_argv[3]; /

• QApplication app(argc, argv); /

• /

• QString str = "C://data//" + QFileInfo(QCoreApplication::applicationFilePath()).baseName() + ".log"; /

• QByteArray   bytes  = str.toAscii(); /

• /

• char arg1[] = "-o"; /

• /

• new_argv[0] = argv[0]; /

• new_argv[1] = arg1; /

• new_argv[2] = bytes.data(); /

• /

• TestObject tc; /

• return QTest::qExec(&tc, 3, new_argv); /

• }

• #endif /* S60UNITTEST_H_ */

 

在定义的测试类中,使用QTEST_MAIN_S60(TestObject)代替 QTEST_MAIN(TestObject).这里TestObject是我们自定义的类的类名。

测试结果会保存在 C://data//xxxx.log 文件里。这里xxxx是我们测试工程的名字。

 

访问被测试类的保护,私有 成员变量和成员函数:

可以用下面两中方法之一:

1, 把测试类声明成被测试函类的友元类。

2,在测试类头文件中加入下面的宏:
#define private public
#define protected public
#include "myWidget.h" //这里的myWidget.h 是我的被测试类的名字
#undef protected
#undef private

 

 

使用QSignalSpy

void TestObject::testEventtoMouse()
{
    QPushButton button;
    QSignalSpy buttonSpy(&button, SIGNAL(clicked()));
    QTest::mouseClick(&button,Qt::LeftButton);
    QVERIFY(buttonSpy.count() == 1);
}

 

 

然后把测试类及被测试类的头文件和实现文件(.cpp or dll)放在同一工程目录下,并把被测试类的相关文件加入到工程的pro文件中。

编译并运行测试程序,即可在C://data//目录下找到包含测试结果的log文件。

另外可以在程序中使用qDebug("this is test info")语句,输出相关测试信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值