第一章:编写单元测试

本章展示了如何编写一个简单的单元测试以及如何将测试用例作为一个独立的可执行文件运行。

编写测试

假设您想测试我们的 QString 类的行为。首先,您需要一个包含测试函数的类。这个类必须从 QObject

#include <QTest>

class TestQString: public QObject
{
    Q_OBJECT
private slots:
    void toUpper();
};

注意:您需要包含 QTest 头文件并将测试函数声明为私有槽,这样测试框架才能找到并执行它。

然后,您需要实现实际的测试函数。实现可能看起来像这样

void TestQString::toUpper()
{
    QString str = "Hello";
    QVERIFY(str.toUpper() == "HELLO");
}

QVERIFY() 宏评估其参数表达式的值。如果该表达式评估为真,则测试函数的执行继续。否则,将失败描述的信息附加到测试日志中,测试函数停止执行。

但是,如果您希望将更详细的信息输出到测试日志中,您应该使用 QCOMPARE() 宏而不是。

void TestQString::toUpper()
{
    QString str = "Hello";
    QCOMPARE(str.toUpper(), QString("HELLO"));
}

如果不等,两个字符串的内容都将附加到测试日志中,使其立即可见为什么比较失败。

准备独立的可执行文件

最后,为了将我们的测试用例变成一个独立的可执行文件,需要以下两行代码

QTEST_MAIN(TestQString)
#include "testqstring.moc"

QTEST_MAIN() 宏扩展为一个简单的 main() 方法,该方法运行所有测试函数。请注意,如果我们的测试类的声明和实现都在一个 .cpp 文件中,我们还需要包含生成的 moc 文件,以便 Qt 的反射功能正常工作。

构建可执行文件

您可以使用 CMake 或 qmake 来构建测试用例可执行文件。

使用 CMake 构建

在您的 CMakeLists.txt 文件中进行构建设置配置

# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause

cmake_minimum_required(VERSION 3.16)
project(tutorial1 LANGUAGES CXX)

find_package(Qt6 REQUIRED COMPONENTS Core Gui Test Widgets)

qt_standard_project_setup()

qt_add_executable(tutorial1
    testqstring.cpp
)

set_target_properties(tutorial1 PROPERTIES
    WIN32_EXECUTABLE TRUE
    MACOSX_BUNDLE TRUE
)

target_link_libraries(tutorial1 PRIVATE
    Qt6::Core
    Qt6::Gui
    Qt6::Test
    Qt6::Widgets
)

install(TARGETS tutorial1
    BUNDLE  DESTINATION .
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
)

qt_generate_deploy_app_script(
    TARGET tutorial1
    OUTPUT_SCRIPT deploy_script
    NO_UNSUPPORTED_PLATFORM_ERROR
)
install(SCRIPT ${deploy_script})

接下来,从命令行运行 cmake 或使用位于 Qt-prefix/<version>/<platform>/bin/qt-cmake 的便捷脚本的 qt-cmake

<Qt-prefix>/<version>/<platform>/bin/qt-cmake <source-dir> <build-dir> -G Ninja

然后,运行您首选的生成工具来构建可执行文件。这里,我们使用 Ninja

ninja

使用 qmake 构建

在您的 .pro 文件中进行构建设置配置

QT += widgets testlib

SOURCES = testqstring.cpp

# install
target.path = $$[QT_INSTALL_EXAMPLES]/qtestlib/tutorial1
INSTALLS += target

接下来,运行 qmake,最后运行 make 来构建您的可执行文件

qmake
make

注意:如果您正在使用 Windows,请将 make 替换为 nmake 或您使用的任何其他构建工具。

运行可执行文件

运行生成的可执行文件应显示以下输出

********* Start testing of TestQString *********
Config: Using QtTest library %VERSION%, Qt %VERSION%
PASS   : TestQString::initTestCase()
PASS   : TestQString::toUpper()
PASS   : TestQString::cleanupTestCase()
Totals: 3 passed, 0 failed, 0 skipped
********* Finished testing of TestQString *********

恭喜!您刚刚使用 Qt Test 框架编写并执行了您的第一个单元测试。

© 2024 Qt 公司 Ltd. 本文档的贡献版权属于其各自的所有者。本提供的文档根据自由软件基金会发布的GNU自由文档许可证1.3版本项下的条款提供。Qt及其相应的标志是芬兰以及/或全世界其他国家的Qt公司注册商标。所有其他商标均为其各自所有者的财产。