QTest测试框架,Gui测试

简介: QTest测试框架,Gui测试

前两篇文章,小豆君主要对QTest的非Gui测试进行了介绍,既然Qt最强的是界面部分,那今天我们就来看下界面的单元测试,QTest是如何做的。


众所周知,既然使用界面,当然就需要和用户交互,比如,鼠标点击,在文本框中输入文本,既然要自动化测试,那必须将鼠标的点击事件,键盘的输入事件等进行模拟。


为此,QTest::keyClicks()模拟在该控件上输入按键序列,基本等同于输入字符串。此外,还也可以指定键盘组合按键,例如与ctrl,shift等按键的组合,并在每次单击按键后设置延迟(以毫秒为单位)。


类似的方式,还可以使用QTest::keyClick()、QTest::keyPress()、QTest::keyRelease()、QTest::mouseClick()、QTest::mouseDClick()、QTest::mouseMove()、QTest::mousePress()和QTest::mouseRelease()函数来模拟GUI事件。


下面的一个例子,我们主要介绍keyClicks的用法,其它类同。

如下图所示,在输入价格和成本后,自动显示利润。我们为该窗口类取名为CommodityWidget




1 创建CommodityWidget窗口


ui界面如上图所示。


commoditywidget.h

#ifndef COMMODITYWIDGET_H
#define COMMODITYWIDGET_H
#include <QWidget>
namespace Ui {
class CommodityWidget;
}
class CommodityWidget : public QWidget
{
    Q_OBJECT
public:
    friend class CommodityTest;
    explicit CommodityWidget(QWidget *parent = 0);
    ~CommodityWidget();
    double  costing() const;
    double  price() const;
    double  profit() const;
private slots:
    void showProfit();
    void on_line_price_textChanged(const QString &arg1);
    void on_line_costing_textChanged(const QString &arg1);
private:
    Ui::CommodityWidget *ui;
};
#endif // COMMODITYWIDGET_H


在头文件中的

friend class CommodityTest;

因为CommdityTest模拟键盘事件,需要直接访问ui界面中的控件,所以将它声明为CommodityWidget的友元类。


commoditywidget.cpp

#include "commoditywidget.h"
#include "ui_commoditywidget.h"
#include "commodity.h"
CommodityWidget::CommodityWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::CommodityWidget)
{
    ui->setupUi(this);
}
CommodityWidget::~CommodityWidget()
{
    delete ui;
}
double CommodityWidget::costing() const
{
    return ui->line_costing->text().toDouble();
}
double CommodityWidget::price() const
{
    return ui->line_price->text().toDouble();
}
double CommodityWidget::profit() const
{
    return ui->line_profit->text().toDouble();
}
void CommodityWidget::showProfit()
{
    double c = costing();
    double p = price();
    Commodity commodity("beer_1", "啤酒", c, p);
    ui->line_profit->setText(QString::number(commodity.profit()));
}
void CommodityWidget::on_line_price_textChanged(const QString &arg1)
{
    showProfit();
}
void CommodityWidget::on_line_costing_textChanged(const QString &arg1)
{
    showProfit();
}



2 编写测试函数

在CommodityTest的头文件中添加如下槽函数

头文件:

private slots:
    //成本
    void case1_gui_costing();
    //价格
    void case2_gui_price();
    //利润
    void case3_gui_profit();


源文件,注意这里添加了ui头文件:

#include "commoditytest.h"
#include "commodity.h"
#include "commoditywidget.h"
#include "ui_commoditywidget.h"
void CommodityTest::case1_gui_costing()
{
    CommodityWidget w;
    //模拟按键,在键盘上输入成本 5.0
    QTest::keyClicks(w.ui->line_costing, "5.0");
    QCOMPARE(w.costing(), 5.0);
}
void CommodityTest::case2_gui_price()
{
    CommodityWidget w;
    //模拟按键,在键盘上输入价格 7.2
    QTest::keyClicks(w.ui->line_price, "7.2");
    QCOMPARE(w.price(), 7.2);
}
void CommodityTest::case3_gui_profit()
{
    CommodityWidget w;
    //模拟按键,在键盘上输入成本5.0,价格7.2 
    //最后比较利润是否为2.2
    QTest::keyClicks(w.ui->line_costing, "5.0");
    QTest::keyClicks(w.ui->line_price, "7.2");
    QCOMPARE(w.profit(), 2.2);
}


