pytest web自动化 从百草园到三味书屋....
pytest web自动化从百草园到三味书屋...
- 开发环境:
- pytest简单认识:
- pytest的默认规则
- 输出详细信息 [-s]
- 显示具体测试用例信息[-v]
- 简化测试用例信息[-q]
- 执行特定测试用例[-k]
- 执行到失败的测试用例就终止[-x]
- 执行某个特定用例
- 测试用例失败%d个就结束[--maxfail=2]
- 打标记[slow]
- pytest最原始的测试报告[--junit-xml=./report/xxx.xml]
- 单独执行某个用例
- 错误用例单独执行%d次[--reruns=2]
- 错误用例单独执行%d次,每次间隔%d秒['--reruns=2','--reruns-delay=3']
- 函数中的 前置函数/后置函数 and 前置module/后置module
- pytest类中的操作
- 类中的前置函数/后置函数,and 前置module/后置module
- pytest.fixture
- skip与skipIf
- parametrize参数化
- 全局配置[conftest.py]
- 扩展:修改默认值
- allure
- 常见的allure装饰器
- epic / feature 如何配合使用
- allure.title
- 其他常用操作
- 清空之前生成的jsonData数据['--clean-alluredir']
- 只执行某个用例级别的测试用例['--allure-severities', 'blocker']
- 开启本地服务,局域网内共享!
- 猜你喜欢:
底部会给出完整代码!
开发环境:
- pytest 6.2.5
- python 2.7.16
- allure 2.14.0
- PyCharm 2021.2.3
- system mac
猜你喜欢:
pytest 接口自动化从百草园到三味书屋…
废话不多说,直接上干货!!
pytest简单认识:
pytest的默认规则
定义pytest时,包名,类名,默认必须以test开头.
先来看一个简单的例子!
执行结果为:
test_11.py ... [ 33%]
test_12.py ... [ 66%]
test_13.py ... [100%]
可以看出,默认执行是显示的进度
输出详细信息 [-s]
# 用于关闭捕捉信息, 从而输出打印信息
pytest.main(['-s'])
需要注意的是:
- 执行成功用 . 表示
- 执行失败用 F 表示
如果觉得这种方式不明显,可以采用:
显示具体测试用例信息[-v]
#T ODO -s 用于关闭捕捉信息, 从而输出打印信息
# TODO -v 用于显示具体的信息
pytest.main(['-s', '-v'])
简化测试用例信息[-q]
# TODO -q 简化输出信息
pytest.main(['-s', '-q'])
执行特定测试用例[-k]
# TODO -k 运行某个包含特定字符串的测试用例
pytest.main(['-s', '-v', '-k', 'b'])
test_13.py::test_function_b ======test_function !!!!!!!!b!!!!!!!!
PASSED
执行到失败的测试用例就终止[-x]
# TODO -x 只要执行到失败的测试用例就终止测试
pytest.main(['-x'])
执行某个特定用例
场景: test_demo1要执行test_demo2某个测试用例
现在是执行不到的…
# TODO 只执行某个特定用例
pytest.main(['-s', '.', '../test_demo2/test_21.py::test_function_01'])
还有一种简单粗暴的写法:用来执行所有的测试用例
# TODO 执行所有的测试用例
pytest.main(['-s', '..'])
测试用例失败%d个就结束[–maxfail=2]
# TODO 测试用例 失败2个就退出
pytest.main(['--maxfail=2'])
打标记[slow]
# TODO 打标记,只执行标记slow的测试用例
pytest.main(['-m', 'slow'])
注意这里的slow是随便写的,也可以写成其他的,例如这样:
pytest.main(['-m', 'abc'])
pytest最原始的测试报告[–junit-xml=./report/xxx.xml]
# TODO 生成最原始的测试报告
pytest.main(['--junit-xml=./report/最原始的测试报告.xml'])
单独执行某个用例
# TODO 单独执行某个用例
pytest.main(['-s', 'test_11.py'])
错误用例单独执行%d次[–reruns=2]
# TODO 失败用例执行2次
pytest.main(['-s', '--reruns=2', 'test_11.py'])
错误用例单独执行%d次,每次间隔%d秒[’–reruns=2’,’–reruns-delay=3’]
# TODO 失败用例执行2次 每次等待3秒
pytest.main(['-s', '--reruns=2', '--reruns-delay=3', 'test_11.py'])
函数中的 前置函数/后置函数 and 前置module/后置module
# TODO 测试用例最开始前执行
def setup_module():print("{}setup_module{}".format("*" * 20, "*" * 20, ))# TODO 测试用例结束时执行
def teardown_module():print("{}teardown_module{}".format("*" * 20, "*" * 20, ))# TODO 每个测试用例函数开始前执行
def setup_function():print("{}setup_function{}".format("-" * 20, "-" * 20, ))# TODO 每个测试用例结束后执行
def teardown_function():print("{}teardown_function{}".format("-" * 20, "-" * 20, ))# TODO 每个测试用例函数开始前执行 在setup_function() 之后执行
def setup():print("{}setup{}".format("+" * 20, "+" * 20, ))# TODO 每个测试用例结束后执行 在 teardown_function() 之前执行
def teardown():print("{}teardown{}".format("+" * 20, "+" * 20, ))def test_0():print("test0")def test_1():print("test1")def test_2():print("test2")def test_3():print("test3")
运行结果为:
test_14.py ********************setup_module********************
--------------------setup_function--------------------
++++++++++++++++++++setup++++++++++++++++++++
test0
.++++++++++++++++++++teardown++++++++++++++++++++
--------------------teardown_function--------------------
--------------------setup_function--------------------
++++++++++++++++++++setup++++++++++++++++++++
test1
.++++++++++++++++++++teardown++++++++++++++++++++
--------------------teardown_function--------------------
--------------------setup_function--------------------
++++++++++++++++++++setup++++++++++++++++++++
test2
.++++++++++++++++++++teardown++++++++++++++++++++
--------------------teardown_function--------------------
--------------------setup_function--------------------
++++++++++++++++++++setup++++++++++++++++++++
test3
.++++++++++++++++++++teardown++++++++++++++++++++
--------------------teardown_function--------------------
********************teardown_module********************
这里都比较无脑,都是一些常规操作…细细品味一下就懂了!!
小结:
pytest | 说明 |
---|---|
-s | 输出详细信息 |
-v | 显示具体测试用例 |
-q | 简化测试用例输出 |
-x | 执行到失败的测试用例就结束 |
-k | 执行特定的测试用例 |
-maxfail=2 | 执行2条测试用例失败就结束 |
‘-m’ ‘slow’ | 打标记 |
–junit-xml=./report/xxx.xml | 最原始的测试报告 |
–reruns=2 | 错误用例单独执行2次 |
‘–reruns=2’, ‘–reruns-delay=3’ | 错误用例单独执行2次,每次间隔3秒 |
pytest类中的操作
默认操作也是一样的
注意点:
- 类名默认以Test开头
- 方法名默认以test开头
这里说是默认以test开头,就证明这里可以修改,不要着急,一点点看,后面会介绍!
类中的前置函数/后置函数,and 前置module/后置module
测试代码:
class TestDemo31:# TODO 测试用例最开始前执行@staticmethoddef setup_class():print("{}setup_class{}".format("*" * 20, "*" * 20, ))# TODO 测试用例结束时执行@staticmethoddef teardown_class():print("{}teardown_module{}".format("*" * 20, "*" * 20, ))# TODO 每个测试用例函数开始前执行@staticmethoddef setup_method():print("{}setup_method{}".format("-" * 20, "-" * 20, ))# TODO 每个测试用例结束后执行@staticmethoddef teardown_method():print("{}teardown_method{}".format("-" * 20, "-" * 20, ))# TODO 每个测试用例函数开始前执行 在setup_function(self) 之后执行@staticmethoddef setup():print("{}setup{}".format("+" * 20, "+" * 20, ))# TODO 每个测试用例结束后执行 在 teardown_function(self) 之前执行@staticmethoddef teardown():print("{}teardown{}".format("+" * 20, "+" * 20, ))def test_01(self):print("测试数据1")def test_02(self):print("测试数据2")def test_03(self):print("测试数据3")
使用:
import pytestif __name__ == '__main__':pytest.main(['-s', '-q', 'test_31.py'])
测试结果:
********************setup_class********************
--------------------setup_method--------------------
++++++++++++++++++++setup++++++++++++++++++++
测试数据1
.++++++++++++++++++++teardown++++++++++++++++++++
--------------------teardown_method--------------------
--------------------setup_method--------------------
++++++++++++++++++++setup++++++++++++++++++++
测试数据2
.++++++++++++++++++++teardown++++++++++++++++++++
--------------------teardown_method--------------------
--------------------setup_method--------------------
++++++++++++++++++++setup++++++++++++++++++++
测试数据3
.++++++++++++++++++++teardown++++++++++++++++++++
--------------------teardown_method--------------------
********************teardown_module********************
这里和函数的前置后置类似,就不多解释了…
pytest.fixture
先来看使用:
这里需要注意的就是第一个参数scope
,他有几种类型:
- function 函数级 每一个函数或方法都会调用
- class 类级别 每个测试类只运行一次
- module 模块级 每一个.py文件调用一次
- session 会话级 每次会话只需要运行一次,会话内所有方法及类,模块都共享这个方法
可以参考这一篇,详细介绍了fixture的几种用法.
skip与skipIf
概念:用@pytest.mark.skip
标记的测试用例不执行.
parametrize参数化
概念: 测试用例反复执行.
直接看功能:
写法不固定,例如:
这里需要注意的就是我颜色相同的地方一定要对应上.
全局配置[conftest.py]
什么是全局配置: 就是pytest会优先扫描这个文件,在这里定义的内容可以整个项目都能用,一般配置在根目录.
需要注意的是名字不能随便改:只能是 conftest.py
扩展:修改默认值
先看看现在的目录结构
之前的认知:
如果在根目录执行 pytest.main()
的话,会执行到到所有满足条件的测试用例,
例如test_demo4/test_41.py
or test_demo4/test_42.py
无论如何test_demo4/a
目录下的文件一定不会执行,因为他不满足 包名以test
开头的原则
只需要在根目录下创建 pytest.ini
文件,指定要执行的目录即可!
这里需要注意的是 pytest.ini
不能随便起名字,必须保证这个名字,要不然pytest就扫描不到了.
pytest.ini
的作用域:当前目录以及子目录
再来看看定义其他规则:
pytest.ini
代码
[pytest]
# 指定要测试的目录
testpaths = test_demo4/a# 指定特定【文件】规则
python_files = auto*.py test_*.py# 指定特定【类】规则
python_classes = Auto* PY_TEST_* Test*# 指定特定【测试用例】规则
python_functions = auto* test_*
allure
什么是allure?
allure是用来生成测试报告的一个非常优雅的工具
他这么优雅那么就必须安装环境
小插曲:allure是基于json与装饰器来实现测试报告的,所以在运行期间会生成很多json文件,并且通过装饰器来使用!
mac 安装环境的话只需要2步,win的同学自行百度[抱拳]
- 第一步:brew install allure
- 第二步:pip install allure-pytest
如何验证安装是否成功:
allure --version # 查看 allure版本
还是老套路,最简单的使用!
可以通过右键的这种方式直接打开
index.html打开的效果:
常见的allure装饰器
等级:
- epic 最大的模块 [1级]
- feature 特点 [2级]
- story 场景 [3级]
- title 用户标题
- testcase 用例 url
- issue bug地址
- step 用例步骤
- severity() 用例等级
epic / feature 如何配合使用
这段代码很多,但是很简单,一定要细品一下哦!!
feature 配合 story 使用也是类似:
直接看效果图就好!
allure.title
allure.title 只是修改这个标题
更高级的用法为:
这里不仅限于修改title,其他的都能够修改:
例如:
其他常用操作
- @allure.severity(“blocker”)
- @allure.feature(“河南省”)
- @allure.story(“郑州市”)
- @allure.testcase(“http://www.kaifa.baidu.com”) # 正确的路径
- @allure.issue(“http://www.baidu.com”) # 错误的路径
用例等级(allure.severity
):
- blocker 阻塞缺陷 【功能为实现】
- critical 严重阻塞 【功能有缺陷】
- normal 一般缺陷 【格式错误】
- minor 次要缺陷 【界面与ui不符】
- trivial 轻微缺陷 【不规范】
这里有一个极小的细节可以注意一下:
清空之前生成的jsonData数据[’–clean-alluredir’]
问题所在:
可以看到,有很多的json文件,证明他不会覆盖之前的json数据,这里可以通过一行代码来实现!
只执行某个用例级别的测试用例[’–allure-severities’, ‘blocker’]
记得之前会有很多,例如山西,山东之类的,因为这里设置了河南郑州为blocker级别,所以测试用例只显示这个!
开启本地服务,局域网内共享!
什么是本地服务?
就是让别人能够看到你的测试报告!
os.system('allure serve {}'.format('allure_json_data'))
运行后会生成一个地址,mac是通过java来开启本地服务的!
这里的地址还不正确,你应该给到你真正的ip地址,
mac :终端/控制台输入ifconfig
win:cmd 输入ipconfig
获取到这个号之后最终链接为: http://192.168.3.128:54739/
完整代码
写了一天了,如果这篇文章帮助到你,请点一下免费的赞,谢谢,
如有疑问或者缺什么东西,请在评论区留言,看到第一时间就加上了!
原创不易,您的点赞就是对我最大的支持!
猜你喜欢:
pytest 接口自动化从百草园到三味书屋…
pytest web自动化 从百草园到三味书屋....相关推荐
- android 图解 PhotoView,从‘百草园’到‘三味书屋’!
PhotoView, android 图解 PhotoView 从0到1,从
- c语言谭浩强百草园有卖吗,鲁迅为何强调百草园“卖给朱文公的子孙了”?原来有一桩辛酸往事...
原标题:鲁迅为何强调百草园"卖给朱文公的子孙了"?原来有一桩辛酸往事 教学<从百草园到三味书屋>时,突然有学生问: "老师,课文第一段介绍百草园,直接说卖给一 ...
- 自动化用例设计原则+web自动化框架
自动化用例设计原则 web自动化框架 PO模式就是页面对象和测试用例的分离. PageObjects放页面对象,封装元素定位和元素操作(也可以单独把元素定位放到PageLocators层) basep ...
- ide循环执行用例 selenium_Selenium Web自动化Page Object设计模式——循环执行测试用例...
继续优化上一篇博客的设计 Selenium Web自动化Page Object设计模式--driver初始化 https://www.cnblogs.com/Ravenna/p/14172411.ht ...
- Day32 Web自动化进阶
系列文章目录 Day01 软件测试基础总结 Day02 测试用例知识点总结(上) Day03 测试用例知识点总结(下) Day04 禅道-从安装到卸载 Day05 MySql的基础使用 Day06 M ...
- pytest接口测试自动化框架
目录 pytest简介及安装 pytest的使用规则 pytest运行方式 主函数方式 命令行方式 跳过.标记及预期失败特殊场景处理 pytest前后置.夹具 pytest高级用法fixture py ...
- python+requests+pytest 接口自动化框架(四)
目录 一.requests库简介 二.requests库常用方法 三.request()返回的response对象 四.实战案例 post(url, data=None, json=None, **k ...
- python+requests+pytest 接口自动化框架(一)
目录 一.Pytest详解以及常用的插件安装 二.Pytest默认的测试用例的规则 三.Pytest用例运行方式以及参数 1.命令行模式运行 命令:pytes 2.主函数模式运行 3.基于pytest ...
- 提升之路--从0开始学web自动化(7)--ui自动化框架搭建PO模式
ui自动化测试在整个测试过程中占据的地位 在一个项目的测试中手工测试(60%)/自动化测试(40%),不同公司的定义不同.总体是手工占大部分 而自动化测试中,接口自动化占据70% ui自动化测试优先实 ...
- 关键字驱动实现web自动化
接口自动化测试步骤几乎是一样的,可以用excel写测试用例,通过ddt实现数据驱动,而web自动化不符合测试步骤一致的要求,用ddt实现数据驱动并不理想,这时候可以使用关键字驱动实现web自动化. 一 ...
最新文章
- Docker-Compose搭建单体SkyWalking 6.2
- python操作系统-python获取操作系统平台、版本及架构
- Thinkpad系统重装终极版
- VALID SAME
- C++中的sort函数对二维数组排序是按照什么准则?
- ropgadgets与ret2syscall技术原理
- pandas之Series
- 自然语言3——官网介绍
- vim配置Nerdtree
- mysql解压rpm文件在哪_[mysql] mysql 源码安装解压 rpm 包命令
- 深度优先搜索(DFS)与广度优先搜索(BFS) -- 总结
- Atitit 提升开发效率的方法 提升语言级别 目录 1. 提升语言级别到4gl	1 1.1. 语言的代际关系 sql 》script 》java	1 1.2. 使用4gl dsl语言与api	1
- net framework安装有什么影响_踢脚暖比地暖安装简单,升温快,为什么没有普及?这2点影响很大...
- 台式计算机提示内存不足怎么办,一招解决电脑提示内存不足-电脑内存不足怎么办...
- 【GNSS】GREAT多频多系统GREAT-UPD开源代码-第一章 介绍
- mysql update无效_Mysql update记录无效如何解决
- DirectX11 使用Cube Mapping 立方体环境贴图实现天空、物体反射效果
- 如何将GMS功能移植到Android系统中
- nginx的DR模式
- FFmpeg屏幕录制