当前位置: 首页 > news >正文

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

当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 itemtest_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, Elementclass 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 pytestpytest.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类会被所有测试用例用到,那么就放到根目录;如果只会被某个测试用例用到,那么就放到和他平级的目录。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • linux 入门(七)-ffmpeg使用
  • java SSM科研管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计
  • 【Node.js从基础到高级运用】三、JavaScript基础
  • 洗衣洗鞋店小程序对接水洗唛打印,一键预约,支付无忧
  • MediaFoundation采集
  • Paddle上手实战——NLP经典cls任务“推特文本情感13分类”
  • C++第一弹---C++入门(上)
  • 【力扣 - 找到字符串中所有字母异位词】
  • 嵌入式学习35-网络通信UDP聊天及TCP
  • ROS2从入门到精通0-2:ROS2简介、对比ROS1与详细安装流程
  • rk3568 Android12 增加支持 ntfs 格式
  • 指针的学习4
  • DNS服务
  • MySQL 学习笔记(基础篇 Day3)
  • LVGL在VScode中安装模拟器运行配置笔记教程
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 【前端学习】-粗谈选择器
  • CSS 三角实现
  • css属性的继承、初识值、计算值、当前值、应用值
  • jdbc就是这么简单
  • Just for fun——迅速写完快速排序
  • miaov-React 最佳入门
  • react-native 安卓真机环境搭建
  • Redis的resp协议
  • Spring Cloud Feign的两种使用姿势
  • Windows Containers 大冒险: 容器网络
  • 百度地图API标注+时间轴组件
  • 第十八天-企业应用架构模式-基本模式
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 微信小程序--------语音识别(前端自己也能玩)
  • 在Mac OS X上安装 Ruby运行环境
  • postgresql行列转换函数
  • ​1:1公有云能力整体输出,腾讯云“七剑”下云端
  • # 安徽锐锋科技IDMS系统简介
  • # 数据结构
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (12)Linux 常见的三种进程状态
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (2022 CVPR) Unbiased Teacher v2
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (Forward) Music Player: From UI Proposal to Code
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (转)h264中avc和flv数据的解析
  • (转)关于pipe()的详细解析
  • (转)视频码率,帧率和分辨率的联系与区别
  • (转)树状数组
  • (自适应手机端)响应式服装服饰外贸企业网站模板
  • .net 反编译_.net反编译的相关问题
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)