运行程序,如下图:




3 多数据测试Gui

这和上一节的多数据测试框架基本相同,只是这里换成了Gui,具体我就不讲了,不明白的可以参考上一篇文章QTest测试框架,多数据测试


下面直接上代码

头文件:

private slots:
    //利润
    void case3_gui_profit();
    void case3_gui_profit_data();


源文件:

void CommodityTest::case3_gui_profit()
{
    QFETCH(QTestEventList, costing);
    QFETCH(QTestEventList, price);
    QFETCH(double, expected);
    CommodityWidget w;
    costing.simulate(w.ui->line_costing);
    price.simulate(w.ui->line_price);
    QCOMPARE(w.profit(), expected);
}
void CommodityTest::case3_gui_profit_data()
{
    QTest::addColumn<QTestEventList>("costing");
    QTest::addColumn<QTestEventList>("price");
    QTest::addColumn<double>("expected");
    QTestEventList costing1;
    QTestEventList price1;
    costing1.addKeyClicks("5.0");
    price1.addKeyClicks("7.2");
    QTest::newRow("normal") << costing1 << price1 << 2.2;
    QTestEventList costing2;
    QTestEventList price2;
    costing2.addKeyClicks("5.0");
    price2.addKeyClicks("3.2");
    QTest::newRow("negative") << costing2 << price2 << -1.8;
}


运行如下:



现在假设CommdityWidget中的profit函数有bug,例如,我将toDouble改成了toInt,我们来看看会出现什么结果:

double CommodityWidget::profit() const
{
    return ui->line_profit->text().toInt();
}





看,测试程序告诉我们在文件commoditytest.cpp的第88行出现问题,并且,正确的结果应该是2.2,而实际返回的结果是0,我们查看第88行,原来是profit函数有bug,再查看该函数的实现,原来是将toDouble写成了toInt,所以导致输出结果为0




前一阵,在群中我看到有一位朋友提出,由于项目需求,需要人不停的点击鼠标按键来获取某些数据,而今天介绍的Gui测试框架是完全可以实现的,并且只需要四五行代码就能完全胜任。


关于测试框架的内容大概就这么多了,但里面还有很多有意思的函数,如果有朋友感兴趣,可以直接查看Qt帮助文档就可以啦。


最后,小豆君再啰嗦几句,对于测试代码可能有很多人懒得去写,但是,一旦写好了测试程序,你的开发工作会变得相当轻松,每次修改或重构程序后,直接运行测试程序,它会很快的帮助你定位问题,而不是每次写完程序后,还要重复的去自己输入测试数据,在界面上各种点击。


测试代码,是真正做到了一键运行,检查工作全部交给电脑,而你也可以喝喝茶,休息休息啦。


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

