QTest单元测试框架,简单,好用,高效

简介: QTest单元测试框架,简单,好用,高效

在上一篇文章,小豆君向大家介绍了一个简单的测试程序,使大家了解了测试程序的基本样子,有了初步的印象。我们的主题是Qt,所以今天来介绍下Qt的测试框架,小豆君打算分三篇文章来详细介绍Qt测试框架。


在进入主题之前,我想说的是,之所以会分享一系列的测试方法,其实是想向大家推出一种编程方法,即:先编写测试用例,再编写类实现。这有别于我们通常先编写实现,再进行测试的方式。


先编写测试用例会帮助你更加了解架构和设计意图,迫使类开发者以类使用者的角度看待和使用接口,降低代码的耦合关系,在实现被改变的时候,能够快速响应改变后的正确性。如果你向使用者提供接口,这些测试用例就是最好的文档,且永不过时(如果是word文档,那很可能版本不一)。同时,它还可以帮助你在需求或逻辑不是很明朗的时候,理清需求,整理思路,避免不必要的开发。


就从我个人体验而言,在我初出茅庐时就有前辈跟我讲先测试后编程,而那时我却固执的认为这会降低我的编程效率,浪费时间,完全没有直接实现类来的更快,更爽。直到有一天我被不断变化的需求折磨的要死,尝试着采用先测试的开发方式,从此便体会到了它的好处。人真是必须先吃点苦头,才懂得前人总结的重要性啊。


如果你掌握并熟练的运用这一套开发方式,我想这绝对会是你优于他人的一项重要技能。


关于具体的编程步骤,小豆君会在介绍完Qt的测试框架后,再给大家作详细介绍,话不多说,我们进入今天的主题,QTest。


