添加测试

测试您的插件代码有两种主要方法:

两者都有它们特定的用例和设置,将在下一节中进行描述。

设置 CMake

在添加测试之前,准备您的构建文件。它们需要查找 QtTest 依赖项,并具有构建您的插件进行测试的 CMake 选项

# Add a CMake option that enables building your plugin with tests.
# You don't want your released plugin binaries to contain tests,
# so make that default to 'NO'.
# Enable tests by passing -DWITH_TESTS=ON to CMake.
option(WITH_TESTS "Builds with tests" NO)

if(WITH_TESTS)
  # Look for QtTest
  find_package(${QtX} REQUIRED COMPONENTS Test)
  # Tell CMake functions like add_qtc_plugin about the QtTest component.
  set(IMPLICIT_DEPENDS Qt::Test)

  # Enable ctest for auto tests.
  enable_testing()
endif()

插件测试

插件测试紧密集成到您的插件及其与 Qt Creator 的交互中。要测试需要 Qt Creator 或您的插件的基础设施设置的内容,请编写插件测试。

插件测试通过使用命令行参数 -test <pluginname> 启动 Qt Creator 来执行。然后,Qt Creator 完全加载了您的插件及其所有依赖项,经过正常的 插件生命周期。在您的插件及其所有依赖项完全初始化后,您的测试被执行。之后,Qt Creator 会自动关闭。因此,您的插件测试可以访问所有导出的功能,这些功能是您的插件所依赖的 Qt Creator 插件,如 Core::ICore。使用 QtTest 的正常测试宏,如 QVERIFYQCOMPARE 来报告您的测试成功或失败。

要添加插件测试,请添加一个基于 QObject 的类,该类具有私有槽作为测试,并在您的插件的 ExtensionSystem::IPlugin::initialize() 方法中使用 addTest() 进行注册。使用 WITH_TESTS 对所有测试相关代码进行掩护,以避免将带有测试功能的插件二进制版本发布。

包含 QtTest

#ifdef WITH_TESTS
#include <QtTest>
#endif

然后实现测试函数

#ifdef WITH_TESTS
class MyPluginTests : public QObject
{
    Q_OBJECT

private slots:
    void testMyTest()
    {
        // a failing test
        QVERIFY(false);
    }
};
#endif

ExtensionSystem::IPlugin::initialize() 中注册您的测试

#ifdef WITH_TESTS
    addTest<MyPluginTests>();
#endif

如果您在源文件中声明了测试对象,如本例所示,请包括所需的 Qt 元对象编译器的 .moc 文件

#ifdef WITH_TESTS
#include "example.moc"
#endif

自动测试

要添加不依赖于正在运行的 Qt Creator 基础设施测试,请使用独立于您的插件界面的自动测试。解析器是一个常见的示例,但如果内容是模块化的,您还可以以这种方式测试很多其他内容。

即使您的测试不在您的插件界面中,如插件测试一样,您仍然可以将测试链接到库,甚至您的插件库本身,以避免代码重复或代码重复编译。

原则上,您可以使用任何自动测试框架,但 QtTest 是一个简单且与 Qt 集成的很好的自动化测试框架,也被用于 插件测试

要添加您的测试,请添加测试的 C++ 文件,并在您的 CMake 文件中添加测试目标 add_qtc_test。如果您的测试使用您的插件库,使用 DEPENDS 将其作为依赖项添加。

在以下示例中,插件导出了一个函数 addOne

#pragma once

#include "example_global.h"

namespace Example {

int EXAMPLE_EXPORT addOne(int i);

} // namespace Example

并在源文件中实现它

int addOne(int i)
{
    return i; // that is wrong!
}

此测试与插件库目标使用 DEPENDS 相关联

# conditionally add auto tests
if(WITH_TESTS)
  add_qtc_test(tst_mytest
    SOURCES tst_mytest.cpp
    DEPENDS Example
  )
endif()

基于 QtTest 的测试接着包含来自插件的头部,并测试该功能

#include "examplefunctions.h"

#include <QtTest>

class tst_MyTest : public QObject
{
    Q_OBJECT

private slots:
    void mytest();
};

void tst_MyTest::mytest()
{
    // a failing test
    QCOMPARE(Example::addOne(1), 2);
}

QTEST_GUILESS_MAIN(tst_MyTest)

#include "tst_mytest.moc"

©2024 The Qt Company Ltd. 本文档中包含的贡献均是各自所有者的版权。提供的文档遵照由自由软件基金会发布的 GNU自由文档许可证版本1.3 的条款。Qt及其相关标志是芬兰及其它国家对The Qt Company Ltd的商标。所有其他商标均为各自所有者的财产。