如何对使用PYQT编写的GUI文件进行单元测试

想要对PYQT编写的GUI文件进行单元测试,我们主要用到QTest

QTest里面包含了一些对窗体的各种控件进行模拟操作的函数,通过QTest对窗体进行操作后,利用程序的一些返回值和状态值进行断言,来判断各部分是否实现了预期的功能。

1.需要导入的模块

与PYQT相关的模块如下

from PyQt5.QtWidgets import QApplication
from PyQt5.QtTest import QTest
from PyQt5.QtCore import Qt

同时需要使用unittest模块的单元测试框架

import unittest

另外需要导入待测试的窗口的py文件,例如

import mainwindow #自己的GUI

2.编写具体的测试

我以一个简单的窗体为例子,窗体如下



左右两个按钮的功能是翻页,具体的实现就是切换中间显示的图片,程序中有一个值来记录当前是第几页,我们就用它来进行判断。

首先在setUp中实例化窗口

def setUp(self):
""" Create GUI"""
self.form = mainwindow.g_window()

编写针对翻页按钮的测试

def test_pushButton_right(self):
"""Test button pushButton_right"""
widget = self.form.pushButton_2 #将要点击的按钮
QTest.mouseClick(widget, Qt.LeftButton) #点击向右翻页按钮
self.assertEqual(2, self.now_page) #判断页面是否为2 QTest.mouseClick(widget, Qt.LeftButton) #点击向右翻页按钮
self.assertEqual(3, self.now_page) #判断页面是否为3 QTest.mouseClick(widget, Qt.LeftButton) #点击向右翻页按钮
self.assertEqual(1, self.now_page) #判断页面是否为1 ,一共有3页,第3页的下一页回到第1页 def test_pushButton_left(self):
"""Test button pushButton_left"""
widget = self.form.pushButton_1
QTest.mouseClick(widget, Qt.LeftButton) #点击向左翻页按钮
self.assertEqual(3, self.now_page) #判断页面是否为3,第1页向左翻页到最后一页 QTest.mouseClick(widget, Qt.LeftButton) #点击向左翻页按钮
self.assertEqual(2, self.now_page) #判断页面是否为2 QTest.mouseClick(widget, Qt.LeftButton) #点击向左翻页按钮
self.assertEqual(1, self.now_page) #判断页面是否为1

然后与编写普通代码的unittest一样完成单元测试框架就可以了。

3.QTest的其他操作

QTest包含了模拟键盘、鼠标的一系列操作的方法

  • 键盘相关
  • keyClick(...) 键盘按一个键
  • keyClicks(...) 键盘按多个键
  • keyEvent(...) 键盘事件
  • keyPress(...) 键盘按下
  • keyRelease(...) 键盘释放

    +鼠标相关
  • mouseClick(...) 鼠标单击
  • mouseDClick(...) 鼠标双击
  • mouseMove(...) 鼠标移动
  • mousePress(...) 鼠标按下
  • mouseRelease(...) 鼠标释放

具体参数可以在python中查看help(QTest)

