在ubuntu系统,用QTestLib 做Qt单元测试,请给我一个入门的教程例子

这篇具有很好参考价值的文章主要介绍了在ubuntu系统,用QTestLib 做Qt单元测试,请给我一个入门的教程例子。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

我想在ubuntu系统,用QTestLib 做Qt单元测试,请给我一个入门的教程例子


非常好,下面我将为您介绍在 Ubuntu 系统下使用 QTestLib 进行 Qt 单元测试的入门教程。QTestLib 是 Qt 的自带的单元测试框架,完全集成于 Qt 环境中,易于使用。

我们将以 Qt Creator 为例,分为以下几个步骤:

## 1. 新建 Qt 控制台应用程序

在 Qt Creator 中新建一个 Qt 控制台应用程序项目(不需要 QT5 widgets),选择标准 C++ 项目,在项目中添加自己写的类和函数。

## 2. 新建测试项目

在同一个 Qt Creator 项目中新建一个 Qt 控制台应用程序项目(不需要 QT5 widgets),选择测试项目。这里生成的测试代码文件是 `main.cpp` 与 `moc_*.cpp`。

## 3. 测试基础

代码测试通常涉及到以下几个问题:

- 如何确保测试用例的一致性和可重复性?
- 如何设置和清除测试环境?
- 如何捕捉和报告测试失败情况?

QTestLib 框架针对这些问题提供了一些机制:

#### 3.1. 测试用例的一致性

QTestLib 提供了 `QTest::qExec()`函数,在其中运行所有的测试用例,如下所示:

```cpp
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MyTest test;  // 新建测试类
    return QTest::qExec(&test, argc, argv); // 运行所有测试用例
}
```

`QTest::qExec()` 函数的第一个参数是测试类的指针,指向我们的测试类的对象 `test`,第二个和第三个参数是 `main()` 函数的标准参数。通过 `QTest::qExec()` 函数,可以运行所有测试用例,并将结果导出到应用程序的标准输出,以便分析和报告。

#### 3.2. 测试环境的设置与清除

QTestLib 可以通过两种方式在测试之前设置和清除测试环境:

- setUp() 和 tearDown() 函数:在测试之前和测试之后,分别设置和清除测试环境。

例如,测试类中定义如下两个测试函数:

```cpp
class MyTest : public QObject
{
    Q_OBJECT
public slots:
    void testAddition()
    {
        ...
    }

    void testSubtraction()
    {
        ...
    }

private:
    int m_value;
};

```

我们可以在测试开始前使用 `setUp()` 函数设置测试环境,在测试结束后使用 `tearDown()` 函数清除测试环境。如下所示:

```cpp
class MyTest : public QObject
{
public:
    MyTest();

private slots:
    void initTestCase();    // 定义测试前的函数
    void cleanupTestCase(); // 定义测试结束后的函数

    void testAddition();
    void testSubtraction();

private:
    int m_value;
};

void MyTest::initTestCase()
{
    m_value = 0;
}

void MyTest::cleanupTestCase()
{
}

void MyTest::testAddition()
{
    m_value = 2 + 2;
    QVERIFY(m_value == 4); // 断言,是否为真
}

void MyTest::testSubtraction()
{
    m_value = 5 - 3;
    QVERIFY(m_value == 2); // 断言,是否为真
}
```

当测试开始时,QTestLib 将调用 `initTestCase()` 函数,我们可以在其中设置测试环境。测试结束后,QTestLib 调用 `cleanupTestCase()` 函数,我们可以在其中清除测试环境。

- 预定义函数:QTestLib 还提供了一些预定义的测试函数,它们在测试开始前或测试结束后执行。

例如,在 `main()` 函数中,我们可以使用 `QTest::qExec()` 函数执行测试,同时设置和清除测试环境,如下所示:

```cpp
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    return QTest::qExec(new MyTest, argc, argv);
}
```

`QTest::qExec()` 函数的第一个参数是测试类的指针,指向我们的测试类的对象 `test`,第二个和第三个参数是 `main()` 函数的标准参数。通过 `QTest::qExec()` 函数,可以运行所有测试用例,并将结果导出到应用程序的标准输出,以便分析和报告。

#### 3.3. 测试异常的处理

当测试用例失败时,QTestLib 会抛出异常。我们可以在测试用例内使用以下宏定义来断言测试结果,例如 `QVERIFY()` 和 `QCOMPARE()`:

