使用 Qt 的 QTestLib 模块进行测试

2024-02-18

我开始使用 Qt 的单元测试系统编写一些测试。

您通常如何组织测试?它是每个模块类一个测试类,还是使用单个测试类测试整个模块? Qt 文档建议遵循前一种策略。

我想为模块编写测试。该模块只提供了一个供模块用户使用的类,但是在其他类中抽象了很多逻辑,除了测试公共类之外,我也想测试这些逻辑。

问题是 Qt 提出的运行测试的方法涉及QTEST_MAIN macro:

QTEST_MAIN(TestClass)
#include "test_class.moc"

最终,一个测试程序只能测试一个测试类。为模块中的每个类创建测试项目有点糟糕。

当然,大家可以看一下QTEST_MAIN宏,重写它,并运行其他测试类。但有什么东西是开箱即用的吗?

到目前为止,我是手工完成的:

#include "one.h"
#include "two.h"

int main(int argc, char *argv[]) 
{ 
    QCoreApplication app(argc, argv); 
    TestOne one;
    QTest::qExec(&one, argc, argv);
    TestOne two;
    QTest::qExec(&two, argc, argv);
}

与@cjhuit 发布的答案相关

这是一个无需手动调用每个测试对象的示例

我尽量避免这样的事情:

MyTestClass1 t1;   t1.run();
MyTestClass2 t2;   t2.run();
//etc...

我的解决方案是让测试对象继承自将其自身添加到静态列表的基类然后主程序执行该列表中的所有测试对象。这样,就不需要更改任何支持框架代码。唯一改变的是测试类本身。

我是这样做的:

qtestsuite.h- 测试对象的基类

#ifndef QTESTSUITE_H
#define QTESTSUITE_H

#include <QObject>
#include <vector>

class QTestSuite : public QObject
{
    Q_OBJECT
public:
    static std::vector<QObject*> m_suites;

public:
    explicit QTestSuite();

};

#endif // QTESTSUITE_H

qtestsuite.cpp

#include "qtestsuite.h"
#include <iostream>

std::vector<QObject*> QTestSuite::m_suites;

QTestSuite::QTestSuite() : QObject()
{
    m_suites.push_back(this);
}

testall.cpp- 运行测试

#include "qtestsuite.h"

#include <QtTest/QtTest>
#include <iostream>

int main(int, char**)
{
    int failedSuitesCount = 0;
    std::vector<QObject*>::iterator iSuite;
    for (iSuite = QTestSuite::m_suites.begin(); iSuite != QTestSuite::m_suites.end(); iSuite++)
    {
        int result = QTest::qExec(*iSuite);
        if (result != 0)
        {
            failedSuitesCount++;
        }
    }
    return failedSuitesCount;
}

mytestsuite1.cpp- 一个示例测试对象,创建更多这样的对象

#include "qtestsuite.h"

#include <QtTest/QtTest>

class MyTestSuite1: public QTestSuite
{
     Q_OBJECT
private slots:
    void aTestFunction();
    void anotherTestFunction();
};

void MyTestSuite1::aTestFunction()
{
    QString str = "Hello";
    QVERIFY(str.toUpper() == "this will fail");
}

void MyTestSuite1::anotherTestFunction()
{
    QString str = "Goodbye";
    QVERIFY(str.toUpper() == "GOODBYE");
}

static MyTestSuite1 instance;  //This is where this particular test is instantiated, and thus added to the static list of test suites

#include "mytestsuite1.moc"

另外,创建 .pro 文件