【Python】[技术博客] 如何对使用PYQT编写的GUI文件进行单元测试的更多相关文章

  1. 原创翻译-值得关注的10个python语言博客

    原文链接 原文链接的网页感觉网络不是很好,不容易上.我在这里就给大家做个翻译吧. 大家好,还记得我当时学习python的时候,我一直努力地寻找关于python的博客,但我发现它们的数量很少.这也是我建 ...

  2. IT技术博客收藏

    1. coolshell.cn 特点: 每篇都是精品 2. 云风 特点: 3. 阮一峰的博客 特点:高精深 3. offbye涛声依旧-全端技术博客 特点: android的开发技术比较多,非常值得一 ...

  3. [转]有哪些值得关注的技术博客(Java篇)

    有哪些值得关注的技术博客(Java篇)   大部分程序员在自学的道路上不知道走了多少坑,这个视频那个网站搞得自己晕头转向.对我个人来说我平常在学习的过程中喜欢看一些教程式的博客.这些博客的特点: 1. ...

  4. 值得关注的10个python语言博客(转)

    大家好,还记得我当时学习python的时候,我一直努力地寻找关于python的博客,但我发现它们的数量很少.这也是我建立这个博客的原因,向大家分享我自己学到的新知识.今天我向大家推荐10个值得我们关注 ...

  5. 一文搞定scrapy爬取众多知名技术博客文章保存到本地数据库,包含:cnblog、csdn、51cto、itpub、jobbole、oschina等

    本文旨在通过爬取一系列博客网站技术文章的实践,介绍一下scrapy这个python语言中强大的整站爬虫框架的使用.各位童鞋可不要用来干坏事哦,这些技术博客平台也是为了让我们大家更方便的交流.学习.提高 ...

  6. 值得关注的10个python语言博客

    大家好,还记得我当时学习python的时候,我一直努力地寻找关于python的博客,但我发现它们的数量很少.这也是我建立这个博客的原因,向大家分享我自己学到的新知识.今天我向大家推荐10个值得我们关注 ...

  7. Atitit.如何文章写好 论文 文章 如何写好论文 技术博客 v4

    Atitit.如何文章写好 论文  文章  如何写好论文 技术博客 1. 原则 2 1.1. 有深度, 有广度 2 1.2. 业务通用性有通用性 尽可能向上抽象一俩层..业务通用性与语言通用性. 2 ...

  8. Atitit.如何文章写好 论文 文章 如何写好论文 技术博客

    Atitit.如何文章写好 论文  文章  如何写好论文 技术博客 1. 原则 1 1.1. 有深度, 有广度 1 1.2. 业务通用性有通用性 尽可能向上抽象一俩层..业务通用性与语言通用性. 2 ...

  9. 【技术博客】Django中文件下载的实现

    开发组在开发过程中,都不可避免地遇到了一些困难或问题,但都最终想出办法克服了.我们认为这样的经验是有必要记录下来的,因此就有了[技术博客]. Django中文件下载的实现 1.背景 在VisualPy ...

随机推荐

  1. kaishi

    https://zjc.wtc.edu.cn/zs/2019/0623/c2937a54869/page.htm https://zjc.wtc.edu.cn/zs/2019/0614/c593a54 ...

  2. IntelliJ IDEA重命名变量的问题

    当我尝试使用Shift+ F6或简单地使用Refactor => Rename重命名变量时,有时intellij不仅重命名我想要的那个,而且还重命名具有相同名称的所有其他变量(在其他文件中)以及 ...

  3. python中生成JWK(json web token)

    #需要安装pyjwt import jwt import time # 使用 sanic 作为restful api 框架 def create_token(request): grant_type ...

  4. Could not get lock /var/lib/dpkg/lock-frontend解决

    在安装软件包时如果出现Could not get lock /var/lib/dpkg/lock-frontend,说明之前使用apt时出现异常,没有正常关闭,还在运行. lgj@lgj-Lenovo ...

  5. Flask+SQLAlchemy+graphene+docker示例

    搭建一个利用docker启动服务的Flask的小demo 定义数据库 # -*- coding: utf-8 -*- from sqlalchemy import * from sqlalchemy. ...

  6. linux 使用ssh-keygen生成ssh公钥和私钥

    linux一般为在自己的家目录下建立 .ssh 文件夹 中生成密钥 /home/username/.ssh 生成的命令如下: ssh-keygen -t rsa -C "yourname@y ...

  7. virt-install创建虚拟机并制作成模板

    一.使用virt-install创建新的虚拟机 virt--template --ram --vcpu= --virt-type kvm --cdrom=/Data/kvm/iso/CentOS-.i ...

  8. c语言的#和##的用法

    #include <stdio.h> #define ADD(A,B) printf(#A " + " #B " = %d\n",((A)+(B)) ...

  9. Virtual DOM的渲染机制--猜测

    一个node的状态发生变化: 会对当前结点和子节点的数据全部进行更新: 然后进行dom比较: 比较完毕后一次性提交: 相对于以前的渲染方式: 每一个node的数据发生变化,都会产生一次渲染提交: 以上 ...

  10. react语法注意事项

    组件: var HelloMessage = React.createClass({ render: function() { return <h1>Hello {this.props.n ...