我们计划编写一个测试用例,用来测试上一篇文章中的Commodity类(程序员晋升必备技能——单元测试框架


1 添加testlib模块

直接打开SimpleTest工程,在pro文件中添加testlib模块

QT += core testlib


2 添加测试类CommodityTest


该类必须继承自QObject。所有的测试接口都必须声明为private slots,这样测试框架才会找到这些接口,并执行它们。我对于函数的命名为:

casen_函数名

当然,你也可以选用自己喜欢的命名方式。

头文件:

#include <QtTest/QtTest>
class CommodityTest : public QObject
{
    Q_OBJECT
private slots:
    void case1_serialNum();
    void case2_name();
    void case3_consting();
    void case4_price();
    void case5_profit();
};


源文件:

#include "commoditytest.h"
#include "commodity.h"
void CommodityTest::case1_serialNum()
{
    //测试编号
    Commodity c("beer_1", "啤酒", 4, 5);
    QVERIFY(c.serialNum() == "beer_1");
}
void CommodityTest::case2_name()
{
    //测试商品名称
    Commodity c("beer_1", "啤酒", 4, 5);
    QVERIFY(c.name() == "啤酒");
}
void CommodityTest::case3_consting()
{
    //测试商品成本
    Commodity c("beer_1", "啤酒", 4, 5);
    QVERIFY(c.consting() == 4);
}
void CommodityTest::case4_price()
{
    //测试商品价格
    Commodity c("beer_1", "啤酒", 4, 5);
    QVERIFY(c.price() == 5);
}
void CommodityTest::case5_profit()
{
    //测试利润 价格减去成本
    Commodity c("beer_1", "啤酒", 4, 5);
    QVERIFY(c.profit() == 1);
}


QVERIFY()宏将计算表达式的值,如果为true,则继续执行测试函数。否则,失败的消息会附加到测试日志或输出窗口中,测试函数将停止执行。


如果你想要对测试日志有更详细的输出,可使用QCOMPARE()宏来代替,用法与QVERIFY()一样。


3 修改main函数

将main函数修改为:

#include "commoditytest.h"
QTEST_MAIN(CommodityTest)

其中,QTEST_MAIN是一个main函数宏。


4 运行程序

程序输出如下内容:

哈哈,全部通过。

细心的同学可能发现,最终的测试函数中多了两个函数

/*在执行所有测试用例前,系统会先执行此函数,用来做一些初始化操作,
如果你有需要初始化的东西,例如数据库连接,环境变量的配置等都可以放到这个函数中*/
initTestCase()      
/*在最后一个测试用例执行结束,会调用这个函数,进行扫尾工作*/
cleanupTestCase()

5 使用命令行参数运行测试程序


可直接在Creator的“项目=》run=》运行设置=》命令行参数“中添加参数。


5.1 执行指定的测试函数

直接添加函数名即可:

运行:


5.2 将测试结果输出到文件

格式:-o 文件名称 文件格式(可以 是xml,txt等格式)

例如:

好的,关于Qt测试框架第一节的内容就分享到这里,希望你能有所收获,我们下期再见,最后不要忘了点赞分享哦。


更多分享请关注微信公众号:小豆君Qt分享,只要关注,便可加入C++\Qt交流群,一起学习,更可获得所有文章源码。

相关文章
|
1天前
|
存储 Web App开发 Java
《手把手教你》系列基础篇(九十五)-java+ selenium自动化测试-框架之设计篇-java实现自定义日志输出(详解教程)
【7月更文挑战第13天】这篇文章介绍了如何在Java中创建一个简单的自定义日志系统,以替代Log4j或logback。
11 5
|
1天前
|
敏捷开发 测试技术 持续交付
探索自动化测试框架的演进与实践
【7月更文挑战第14天】自动化测试框架在软件开发生命周期中扮演着越来越重要的角色。本文旨在探讨自动化测试框架从简单的脚本到复杂的系统级解决方案的演变过程,并分析其在不同阶段解决的关键问题。通过案例研究,我们将深入了解如何选择合适的自动化测试工具以及设计有效的测试策略,以提升软件质量保障的效率和效果。
|
4天前
|
设计模式 测试技术 Python
《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
【7月更文挑战第10天】Page Object Model (POM)是Selenium自动化测试中的设计模式,用于提高代码的可读性和维护性。POM将每个页面表示为一个类,封装元素定位和交互操作,使得测试脚本与页面元素分离。当页面元素改变时,只需更新对应页面类,减少了脚本的重复工作和维护复杂度,有利于团队协作。POM通过创建页面对象,管理页面元素集合,将业务逻辑与元素定位解耦合,增强了代码的复用性。示例展示了不使用POM时,脚本直接混杂了元素定位和业务逻辑,而POM则能解决这一问题。
23 6
|
2天前
|
敏捷开发 存储 数据管理
自动化测试框架设计:从理论到实践
【7月更文挑战第13天】本文将深入探讨自动化测试框架的设计原理与实现方法。通过分析自动化测试的必要性和框架设计的基本原则,结合具体案例,展示如何从零开始构建一个高效、可维护的自动化测试系统。文章不仅涵盖框架的结构设计,还包括最佳实践和常见问题的解决策略,为读者提供一套完整的解决方案和实操指南。
|
2天前
|
设计模式 Java 测试技术
《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
【7月更文挑战第12天】在本文中,作者宏哥介绍了如何在不使用PageFactory的情况下,用Java和Selenium实现Page Object Model (POM)。文章通过一个百度首页登录的实战例子来说明。首先,创建了一个名为`BaiduHomePage1`的页面对象类,其中包含了页面元素的定位和相关操作方法。接着,创建了测试类`TestWithPOM1`,在测试类中初始化WebDriver,设置驱动路径,最大化窗口,并调用页面对象类的方法进行登录操作。这样,测试脚本保持简洁,遵循了POM模式的高可读性和可维护性原则。
11 2
|
6天前
|
XML Java 测试技术
《手把手教你》系列基础篇(九十一)-java+ selenium自动化测试-框架设计基础-Logback实现日志输出-下篇(详解教程)
【7月更文挑战第9天】在Java项目中,使用Logback配置可以实现日志按照不同包名输出到不同的文件,并且根据日志级别分开记录。
20 4
|
4天前
|
敏捷开发 Devops 测试技术
自动化测试框架的演进与实践
【7月更文挑战第11天】在软件开发的历程中,自动化测试始终扮演着不可或缺的角色。本文将通过探讨自动化测试框架的发展脉络,揭示其在现代软件工程中的应用与挑战。从早期的线性脚本到今日的模块化框架,我们将一窥自动化测试技术的演进之路,并分享实践中的经验和策略,旨在为读者提供一套实用的自动化测试解决方案。
5 1
|
5天前
|
jenkins 测试技术 持续交付
探索自动化测试框架在软件开发中的应用
【7月更文挑战第10天】随着软件行业的快速发展,高效、可靠的软件产品成为企业竞争的核心。自动化测试框架作为提升软件质量与开发效率的关键技术,其在软件开发过程中扮演着越来越重要的角色。本文将深入探讨自动化测试框架的应用,从其定义、优势到具体实施策略,旨在为软件开发团队提供一套完整的自动化测试解决方案。通过实际案例分析,我们将展示如何有效整合自动化测试框架到软件开发生命周期中,以及如何克服实施过程中可能遇到的挑战。
|
3天前
|
设计模式 Java 测试技术
《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
【7月更文挑战第11天】页面对象模型(POM)通过Page Factory在Java Selenium测试中被应用,简化了代码维护。在POM中,每个网页对应一个Page Class,其中包含页面元素和相关操作。对比之下,非POM实现直接在测试脚本中处理元素定位和交互,代码可读性和可维护性较低。
|
4天前
|
机器学习/深度学习 人工智能 物联网
探索自动化测试框架的演变与未来趋势
【7月更文挑战第11天】本文通过探讨自动化测试框架的发展历程,揭示其从简单脚本到复杂系统的演进路径。文章首先概述了自动化测试框架的起源和早期形式,随后详细分析了现代框架的关键特性和优势,最后展望了自动化测试的未来发展趋势,包括人工智能、机器学习的整合以及跨平台测试能力的增强。