Qt Test中文文档

 Qt Test
时间:

Qt Test提供了对Qt应用程序和库进行单元测试的类。所有公共方法都在QTest名称空间中。另外,QSignalSpy类为Qt的信号和槽提供了简单的自省,而QAbstractItemModelTester允许对项目模型进行非破坏性测试。

注意:Qt测试模块没有二进制兼容性保证。这意味着使用Qt测试的应用程序只能使用它所开发的Qt版本。但是,源代码的兼容性是有保证的。

文章和指南

Qt Test Overview(概述)

Qt测试是对基于Qt的应用程序和库进行单元测试的框架。Qt Test提供了单元测试框架中常见的所有功能,以及用于测试图形用户界面的扩展。

Qt测试是为了方便编写基于Qt的应用程序和库的单元测试:

功能 细节
Lightweight(轻量级) Qt测试由大约6000行代码和60个导出符号组成。
Self-contained(自包含) 对于非gui测试,Qt测试只需要Qt Core模块中的几个符号。
Rapid testing(快速测试) Qt测试不需要特殊的测试运行程序;无需为测试进行特别登记。
Data-driven testing(数据驱动测试) 可以使用不同的测试数据多次执行测试。
Basic GUI testing(基本GUI测试) Qt测试提供了鼠标和键盘模拟功能。
Benchmarking(基准) Qt测试支持基准测试,并提供多个测量后端。
IDE friendly(IDE友好) Qt测试输出的消息可以由Qt Creator、Visual Studio和KDevelop解释。
Thread-safety(线程安全性) 错误报告是线程安全和原子性的。
Type-safety(类型安全) 模板的广泛使用可以防止隐式类型转换带来的错误。
Easily extendable(容易扩展) 可以很容易地将自定义类型添加到测试数据和测试输出中。

可以使用Qt Creator向导创建包含Qt测试的项目,并直接从Qt Creator生成和运行它们。有关更多信息,请参见运行自动测试。

创建一个测试

要创建测试,子类QObject并向其添加一个或多个私有槽。每个私有槽都是测试中的一个测试函数。QTest::qExec()可用于执行测试对象中的所有测试函数。

此外,您可以定义以下不作为测试函数处理的私有槽。当存在时,它们将由测试框架执行,并可用于初始化和清理整个测试或当前测试函数。

  • initTestCase_data() 将被调用以创建一个全局测试数据表。
  • cleanupTestCase() 将在执行最后一个测试函数后调用。
  • init() 将在执行每个测试函数之前调用。
  • cleanup() 将在每个测试函数之后调用。

将调用initTestCase()来准备测试。每个测试都应该离开系统处于可用状态,所以它可以多次运行。清理工作应在处理cleanupTestCase(),所以他们得到运行即使测试失败。每次测试后的函数。

使用init()准备测试函数。每个测试功能都应该使系统处于可用状态,这样它就可以重复运行。清理操作应该在Cleanup()中处理,因此即使测试函数失败并提前退出,它们也会运行。

或者,您可以使用RAII(资源获取是初始化),在析构函数中调用清理操作,以确保在测试函数返回且对象移出范围时发生清理操作。

如果initTestCase()失败,将不执行任何测试函数。如果init()失败,将不会执行以下测试函数,测试将继续到下一个测试函数。

class MyFirstTest: public QObject
{
    Q_OBJECT

private:
    bool myCondition()
    {
        return true;
    }

private slots:
    void initTestCase()
    {
        qDebug("Called before everything else.");
    }

    void myFirstTest()
    {
        QVERIFY(true); // check that a condition is satisfied
        QCOMPARE(1, 1); // compare two values
    }

    void mySecondTest()
    {
        QVERIFY(myCondition());
        QVERIFY(1 != 2);
    }

    void cleanupTestCase()
    {
        qDebug("Called after myFirstTest and mySecondTest.");
    }
};

最后,如果测试类有一个静态公共void initMain()方法,那么在实例化QApplication对象之前,QTEST_MAIN宏会调用它。例如,这允许设置像Qt::AA_DisableHighDpiScaling这样的应用程序属性。这是在5.14中添加的。

建立一个测试

您可以构建包含一个测试类的可执行文件,该测试类通常测试一个产品代码类。但是,您通常希望通过运行一个命令来测试项目中的多个类。
请参阅编写单元测试以了解逐步的解释。

构建CMake和CTest

您可以使用带有CMake和CTest的构建来创建测试。CTest允许根据与测试名称匹配的正则表达式包含或排除测试。您可以进一步将标签属性应用于测试,然后CTest可以基于这些标签包含或排除测试。当在命令行上调用test target时,将运行所有标记的目标。
CMake还有其他几个优点。例如,测试运行的结果可以使用CDash在web服务器上发布,几乎不需要付出任何努力。
CTest可扩展到非常不同的单元测试框架,并与QTest一起开箱即用。
下面是CMakeLists.txt文件的示例,该文件指定了项目名称和所使用的语言(这里是mytest和c++)、构建测试所需的Qt模块(Qt5Test)以及测试中包含的文件(tst_mytest.cpp)。

project(mytest LANGUAGES CXX)

find_package(Qt5Test REQUIRED)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_AUTOMOC ON)

enable_testing(true)

add_executable(mytest tst_mytest.cpp)
add_test(NAME mytest COMMAND mytest)

target_link_libraries(mytest PRIVATE Qt5::Test)

构建 with qmake

如果您使用qmake作为您的构建工具,只需添加以下到您的项目文件:

QT += testlib

如果您想通过make check运行测试,添加额外的行:

CONFIG += testcase

Qt Test Best Practices(最佳实践)

我们建议您为bug修复和新特性添加Qt测试。在您尝试修复错误之前,添加一个回归测试(理想情况下是自动的),它在修复之前失败,显示错误,并在修复之后通过。在开发新特性时,添加测试以验证它们是否按预期工作。
遵循一组编码标准将使Qt自动测试更有可能在所有环境中可靠地工作。例如,有些测试需要从磁盘读取数据。如果没有为如何实现这一点设置标准,一些测试将无法移植。例如,假设其测试数据文件位于当前工作目录中的测试仅对源版本有效。在影子构建中(在源目录之外),测试将无法找到它的数据。

Qt Test Tutorial(教程)

本教程简要介绍了如何使用Qt测试框架的一些特性。全文共分为五章:

参考

  • Qt Test C++ Classes

Qt Quick测试模块支持对Qt Quick应用程序进行单元测试。

  • Qt Quick Test QML Types
  • Qt Quick Test C++ API

0 评论