Qt单元测试库QTestLib
Qt内置单元测试模块QTestLib,比较好用。Qt Creator的向导可以自动生成Qt单元测试的代码,省去动手写代码的麻烦,缺点是我现在还不理解QTestLib的整个使用流程。
- *Qt Creator向导生成如下的代码:
[cpp]
#include
class CoreDataTest : public QObject
{
Q_OBJECT
public:
CoreDataTest();
private Q_SLOTS:
void initTestCase(); // 测设开始时调用
void cleanupTestCase(); // 测试结束时调用
void testDataItem(); // 测试项目
void testDataItem_data(); // 为测试项目提供数据
};
QTEST_APPLESS_MAIN(CoreDataTest)
#include “tst_coredatatest.moc”
[/cpp]
测试项目可以有多个,qt测试框架会自动识别并调用这些方法。以_data结尾的函数为与前面同名的函数提供数据,QTestLib用表格为测试项目提供多组测试数据,测试项目可以逐个获取这些数据进行测试,而不需要显式编写循环语句。如下所示:
[cpp]
void NormalFileNamePatternTest::testLocalFileName_data()
{
QTest::addColumn(“data_item”);
QTest::addColumn(“product_description”);
QTest::addColumn(“inital_time”);
QTest::addColumn(“current_validity”);
QTest::addColumn(“encoding_format”);
DataItem* a_data_item = 0;
a_data_item=new DataItem(QUrl(QString(“/T639L60/gda.639.2013060400000.grb2”)),this);
QTest::newRow(“0”)«a_data_item«“gda.639”«“2013060400”«“000”«“grb2”; a_data_item=new DataItem( QUrl(QString("/GRA_GMF2GRIB2_ORIG_2011110612/gmf.gra.2011110612108.grb2")),this); QTest::newRow(“0”)«a_data_item«“gmf.gra”«“2011110612”«“108”«“grb2”; } [/cpp] 最前面我定义了一个五列的表格,并在下面添加两行数据。需要注意的是,QTest::addColumn添加的数据类型必须是Qt Meta-Object系统已知的,由于DataItem*是我自定义的类,需要向Qt注册这个类型。在其头文件中加入: [cpp] Q_DECLARE_METATYPE(Core::DataItem*); [/cpp] 否则会在编译时出现错误。随后,在测试函数中可以获取这些数据。 [cpp] void NormalFileNamePatternTest::testLocalFileName() { QFETCH(DataItem*,data_item); QFETCH(QString,product_description); QFETCH(QString,inital_time); QFETCH(QString,current_validity); QFETCH(QString,encoding_format); NormalFileNamePattern normal_file_name_pattern(this); normal_file_name_pattern.anaylazeDataItem(data_item); QCOMPARE(data_item->getProductDescription(),product_description);
QCOMPARE(data_item->getInitialTime(),inital_time);
QCOMPARE(data_item->getCurrentValidity(),current_validity);
QCOMPARE(data_item->getEncodingFormat(),encoding_format);
}
[/cpp]
QTestLib会自动对每个数据执行一遍测试函数。用QFETCH宏可得到数据,变量名要与data函数中定义的列名相同。
我写的一个测试运行输出如下:
[code]
***\* Start testing of NormalFileNamePatternTest ****
Config: Using QTest library 4.8.4, Qt 4.8.4
PASS : NormalFileNamePatternTest::initTestCase()
PASS : NormalFileNamePatternTest::testLocalFileName()
PASS : NormalFileNamePatternTest::testDataSet()
PASS : NormalFileNamePatternTest::cleanupTestCase()
Totals: 4 passed, 0 failed, 0 skipped
***\* Finished testing of NormalFileNamePatternTest ****
[/code]
可以看到QTestLib运行了两个测试项目testLocalFileName和testDataSet,并都获得通过。
一个失败的例子,我添加下面的测试:
[cpp]
void CoreDataTest::testDataMessage()
{
QCOMPARE(1,2);
}
[/cpp]
测试失败的输出:
[code]
***\* Start testing of CoreDataTest ****
Config: Using QTest library 4.8.4, Qt 4.8.4
PASS : CoreDataTest::initTestCase()
PASS : CoreDataTest::testDataItem()
PASS : CoreDataTest::testDataSet()
FAIL! : CoreDataTest::testDataMessage() Compared values are not the same
Actual (1): 1
Expected (2): 2
d:\test\libs\core\coredata\tst_coredatatest.cpp(108) : failure location
PASS : CoreDataTest::cleanupTestCase()
Totals: 4 passed, 1 failed, 0 skipped
***\* Finished testing of CoreDataTest ****
[/code]