- `QVERIFY()`:用于验证一个表达式的结果为 true。
- `QCOMPARE()`:用于验证两个表达式的值相等。

如果表达式的结果为 false 或者两个值不相等,将会抛出 `QTest::qFail(const char *message, const char *file, int line)` 异常,测试用例失败。

```cpp
void MyTest::testSubtraction()
{
    m_value = 5 - 3;
    QVERIFY(m_value == 2); // 断言:m_value 是否等于 2
}
```

如果断言失败,QTestLib 会输出失败信息,并抛出异常,测试用例失败。

## 4. 使用 QTestLib 进行测试

下面是一个例子,展示了如何使用 QTestLib 进行简单的测试:

```cpp
#include <QtTest/QtTest>
#include "mymath.h"

class MyTest : public QObject
{
    Q_OBJECT
private slots:
    void
    
    可惜没有得到完整,可能超出接口回复文本长度了。
    再次提问:
    
    
    
    请给出一个例子,展示了如何使用 QTestLib 进行简单的单元测试:
    
    
    好的,下面是一个使用 QTestLib 进行简单单元测试的例子:

```c++
#include <QtTest>

class TestMath : public QObject
{
    Q_OBJECT

public:
    TestMath() {}

private slots:
    void testAddition()
    {
        int result = 1 + 2;
        QVERIFY(result == 3);
    }

    void testSubtraction()
    {
        int result = 5 - 3;
        QCOMPARE(result, 2);
    }

    void testMultiplication()
    {
        int result = 4 * 2;
        QVERIFY2(result == 8, "Failed: result is not equal to 8");
    }
};

QTEST_APPLESS_MAIN(TestMath)
#include "testmath.moc"
```

在这个例子中,我们创建了一个名为 TestMath 的测试类,并在其中声明了三个测试函数:testAddition、testSubtraction 和 testMultiplication。在每个测试函数中,我们执行一些计算,并使用 QVERIFY、QVERIFY2 和 QCOMPARE 宏来验证结果是否正确。

QVERIFY 和 QVERIFY2 宏会分别判断一个表达式是否为真,如果为假则测试失败并输出一条错误消息。而 QCOMPARE 宏则比较两个表达式的值是否相等,如果不相等则测试失败并输出一条错误消息。

最后,我们使用 QTEST_APPLESS_MAIN 宏来定义测试应用程序的入口点,并引入testmath.moc文件以支持使用QObject的测试类。

以下是使用 QTestLib 进行简单的单元测试的示例代码。

## 1. 创建工程

首先,打开 Qt Creator,创建一个新的 Qt 控制台应用程序工程:选择 “File” > “New File or Project”,选择 “Non-Qt Project” > “Plain C++ Project”,输入名称、工程路径和某个可用的编译器,再单击 “Next”。

在 “Kit Selection” 页面,选择 “Desktop Qt 5.x.x GCC 64-bit” 或任何可用的 Qt 5 Kit,然后单击 “Next”。

在 “Project Management” 页面,将 “Create Main Function” 选项取消勾选,输入 “TestProject” 名称,然后单击 “Next”。

在 “Project Configuration” 页面,选择 “None” 作为 “Version Control”,然后单击 “Finish”。

此时,工程已经创建成功了。

## 2. 添加 QTestLib 库

在工程的 `TestProject.pro` 文件中,添加以下行:

```pro
QT += testlib
CONFIG += console
```

这将包含 QTest 类以及与应用一起使用的测试库依赖。

## 3. 编写测试用例

在 “Project” 文件夹下创建一个新的源文件 `testexample.cpp` ,编写测试用例。以下是一个例子:

```cpp
#include <QtTest/QtTest>

// 这个单元测试将测试 int 是否相等
class TestExample : public QObject
{
    Q_OBJECT

private slots:
    void simpleTest()
    {
        int x = 1;
        QCOMPARE(x, 1); // 期望 x 值为 1
    }

    void nullTest()
    {
        void* p = 0;
        QVERIFY(!p);  // 期望 p 值为 0
    }
};
```

如您所见,这里定义了一个 `TestExample` 类,它包含了两个测试用例:第一个测试用例检查 `x` 是否等于 `1`,第二个测试用例检查一个指针是否为空。

使用 QTest 宏 `QCOMPARE` 和 `QVERIFY` 来比较结果。

## 4. 激活自动测试

QTest 使用一个宏 `QTEST_APPLESS_MAIN` 来自动运行测试用例。只需要创建一个 “main.cpp” 文件,并使用以下代码激活宏。

```cpp
#include <QTest>