qmake -project "CONFIG += qtestlib"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Qt 的 QTestLib 模块进行测试 的相关文章

  • 如何在 JUnit5 中为测试套件设置自定义测试执行顺序?

    我在 JUnit5 上进行了大量测试 并在多个线程中并行运行 还有有关每次测试时间的信息 我想在最长的测试开始时运行 并将最快的测试留在最后以优化公共执行时间 我还没有找到在 JUnit5 中执行此操作的方法 版本中5 4有一个org ju
  • 单元测试(有时)会因为浮点不精确而失败

    我有课Vector代表 3 维空间中的一个点 这个向量有一个方法normalize self length 1 将矢量缩小 放大为length vec normalize length length 该方法的单元测试有时由于浮点数的不精确性
  • 如何使用 Moq 模拟 Web 服务调用?

    The using下面点击了我不想实际点击的外部资源 我想测试someResult以及使用它的代码 但每次我运行单元测试时 该代码仍然尝试访问真正的 Web 服务 如何使用最小起订量来伪造对 Web 服务的真实调用 但不模拟使用中的其余代码
  • Qt 信号槽,新符号中的转换类型[重复]

    这个问题在这里已经有答案了 鉴于以下两个 connect ui gt comboBox SIGNAL activated QString ps SLOT requestPlotsAvailable QString connect ui gt
  • 在哪里可以找到 Qt 的 dll 的 pdb 文件?

    我正在调试 Qt 应用程序 在哪里可以找到 Qt 的调试 dll 我在windows上使用的是vs2010 它说它需要 Qt 中的许多 dll 的 pdb 文件 从 Qt 5 9 开始 与 Windows 发行版相对应的 PDB 可作为单独
  • QToolBar 的菜单延迟

    我通过制作 QAction 并向其添加 QMenu 在 QToolBar 上有一个菜单 如何消除单击图标时出现菜单之前的延迟 QToolBar myToolBar new QToolBar this QAction myAction new
  • 如何将 JUnit 5 与 Gradle 结合使用?

    在成功运行 JUnit 4 测试后 我尝试将 JUnit 5 与 Gradle 一起使用 预期结果 JUnit 4 测试在输出中给出了很好的 通过 结果 并在build reports tests 实际结果 下面的 JUnit 5 测试不输
  • Python 包?

    好吧 我认为无论我做错了什么 它可能都是显而易见的 但我无法弄清楚 我已经阅读并重新阅读了有关包的教程部分 我唯一能想到的是这不起作用 因为我直接执行它 这是目录设置 eulerproject init py euler1 py euler
  • cx_freeze:QODBC 驱动程序未加载

    我的 python 应用程序如下所示 test py from PyQt4 import QtCore from PyQt4 import QtGui from PyQt4 import QtSql import sys import at
  • 在 Eclipse Testrunner 中使用名称的 ParameterizedTest

    当您使用 Eclipse TestRunner 运行 JUnit 4 ParameterizedTest 时 图形表示相当愚蠢 对于每个测试 您都有一个名为 0 1 ETC 是否可以进行测试 0 1 等显式名称 实施一个toString测试
  • 对需要发送标头的项目进行单元测试

    我目前正在与 PHPUnit 合作 尝试在我正在编写的内容的同时开发测试 但是 我目前正在编写会话管理器 并且在这样做时遇到了问题 Session 处理类的构造函数是 private function construct if header
  • Windows 消息循环而不是 QApplication::exec() / QApplication::processEvents()

    我是否想念任何一个Qt如果我替换功能QApplication exec 使用标准 Windows 消息循环实现 这应该可以澄清我的意思 运行事件处理的常用 Qt 方式 int main int argc char argv QApplica
  • 安装多个版本的 Qt 库

    我在windows中安装了QtSDK 它的Qt库版本是4 7 0 现在我想为 mingw 和 VS2008 安装 Qt 库版本 4 8 2 我怎样才能做到这一点 如何向QtCreator引入多个版本 注意 我已经从以下位置下载了库http
  • 通过鼻子测试检查某个函数是否发出警告

    我正在使用编写单元测试nose http somethingaboutorange com mrl projects nose 0 11 2 我想检查函数是否引发警告 该函数使用warnings warn 这是很容易就能做到的事情吗 def
  • 用于测试的嵌入式 H2 数据库的 Spring 配置

    使用 Spring 进行集成测试的配置是什么样的 嵌入式 h2 数据源 http www h2database com html main html以及可选的 JUnit 我第一次尝试单连接数据源 http static springsou
  • qt项目如何设置安装路径

    我正在寻找与 qmake configure prefix 等效的内容 基本上 我想覆盖默认的安装 部署目录 这是如何用命令行 qmake 指定的 我还使用 QtCreator 构建了很多 gui 项目 并且我想知道如何在 QtCreato
  • MAC 上的 QT/C++ - 未设置应用程序图标

    我正在努力解决的奇怪问题 在与我的 pro QT 项目文件相同的文件夹中 我有一个 Resources myIcon png 我试图将其设置为我构建的应用程序的图标 在 OSX 上运行 我阅读了文档 它建议在 pro 文件中添加 ICON
  • 使用 Intern 测试自定义 JavaScript(不是 Node 模块)

    是否可以为自定义客户端创建和运行测试套件 JavaScript 不是作为 Node 模块创建的 应该如何 那么配置要改吗 Intern 配置中有 loader 部分 指定了 如果我做对了 将会加载的包 是否有必要 以某种方式在这里包含我的自
  • Moq - 是否可以在不使用 It.IsAny 的情况下设置模拟

    我一直使用 Moq 进行单元测试 有时我会嘲笑有很多参数的方法 想象一下这样的方法 public class WorkClient public void DoSomething string itemName int itemCount
  • 如何对 Google API 调用进行单元测试

    我有一个以下方法 它从 Google Analytics 检索访问次数最多的页面 public function getData limit 10 ids 12345 dateFrom 2011 01 01 dateTo date Y m

随机推荐