当pytest遇上poium会擦出什么火花

首先,创建一个test_sample/test_demo.py 文件,写入下面三行代码。

def test_bing(page):
    page.get("https://www.bing.com")
    assert page.get_title == "必应"

不要问题 page 从哪里来,打开终端进入test_sample/目录,执行pytest 命令。

❯ pytest
================================================= test session starts =================================================
platform win32 -- Python 3.8.6, pytest-6.2.4, py-1.10.0, pluggy-0.13.1
benchmark: 3.2.3 (defaults: timer=time.perf_counter disable_gc=False min_rounds=5 min_time=0.000005 max_time=1.0 calibration_precision=10 warmup=False warmup_iterations=100000)
rootdir: D:\github\test-circle\seldom\test_sample
plugins: allure-pytest-2.8.40, base-url-1.4.2, benchmark-3.2.3, html-3.1.1, metadata-1.11.0, rerunfailures-9.1.1, seldom-0.0.3
collected 1 item

test_case.py
DevTools listening on ws://127.0.0.1:63137/devtools/browser/32d7e69d-69b5-4e0c-b0df-0e1d1d37af46
.                                                                                                   [100%]

================================================== 1 passed in 4.75s ==================================================

是不是觉得做UI自动化超级简单,并好奇是怎么做到的,别急,我画个图帮你理解。

说明

  • poium: poium集成了selnium/appium并提供一套UI自动化测试的API。
  • pytest: 强大的自动化测试框架,背后有一个丰富的生态,使用pytest就可以使用他背后的各种插件。
  • seldom-pytest: 这是我开发的粘合剂,将poium和 pytest,以及pytest背后的插件粘合到一起。
  • UI 自动化项目: 站在seldom-pytest的基础上编写你的UI自动化项目。

seldom-pytest设计思想

如上图所示,在seldom-pytest中,核心只需要编写两类文件。

  • conftest.py: 这是pytest的配置文件,功能非常强大,你可以在里面写各种钩子函数。如前面的例子,page就是一个钩子函数。

  • test_xxx.py: 这是你的用例文件,你只需要引用各种钩子函数来完成用例即可。

seldom-pytest 实战

其实,seldom-pytest 并没有做什么事情,几乎也没有提供API,更多是的提倡一个设计思想。我们来举个例子说明哈。

  1. 创建一个test_sample/conftest.py 文件。
import pytest
from poium import Page, Element


class BaiduPage(Page):
    search_input = Element(id_="kw", describe="搜索框")
    search_button = Element(id_="su", describe="搜索按钮")
    settings = Element(css="#s-usersetting-top", describe="设置")
    search_setting = Element(css="#s-user-setting-menu > div > a.setpref", describe="搜索设置")
    save_setting = Element(link_text="保存设置", describe="保存设置")


@pytest.fixture(scope="module", autouse=True)
def baidu_page(page):
    return BaiduPage(page)

  • BaiduPage 类主要通过poium封装元素定位。

  • baidu_page 将BaiduPage类封装为一个钩子函数。

  1. 修改一个test_sample/test_demo.py 文件,代码如下:

def test_baidu_search(baidu_page, base_url):
    """
    搜索
    """
    baidu_page.get(base_url)
    baidu_page.search_input.send_keys("pytest")
    baidu_page.search_button.click()
    baidu_page.sleep(2)
    assert baidu_page.get_title == "pytest_百度搜索"

test_demo.py文件不需要导入任何模块。可以直接调用钩子函数baidu_page 、base_url 实现自动化测试用例。

  1. 如何运行用例,交给pytest 即可。
# 运行测试 (默认chrome)
> pytest

# 指定不同的浏览器 (chrome/gc, firefox/ff, safari)
> pytest --browser chrome
> pytest --browser firefox
> pytest --browser safari

# 指定base-url 
> pytest --base-url https://www.baidu.com

# 生成测试报告
> pytest --html ./report.html

当然,你也可以创建一个run.py文件来使用pytest。

import pytest

pytest.main([
    "--browser=firefox",
    "--html=./report.html",
    "--base-url=https://www.baidu.com"
])

只需要运行该文件即可。

> python run.py

关于conftest文件

  1. conftest.py 用来实现钩子函数的,我把xxPage类定义在里面有点奇怪,当然,你也可以单独封装一层,只在conftest.py实现xx_page钩子函数即可。

  2. 一个项目中每个目录下都可以有一个conftest.py文件。每个conftest.py文件作用于当前目录以及子目录。我们可以充分利用这个特点。

