在实际测试中,需要对多种边界数据进行测试,并逐项初始化,逐项完成测试。此时,可以使用QTest::addColumn()函数建立要测试的数据列,使用QTest::newRow()函数添加数据行。下面通过两个实例来介绍具体的用法。
实例1:测试字符串转换为全小写字符的功能。
(1) 建立单元测试框架,具体设置如下。
项目名称:TestQString。
测试类名:TestQString。
生成源文件:tst_testqstring.cpp。
(2) 源文件“tst_testqstring.cpp”的具体代码如下:
#include <QtTest>
#include <QString>
// add necessary includes here
class TestQString : public QObject
{
Q_OBJECT
public:
TestQString();
~TestQString();
private slots:
//每个private slot都是一个被QTest::qExec()自动调用的测试函数
void testToLower(); //(a)
void testToLower_data(); //(b)
};
TestQString::TestQString()
{
}
TestQString::~TestQString()
{
}
void TestQString::testToLower()
{
//获取测试数据
QFETCH(QString,string);
QFETCH(QString,result);
//如果两个参数不同,则其值会分别显示出来
QCOMPARE(string.toLower(),result); //(c)
QVERIFY2(true, "Failure");
}
void TestQString::testToLower_data()
{
//添加测试列
QTest::addColumn<QString>("string");
QTest::addColumn<QString>("result");
//添加测试数据
QTest::newRow("lower")<<"hello"<<"hello";
QTest::newRow("mixed1")<<"heLLO"<<"hello";
QTest::newRow("mixed2")<<"HeLLo"<<"hello";
QTest::newRow("upper")<<"HELLO"<<"hello";
}
//生成能够独立运行的测试代码
QTEST_APPLESS_MAIN(TestQString)
#include "tst_testqstring.moc"
其中,
- (a) void testToLower():每个private slot都是一个被QTest::qExec()自动调用的测试函数。
- (b) void testToLower_data():用于提供测试数据。初始化数据的函数名和测试函数名一样,但增加了后缀“_data”。
- (c) QCOMPARE(string.toLower(),result): QCOMPARE(actual,expected)宏使用“等号”操作符比较实际值(actual)和期望值(expected)。如果两个值相等,则程序继续执行;如果两个值不相等,则产生一个错误,且程序不再继续执行。
(3) 测试结果如下图所示。
实例2:测试计算圆面积的功能。
(1) 建立单元测试框架,具体设置如下。
项目名称:TestArea。
测试类名:TestArea。
生成源文件:tst_testarea.cpp。
(2) 新建C++头文件“area.h”,其具体代码如下:
#include <QtCore>
#include <QObject>
class Area:public QObject
{
Q_OBJECT
public:
Area(){}
~Area(){}
Area(const Area &area){ m_r = area.m_r;}
Area(int r){ m_r = r;}
double CountArea(){ return 3.14 * m_r * m_r;}
private:
double m_r;
};
Q_DECLARE_METATYPE(Area) // (a)
其中,
- (a) Q_DECLARE_METATYPE(Area):该宏将Area定义为元类型,这样所有基于模板的函数都可以使用Area。而QTest中用到了模板函数addColumn(),因此必须使用Q_DECLARE_METATYPE()宏使模板函数可以识别Area类。
(3)在源文件“tst_testarea.cpp”中完成测试工作,其具体实现代码如下:
#include <QtTest>
#include <QString>
#include "Area.h"
// add necessary includes here
class TestArea : public QObject
{
Q_OBJECT
public:
TestArea();
~TestArea();
private slots:
void toArea(); //测试函数名toArea()
void toArea_data(); //初始化数据的函数toArea_data()
};
TestArea::TestArea()
{
}
TestArea::~TestArea()
{
}
void TestArea::toArea()
{
// 获取测试数据
QFETCH(Area,area); //(a)
QFETCH(double,r);
QVERIFY(qAbs(area.CalcArea()-r)<1.e-6); //(b)
QVERIFY2(true, "Failure");
}
void TestArea::toArea_data()
{
//定义测试数据列
QTest::addColumn<Area>("area"); //(c)
QTest::addColumn<double>("r"); //(d)
//建立测试数据
QTest::newRow("1")<<Area(1)<<3.14; //(e)
QTest::newRow("2")<<Area(2)<<12.56;
QTest::newRow("3")<<Area(3)<<28.26;
QTest::newRow("4")<<Area(4)<<50.24;
}
QTEST_APPLESS_MAIN(TestArea)
#include "tst_testarea.moc"
其中,
- (a) QFETCH(Area,area):通过QFETCH()宏获取所有数据。
- (b) QVERIFY(qAbs(area.CalcArea()-a)<1.e-6):QVERIFY()宏将根据数据的多少决定函数运行多少次。
- (c) QTest::addColumn<Area>("area"):此处建立了两列数据,area列为Area对象。
- (d) QTest::addColumn<double>("a"): a列是相应的Area对象中计算圆面积的期望值。
- (e) QTest::newRow("1")<<Area(1)<<3.14:测试数据通过QTest::newRow()函数加入。
(4)测试结果如下图所示。
————————————————
觉得有用的话请关注点赞,谢谢您的支持!
对于本系列文章相关示例完整代码有需要的朋友,可关注并在评论区留言!