QTEST_APPLESS_MAIN(TestExample)
```

此时,便可以在 Qt Creator 的 “Compile Output” 面板中,找到文本 “PASS:2 测试”。这表示两个测试用例已成功通过。

如果某个测试用例未成功通过,则在 Qt Creator 中的 “Compile Output” 面板 中,您可以找到更多信息。

以下是一个使用 QTestLib 进行简单测试的例子。

假设我们有一个简单的计算器程序,使用 QTestLib 进行测试。

## 1. 编写测试用例

创建一个名为 `CalculatorTest.h` 的文件,编写测试用例。以下是一个例子:

```cpp
#include <QtTest/QtTest>
#include "Calculator.h"

class CalculatorTest : public QObject {
    Q_OBJECT
private slots:
    void testAddition();
    void testSubtraction();
    void testMultiplication();
    void testDivision_data();
    void testDivision();
};

void CalculatorTest::testAddition() {
    Calculator calculator;
    QCOMPARE(calculator.addition(2, 2), 4);
    QCOMPARE(calculator.addition(0, 0), 0);
    QCOMPARE(calculator.addition(-1, 1), 0);
}

void CalculatorTest::testSubtraction() {
    Calculator calculator;
    QCOMPARE(calculator.subtraction(2, 2), 0);
    QCOMPARE(calculator.subtraction(0, 0), 0);
    QCOMPARE(calculator.subtraction(-1, 1), -2);
}

void CalculatorTest::testMultiplication() {
    Calculator calculator;
    QCOMPARE(calculator.multiplication(2, 2), 4);
    QCOMPARE(calculator.multiplication(0, 0), 0);
    QCOMPARE(calculator.multiplication(-1, 1), -1);
}

void CalculatorTest::testDivision_data() {
    QTest::addColumn<int>("nominator");
    QTest::addColumn<int>("denominator");
    QTest::addColumn<int>("quotient");
    QTest::addColumn<bool>("exception");

    QTest::newRow("Valid case 1") << 4 << 2 << 2 << false;
    QTest::newRow("Valid case 2") << 0 << 4 << 0 << false;
    QTest::newRow("Valid case 3") << 1 << -1 << -1 << false;
    QTest::newRow("Invalid case") << 4 << 0 << 0 << true;
}

void CalculatorTest::testDivision() {
    Calculator calculator;
    QFETCH(int, nominator);
    QFETCH(int, denominator);
    QFETCH(int, quotient);
    QFETCH(bool, exception);

    if (exception) {
        QVERIFY_EXCEPTION_THROWN(calculator.division(nominator, denominator), std::runtime_error);
    } else {
        QCOMPARE(calculator.division(nominator, denominator), quotient);
    }
}

