转自博客: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")语句,输出相关测试信息。