test_sample/
├── test_aa/
│   ├── conftest.py
│   ├── test_aa.py
├── test_bb/
│   ├── conftest.py
│   └── test_bb.py
└── test_cc/
│   ├── conftest.py
│   └── test_cc.py
├── conftest.py
├── pytest.ini
└── run.py

如果定义的xxPage类会被所有测试用例用到,那么就放到根目录;如果只会被某个测试用例用到,那么就放到和他平级的目录。

seldom-pytest地址:

https://github.com/SeldomQA/seldom-pytest

项目中有例子,仅供参考,欢迎提出宝贵建议。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/117621.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL---搜索引擎

MySQL的存储引擎是什么 MySQL当中数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制,索引技巧 锁定水平,以及最终提供的不同的功能和能力,这些就是我们说的存储引擎。 MySQL存储引擎的功能 1.MySQL将数据存储在文…

软件测试面试最经典的5个问题

软件测试面试灵魂五问! 请做一下自我介绍?你为什么从上家公司离职?为什么转行做测试? 你对测试行业的认识?你的期望薪资是多少?最后,你要问我什么? 一、请做一下自我介绍 简历上有的可以一两…

C++ Concurrency in Action 2nd Edition

《C Concurrency in Action - SECOND EDITION》的中文翻译-面圈网 (mianshigee.com) C/C 学习教程源码-C/C源码推荐-面试哥 (mianshigee.com) 作者正是为C11标准引入线程库的C标准委员会成员本人!并且本书作者还编写了众多构成C标准的多线程和并发相关的提案、制定…

Apache Flink 1.12.0 on Yarn(3.1.1) 所遇到的問題

Apache Flink 1.12.0 on Yarn(3.1.1) 所遇到的問題 新搭建的FLINK集群出现的问题汇总 1.新搭建的Flink集群和Hadoop集群无法正常启动Flink任务 查看这个提交任务的日志无法发现有用的错误信息。 进一步查看yarn日志: 发现只有JobManager的错误日志出现了如下的…

试利用栈的基本操作写出先序遍历二叉树的非递归形式的算法

试利用栈的基本操作写出先序遍历二叉树的非递归形式的算法 代码思路: 要用栈解决先序遍历,我们首先要知道栈的性质和二叉树先序遍历的规则 栈最基本的就是先进后出 而二叉树先序遍历就是“根左右” 利用这两个性质,我们可以先将根结点入队…

【数智化案例展】领克汽车——火山引擎助力领克汽车数字化营销实践

‍ 火山引擎案例 本项目案例由火山引擎投递并参与数据猿与上海大数据联盟联合推出的《2023中国数智化转型升级创新服务企业》榜单/奖项”评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 领克汽车是由吉利汽车、沃尔沃汽车和吉利控股集团合资成立的全球新高端品牌。据吉…

SpringBoot + Vue2项目打包部署到服务器后,使用Nginx配置SSL证书,配置访问HTTP协议转HTTPS协议

配置nginx.conf文件,这个文件一般在/etc/nginx/...中,由于每个人的体质不一样,也有可能在别的路径里,自己找找... # 配置工作进程的最大连接数 events {worker_connections 1024; }# 配置HTTP服务 http {# 导入mime.types配置文件…

3D人像手办定制业务再掀热潮,这一次有怎样的革新?(方法篇)

最近,3D真人手办热潮再起,最出圈的一次当属亚运会的3D打印元宇宙体验舱里面各国运动员带火的真人手办定制项目。作为3D技术推广者,博雅仔也在后台接受了很多朋友的询问—— ◆ 技术已经成熟了吗? ◆ 个人定做3D真人手办市场价格…

【CSS】div 盒子居中的常用方法

<body><div class"main"><div class"box"></div></div> </body>绝对定位加 margin: auto; &#xff1a; <style>* {padding: 0;margin: 0;}.main {width: 400px;height: 400px;border: 2px solid #000;positio…

海康Visionmaster-全局触发:使用全局触发功能执行流 程的方法

我们这里以 TCP 通讯为例&#xff0c;视觉作为 TCP 服务端&#xff0c;与视觉交互的第三方设备作为 TCP 客户端。当 TCP 客户端连接上视觉服务端后&#xff0c;客户端发送字符串 T1,视觉执行流程 1&#xff1b; 客户端发送字符串 T2&#xff0c;视觉执行流程 2。 这样的需求我…