相关文章
|
13天前
|
敏捷开发 Java 测试技术
探索软件测试中的自动化测试框架
在软件开发的生命周期中,软件测试扮演着至关重要的角色。随着技术的不断进步和软件项目的日益复杂化,传统的手动测试方法已经无法满足高效、准确的测试需求。自动化测试作为一种提高测试效率和质量的有效手段,越来越受到开发者和测试者的青睐。本文将深入探讨自动化测试框架的重要性、常见的自动化测试工具以及如何选择合适的自动化测试框架。
37 10
|
15天前
|
设计模式 前端开发 JavaScript
自动化测试框架设计原则与最佳实践####
本文深入探讨了构建高效、可维护的自动化测试框架的核心原则与策略,旨在为软件测试工程师提供一套系统性的方法指南。通过分析常见误区,结合行业案例,阐述了如何根据项目特性定制自动化策略,优化测试流程,提升测试覆盖率与执行效率。 ####
41 6
|
15天前
|
人工智能 前端开发 测试技术
探索软件测试中的自动化框架选择与优化策略####
本文深入剖析了当前主流的自动化测试框架,通过对比分析各自的优势、局限性及适用场景,为读者提供了一套系统性的选择与优化指南。文章首先概述了自动化测试的重要性及其在软件开发生命周期中的位置,接着逐一探讨了Selenium、Appium、Cypress等热门框架的特点,并通过实际案例展示了如何根据项目需求灵活选用与配置框架,以提升测试效率和质量。最后,文章还分享了若干最佳实践和未来趋势预测,旨在帮助测试工程师更好地应对复杂多变的测试环境。 ####
40 4
|
15天前
|
监控 jenkins 测试技术
自动化测试框架的构建与实践
【10月更文挑战第40天】在软件开发周期中,测试环节扮演着至关重要的角色。本文将引导你了解如何构建一个高效的自动化测试框架,并深入探讨其设计原则、实现方法及维护策略。通过实际代码示例和清晰的步骤说明,我们将一起探索如何确保软件质量,同时提升开发效率。
34 1
|
21天前
|
机器学习/深度学习 前端开发 测试技术
探索软件测试中的自动化测试框架选择与优化策略####
本文深入探讨了在当前软件开发生命周期中,自动化测试框架的选择对于提升测试效率、保障产品质量的重要性。通过分析市场上主流的自动化测试工具,如Selenium、Appium、Jest等,结合具体项目需求,提出了一套系统化的选型与优化策略。文章首先概述了自动化测试的基本原理及其在现代软件开发中的角色变迁,随后详细对比了各主流框架的功能特点、适用场景及优缺点,最后基于实际案例,阐述了如何根据项目特性量身定制自动化测试解决方案,并给出了持续集成/持续部署(CI/CD)环境下的最佳实践建议。 --- ####
|
22天前
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
64 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
|
10天前
|
JavaScript 安全 编译器
TypeScript 与 Jest 测试框架的结合使用,从 TypeScript 的测试需求出发,介绍了 Jest 的特点及其与 TypeScript 结合的优势,详细讲解了基本测试步骤、常见测试场景及异步操作测试方法
本文深入探讨了 TypeScript 与 Jest 测试框架的结合使用,从 TypeScript 的测试需求出发,介绍了 Jest 的特点及其与 TypeScript 结合的优势,详细讲解了基本测试步骤、常见测试场景及异步操作测试方法,并通过实际案例展示了其在项目中的应用效果,旨在提升代码质量和开发效率。
30 6
|
6天前
|
机器学习/深度学习 人工智能 Java
探索软件测试中的自动化框架选择与优化策略####
本文深入探讨了在软件测试领域,面对众多自动化测试框架时,如何根据项目特性、团队技能及长远规划做出最佳选择,并进一步阐述了优化这些框架以提升测试效率与质量的策略。通过对比分析主流自动化测试框架的优劣,结合具体案例,本文旨在为测试团队提供一套实用的框架选型与优化指南。 ####
|
6天前
|
敏捷开发 前端开发 Java
软件测试中的自动化测试框架选择与实践
在当今软件开发生命周期中,自动化测试已成为提升软件质量和开发效率的关键手段。本文旨在探讨自动化测试框架的选择标准及其在实际项目中的应用实践。通过对主流自动化测试框架的分析比较,结合具体案例,本文将阐述如何根据项目需求和团队特点选择合适的自动化测试工具,并分享实施过程中的经验教训。
15 1
|
21天前
|
测试技术 API Android开发
探索软件测试中的自动化框架选择与实践####
本文深入探讨了软件测试领域内,面对众多自动化测试框架时,如何依据项目特性和团队需求做出明智选择,并分享了实践中的有效策略与技巧。不同于传统摘要的概述方式,本文将直接以一段实践指南的形式,简述在选择自动化测试框架时应考虑的核心要素及推荐路径,旨在为读者提供即时可用的参考。 ####