QTEST_APPLESS_MAIN(CalculatorTest)
#include "CalculatorTest.moc"
```

每个测试用例都是 `void` 函数,我们使用的是 `QCOMPARE()` 宏进行判断实际输出的值与预期相比是否一致。

在上述代码中,我们使用了 `Q_TEST_MAIN` 宏,表示不需要自动生成 main 函数,并传入了测试类名称 `CalculatorTest`,同时还用到了数据驱动的方式(`testDivision_data()` 和 `testDivision()` 函数)来完成涉及多个数据集的测试。

## 2. 编译和运行测试

在命令行中,进入工程根目录,输入以下命令进行编译:

```bash
qmake -project
qmake
make
```

在命令行中,输入以下命令运行测试:

```bash
./CalculatorTest
```

在命令行中,你可以看到类似以下的输出结果:

```bash
********* Start testing of CalculatorTest *********
Config: Using QtTest library 5.15.2, Qt 5.15.2 (x86_64-little_endian-lp64 shared (dynamic) release build; by GCC 8.3.0)
PASS   : CalculatorTest::initTestCase()
PASS   : CalculatorTest::testAddition()
PASS   : CalculatorTest::testDivision("Invalid case")
PASS   : CalculatorTest::testDivision("Valid case 1")
PASS   : CalculatorTest::testDivision("Valid case 2")
PASS   : CalculatorTest::testDivision("Valid case 3")
PASS   : CalculatorTest::testMultiplication()
PASS   : CalculatorTest::testSubtraction()
PASS   : CalculatorTest::cleanupTestCase()
Totals: 9 passed, 0 failed, 0 skipped, 0 blacklisted, 37ms
********* Finished testing of CalculatorTest *********
```

以上就是使用 QTestLib 进行简单测试的例子。如果您有其他问题或疑问,欢迎随时提出。 

 文章来源地址https://www.toymoban.com/news/detail-803877.html

到了这里,关于在ubuntu系统,用QTestLib 做Qt单元测试,请给我一个入门的教程例子的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RK3568开发笔记(七):在宿主机ubuntu上搭建Qt交叉编译开发环境,编译一个Demo,目标板运行Demo测试

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/132733901 红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中… 上一篇:《RK3568开发笔记(六):

    2024年02月07日
    浏览(63)
  • 【Qt】Qt单元测试详解(一):通过QtCreator创建测试工程

    Qt程序支持多种测试框架,其中QtCreator可以协助创建4种测试框架,分别是: 其他框架需要自行创建:Catch2、CTest 创建项目时,选择“其他项目”–“子目录项目”,这样方便将项目工程组织成树形结构。 例如,本人创建的项目工程树结构为: 1)右键项目,选择“新子项目”

    2024年02月08日
    浏览(72)
  • QT基础篇(16)QT5单元测试框架

    1.QTEstLib框架 QTestLib框架是一个用于软件测试的开源框架,是Qt工具套件的一部分。它提供了一组用于编写自动化测试和单元测试的类和函数。 QTestLib可以方便地为Qt应用程序编写单元测试,包括测试GUI和非GUI的代码。它提供了一系列断言和辅助函数,用于验证测试的预期结果

    2024年01月25日
    浏览(39)
  • 单元测试之 - Review一个微服务的单元测试

    这里以github上一个microservice的demo代码为例,来看看如何为一个完整的服务编写单元测试。具体代码如下所示,我们重点查看一下catalog和customer,order中的单元测试有哪些。 首先来看catalog服务的单元测试,这个服务下面主要编写了CatalogWebIntegrationTest.java和RepositoryTest.java。下图是

    2024年02月14日
    浏览(43)
  • “一个测试用例是否为单元测试”的争议

    “一个测试用例是否为单元测试”的争议 Google看到测试领域中这种“百家争鸣”的现象后,创立了自己的命名方式,将测试分为 小型测试、中型测试和大型测试 ,而单元测试是小型或中型测试的具体实现形式。具体如下表: 小型测试 中型测试 大型测试 单元测试 单元测试

    2024年02月12日
    浏览(39)
  • 【单元测试】测还是不测,这是一个问题

    这篇文章也可以在我的博客中查看 相信大家从小就被千叮万嘱要做单元测试。然后秉承这一信念,成为了一个测试狂魔。凡有代码,测!覆盖!最终,一波操作猛如虎:467测试,0错误, 0自信 。 第二天。 你为了优化,颤抖着手更改了一行代码。果不其然发现牵连了 1e9 个测

    2024年02月03日
    浏览(49)
  • linux环境编程(1): 实现一个单元测试框架-2

    在之前的文章中, 介绍了如何实现一个类似gtest的单元测试框架, 完整的项目代码可以参考这里: https://github.com/kfggww/cutest . 近期对cutest的实现做了一些修改, 包括: Test Suite的声明宏, 修改为TEST_SUITE 增加Test Suite的声明宏TEST_SUITE_WITH. 可传递Suite的init和cleanup函数, 在Suite中每个Cas

    2024年02月12日
    浏览(34)
  • 一个简单好用的C语言单元测试框架-Unity

    Unity是一个用于C语言的轻量级单元测试框架。它由Throw The Switch团队开发,旨在简化嵌入式系统的单元测试。单元测试中单元的含义,单元就是人为规定的最小的被测功能模块,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。在

    2024年01月21日
    浏览(58)
  • 一个简单好用的C++语言单元测试框架-GoogleTest

    GoogleTest 是由 Google 开发的一个用于编写 C++ 单元测试的框架。单元测试中单元的含义,单元就是人为规定的最小的被测功能模块,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。在实际项目中,单元测试往往由开发人员完成。

    2024年01月19日
    浏览(97)
  • Spring Boot进行单元测试,一个思路解决重启低效难题!

    所谓单元测试就是对功能最小粒度的测试,落实到JAVA中就是对单个方法的测试。 junit可以完成单个方法的测试,但是对于Spring体系下的web应用的单元测试是无能为力的。因为spring体系下的web应用都采用了MVC三层架构,依托于IOC,层级之间采用了依赖注入的方式来进行调用。如

    2024年02月05日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包