组织项目工程和单元测试工程:
1. 创建一个项目工程,并添加一个类,实现一个getMax函数。
2. 创建一个单元测试工程,包含所有的测试代码和头文件。
3. 在单元测试工程中添加项目工程的源代码和头文件,以便能够访问需要测试的类和函数。
4. 在单元测试工程中添加QtTest库,以便能够使用Qt单元测试框架。
对项目工程的某个类进行单元测试:
1. 在单元测试工程中创建一个测试类,继承自QObject和QTest类。
2. 在测试类中添加测试函数,测试函数的名称应该以test开头。
3. 在测试函数中创建需要测试的类的对象,并调用需要测试的函数。
4. 使用QtTest库中的断言函数来验证函数的输出是否符合预期。
在项目工程MyProject中添加类MyClass,并实现getMax函数
#ifndef MYCLASS_H
#define MYCLASS_H
#include <QObject>
#include <QVariant>
class MyClass : public QObject
{
Q_OBJECT
public:
explicit MyClass(QObject *parent = nullptr);
public:
QVariant getMax(QVariant var1, QVariant var2)
{
return var1>var2?var1:var2;
}
signals:
public slots:
};
#endif // MYCLASS_H
在单元测试工程MyProjectTest的pro文件中添加项目工程中的myclass.h和myclass.cpp文件,并在tst_myclasstest.cpp中包含头文件myclass.h,然后开始完成测试用例的编写。
#include <QtTest>
// add necessary includes here
#include "myclass.h"
class MyClassTest : public QObject
{
Q_OBJECT
public:
MyClassTest();
~MyClassTest();
private slots:
void test_getMax(); //QVERIFY,QCOMPARE
void test_localeAwareCompare();//QCOMPARE,QBENCHMARK
//数据驱动测试
void getMax_data();
void getMax();
};
MyClassTest::MyClassTest()
{
}
MyClassTest::~MyClassTest()
{
}
void MyClassTest::test_getMax()
{
MyClass obj;
QVERIFY(obj.getMax(1, 2)==2);
QVERIFY(obj.getMax(-1, 1)==1);
QCOMPARE(obj.getMax(1, 2), 2);
QCOMPARE(obj.getMax(-1, 1), 1);
}
void MyClassTest::test_localeAwareCompare()
{
QString str1 = QLatin1String("This is a test string");
QString str2 = QLatin1String("This is a test string");
QCOMPARE(str1.localeAwareCompare(str2), 0);
QBENCHMARK {
str1.localeAwareCompare(str2);
}
}
void MyClassTest::getMax_data()
{
QTest::addColumn<QVariant>("var1");
QTest::addColumn<QVariant>("var2");
QTest::addColumn<QVariant>("result");
QTest::newRow("var1>var2") << QVariant(129) << QVariant(128) <<QVariant(129);
QTest::newRow("var2>var1") << QVariant(125) << QVariant(130) <<QVariant(130);
QTest::newRow("var1==var2") << QVariant(128) << QVariant(128) <<QVariant(128);
}
void MyClassTest::getMax()
{
MyClass obj;
QFETCH(QVariant, var1);
QFETCH(QVariant, var2);
QFETCH(QVariant, result);
QCOMPARE(obj.getMax(var1,var2), result);
}
QTEST_APPLESS_MAIN(MyClassTest)
#include "tst_myclasstest.moc"
测试结果如下:
********* Start testing of MyClassTest *********
Config: Using QtTest library 5.12.0, Qt 5.12.0 (x86_64-little_endian-lp64 shared (dynamic) release build; by GCC 5.3.1 20160406 (Red Hat 5.3.1-6))
PASS : MyClassTest::initTestCase()
PASS : MyClassTest::test_getMax()
PASS : MyClassTest::test_localeAwareCompare()
RESULT : MyClassTest::test_localeAwareCompare():
0.000031 msecs per iteration (total: 67, iterations: 2097152)
PASS : MyClassTest::getMax(var1>var2)
PASS : MyClassTest::getMax(var2>var1)
PASS : MyClassTest::getMax(var1==var2)
PASS : MyClassTest::cleanupTestCase()
Totals: 7 passed, 0 failed, 0 skipped, 0 blacklisted, 292ms
********* Finished testing of MyClassTest *********
完整工程链接: