组织项目工程和单元测试工程:

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 *********

完整工程链接:

基于QtTest的Qt单元测试

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