gpt4 book ai didi

qt - 使用 Qt 的 QTestLib 模块进行测试

转载 作者:行者123 更新时间:2023-12-02 09:43:01 26 4
gpt4 key购买 nike

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

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

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

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

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"

关于qt - 使用 Qt 的 QTestLib 模块进行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2750005/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com