Qt单元测试框架快速上手

本文介绍Qt的单元测试框架是什么,有什么用和怎么快速使用它。

1.是什么?

  Qt单元测试框架除了提供单元测试框架的基本功能外还提供了针对GUI测试的扩展功能。一般单元测试意义上是指对软件中的最小可测试单元进行检查验证,其中最小测试单元可以为某个功能点,某个类,某个函数,甚至是某个行为等等。

2.有什么用?

  • 加快开发效率;
  • 提高程序质量。

3.怎么使用?(图解)

  1. 选择其他项目->Auto Test Project
    插图

  2. 输入项目名与选择项目目录。
    插图

3.选择一个单元测试的类名(这里是AutoTest)

  • Requires QApplication选项为程序添加QApplication类;
  • Generate initialization and cleanup code选项为添加初始化与清除代码(函数)。
    插图

4.选择编译环境。
插图

5.最后创建完成。
插图

6.项目目录
插图

4.使用技巧

  以AutoTest测试类为例(文末源码),自动执行带有private slots标记的函数,并会顺序执行。

  • initTestCase是默认第一执行函数(系统自带),用于初始化一些数据和行为;
  • cleanupTestCase是默认最后执行函数(系统自带),用于清理资源和重置状态的操作。
    1
    2
    3
    4
    5
    private slots:
    void initTestCase(); /* 可选 */
    void test_case1();
    void test_case2();
    void cleanupTestCase(); /* 可选 */

  测试工具(测试验证函数)

  • 验证被测试函数的结果,需要使用QTest提供的测试函数。
验证函数 用途
QVERIFY(bool) 验证参数是否为真
QCOMPARE(actual, expected) 验证实际参数是否跟期望值一致
  • 示例
    1
    2
    3
    4
    5
    6
    7
    void AutoTest::test_case1()
    {
    QString name("AutoTest");
    bool isEnable = true;
    QVERIFY(isEnable);
    QCOMPARE(name, QString("AutoTest"));
    }

5.附录

  • AutoTest.pro

    1
    2
    3
    4
    5
    6
    7
    8
    9
    QT += testlib
    QT -= gui

    CONFIG += qt console warn_on depend_includepath testcase
    CONFIG -= app_bundle

    TEMPLATE = app

    SOURCES += tst_autotest.cpp
  • tst_autotest.cpp

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    #include <QtTest>

    // add necessary includes here

    class AutoTest : public QObject
    {
    Q_OBJECT

    public:
    AutoTest();
    ~AutoTest();

    private slots:
    void initTestCase();
    void test_case1();
    void test_case2();
    void cleanupTestCase();
    };

    AutoTest::AutoTest()
    {

    }

    AutoTest::~AutoTest()
    {

    }

    void AutoTest::initTestCase()
    {

    }

    void AutoTest::test_case1()
    {
    QString name("AutoTest");
    bool isEnable = true;
    QVERIFY(isEnable);
    QCOMPARE(name, QString("AutoTest"));
    }

    void AutoTest::test_case2()
    {

    }

    void AutoTest::cleanupTestCase()
    {

    }

    QTEST_APPLESS_MAIN(AutoTest)

    #include "tst_autotest.moc"
  • 输出信息

    1
    2
    3
    4
    5
    6
    7
    Config: Using QtTest library 5.12.2, Qt 5.12.2 (x86_64-little_endian-llp64 shared (dynamic) debug build; by GCC 7.3.0)
    PASS : AutoTest::initTestCase()
    PASS : AutoTest::test_case1()
    PASS : AutoTest::test_case2()
    PASS : AutoTest::cleanupTestCase()
    Totals: 4 passed, 0 failed, 0 skipped, 0 blacklisted, 2ms
    ********* Finished testing of AutoTest *********