apachesolr启动带调试

这里solr.cmd报错&#xff0c;报错原因是java版本问题&#xff0c;后面发现这是因为多个java版本导致读取java_home失败&#xff0c; 那么我们修改solr.cmd中的JAVA_HOME为SOLR_JAVA_HOME IF DEFINED SOLR_JAVA_HOME set "JAVA_HOME%SOLR_JAVA_HOME%"环境变量将SOLR…

linux傻瓜式安装Java环境及中间件

linux配置Java环境及中间件 1.傻瓜式安装Java1.下载2.追加3.刷新测试 2.傻瓜式安装docker1.docker卸载2.docker安装 3.Docker傻瓜式安装Redis1.傻瓜式安装安装并配置 4.Docker傻瓜式安装RabbitMQ5.Docker傻瓜式安装MySql1.拉取2.配置 6.傻瓜式安装Nacos1.官网下载nacos2.SQL文件…

皮肤病辅助诊断软件,基于Android编写

1.系统介绍 编写的皮肤病辅助诊断软件&#xff0c;包括皮肤病识别、皮肤病区域分割、皮肤病信息介绍、识别历史记录查询、简单图像处理操作以及本机信息查询等功能 2.登录界面 运行之后首先显示登录界面 3.注册界面 注册一个账号 4.主界面 输入用户名密码点击登录按钮…

NI-9236 国产化10 kS/s/ch,350 Ω四分之一桥应变计,8通道C系列应变/桥输入模块

10 kS/s/ch&#xff0c;350 Ω四分之一桥应变计&#xff0c;8通道C系列应变/桥输入模块 NI‑9236可同步测量所有通道的动态应变&#xff0c;从而实现了高速同步测量。 该功能对于需要在特定时刻对多个通道进行比较的应用&#xff08;例如冲击测试&#xff09;非常重要。\n\nNI…

Python基础入门例程42-NP42 公式计算器(运算符)

最近的博文&#xff1a; Python基础入门例程41-NP41 二进制位运算&#xff08;运算符&#xff09;-CSDN博客 Python基础入门例程40-NP40 俱乐部的成员&#xff08;运算符&#xff09;-CSDN博客 Python基础入门例程39-NP39 字符串之间的比较&#xff08;运算符&#xff09;-C…

mysql、clickhouse时间日期加法

mysql 在’2023-10-27 23:59:59’上增加5秒&#xff1a; SELECT DATE_ADD(2023-10-27 23:59:59, INTERVAL 5 second);clickhouse SELECT date_add(SECOND, 3, toDate(2018-01-01 00:00:00));clickhouse时间按秒、分、时、日、月、年作差 按秒&#xff1a; SELECT dateDiff…

「Verilog学习笔记」位拆分与运算

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 1、寄存器的位是可以分开单独运算的&#xff0c;并不是一个输入就一定是一个数据&#xff0c;在很多情况下&#xff0c;一个输入既包括数据又包括地址等其他有效信息 2、需…

Python基础入门例程43-NP43 判断布尔值(条件语句)

最近的博文&#xff1a; Python基础入门例程42-NP42 公式计算器&#xff08;运算符&#xff09;-CSDN博客 Python基础入门例程41-NP41 二进制位运算&#xff08;运算符&#xff09;-CSDN博客 Python基础入门例程40-NP40 俱乐部的成员&#xff08;运算符&#xff09;-CSDN博客…

ChinaSoft 论坛巡礼 | 系统与网络安全论坛

2023年CCF中国软件大会&#xff08;CCF ChinaSoft 2023&#xff09;由CCF主办&#xff0c;CCF系统软件专委会、形式化方法专委会、软件工程专委会以及复旦大学联合承办&#xff0c;将于2023年12月1-3日在上海国际会议中心举行。 本次大会主题是“智能化软件创新推动数字经济与社…

基于STM32F412RET6的智能桶硬件设计

一、智能桶功能需求&#xff1a; 智能桶是一直采用Cortex-M4 嵌入式平台&#xff0c;搭载NB-IotTO通讯模组、智能称重采集、智能门锁监控以及温度监测等装置。主要功能如下&#xff1a; ▲ 具有GPS定位功能&#xff0c;可以通过后台APP实时定位智能桶的位置。 ▲ 具有温度监测功…