pytest对代码进行封装
pytest可以结合selenium、requests、appium实现web、接口、app自动化结合allure生成非常美观的报告和结合jenkins实现持续集成很多强大插件:pytest 本身pytest-html 生成html报告pytest-xdist 多线程执行pytest-ordering 控制用例的执行顺序pytest-rerunfailures 失败用例重跑pytest-base-
目录
requests.request()和sessionrequest()的区别
不管是哪种方式运行测试用例,都会读取pytest.ini配置文件
yaml文件有哪些形式的内容(yaml支持各种不同数据类型)
用例管理框架Pytest
pytest可以结合selenium、requests、appium实现web、接口、app自动化
结合allure生成非常美观的报告和结合jenkins实现持续集成
很多强大插件:
-
pytest 本身
-
pytest-html 生成html报告
-
pytest-xdist 多线程执行
-
pytest-ordering 控制用例的执行顺序
-
pytest-rerunfailures 失败用例重跑
-
pytest-base-url 基础路径
-
allure-pytest 生成测试报告
一般项目会把所需的包用requirements.txt存放在根目录
然后在终端输入:
pip install -r requirements.txt
就可以把所需对应版本号的包都下载进项目了
request请求头的四种传参方式
-
from-datya(既有表单也有文件上传)file
-
x-www-form-unlencoded(纯表单) data
-
raw(接送:application/json)(传json格式的参数) json
-
binary(application/octrent-stream):(二进制文件) data
requests.request()和sessionrequest()的区别
前者每个清华求都是独立的,后者会自动关联所有请求的cookie信息
接口自动化测试框架代码封装
统一请求封装,基本放在commons内)
实际工作中先封装再写测试用例
可以减少代码冗余,比如异常处理和日志监控不用在每个方法里写,在commons里面写就可以了
pytest的作用
-
发现用例
-
模块名字必须以test开通或者test结尾
-
测试类必须以Test开头
-
测试方法必须以test_开头
-
-
执行用例
-
判断结果
-
生成报告
pytest的使用
把项目跑起来的方法:
-
在终端输入pyest
-
在根目录新建一个python文件叫:run.py
if __name__ == '__main__': pytest.main()
通过配置pytest.ini来改变以及执行用例
不管是哪种方式运行测试用例,都会读取pytest.ini配置文件
[pytest]
#配置参数
#-v代表输出更详细信息
#-s代表条数的信息
#加了-m "smoke"表示只运行冒烟测试的测试用例
#如果想用多个标志词,可以使用or,比如:-m "smoke or user"
addopt = -vs -m "smoke"
#改变用例的查找规则
testpaths = ./testcases#指定查找测试用例的路径
#改变模块的查找规则
#*号代表不同的内容,字母表示确定的文件名
python_files = test_*.py
#改变类的查找规则
python_classes =Test*
#改变函数的查找规则
python_functtions = test_*
#加一个基础路径(测试环境),url是一个网址
base_url:url
#标记,可以写多个标志词
markers =
smoke:冒烟测试
user:用户管理
pytest的前后置fixture(固件、夹具)
用例前置:用例前置的作用就是准备测试用例的前置条件和测试数据,相当于 unittest 中的 setup() 的功能;
用例后置:用例后置的作用就是在测试用例执行完毕之后进行前置条件和测试数据的清理、复原等工作,总之就是你想在测试用例执行完之后干的事都在这里干就行了,没有想干的事情也可以空着,相当于 unittest 中的 teardown() 的功能;
更强大的前后置(前后置指测试用例执行前或之后的一些操作):fixture固件
首先要知道fixture是装饰器:
什么是装饰器:用来装饰函数或者类
@pytest.fixture(scope="作用域",params="参数化",autouse="是否自动执行",ids="参数别名",name=
"装饰器别名")
scope :可以填function、class、module、session,分表代表作用域是函数还是类还是。。。
autiuse:只有True和Fales,表示是否自动执行
params:参数化,只能传一个列表(list里面可以以结构体进行传值,比如字典、列表等),需要用request和yield request.param
ids:参数别名
name:夹具别名
yield
fixture夹具函数搭配yield使用:
yield 之前的是用例前置部分,用例前置条件在此处实现
yield 是 python 中的迭代器,它的作用:
一是将用例前置准备好的测试数据返回给调用方,
二是让 python 跳出这个 fixture 函数,去执行测试用例的代码,在测试用例执行完后再回来继续执行 yield 之后的代码;
yield 之后的是用例后置部分,用例前置条件的拆卸、数据清理在此处实现
例子:
# conftest.py
# step 1. 先导入 pytest
import pytest
from selenium import webdriver
# step 2. 使用 @pytest.fixture() 装饰 fixture;
@pytest.fixture()
# step 3. 定义函数,函数名可以自定义,但是最好要有意义;
def fix_init_chrome():
"""启动/关闭 chrome浏览器"""
# step 4. 实现用例前置
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
driver.maximize_window()
# step 5. 返回数据
yield driver
# step 6. 实现用例后置
driver.close()
使用说明:
step 2 :必须要用 @pytest.fixture() 装饰函数,才会被注册为 pytest 的 fixture;
step 4 :yield 之前的是用例前置部分,用例前置条件在此处实现,例如:初始化chrome,打开百度网页,最大化窗口等;
step 5 :yield 是 python 中的迭代器,它的作用:一是将用例前置准备好的测试数据返回给调用方,二是让 python 跳出这个 fixture 函数,去执行测试用例的代码,在测试用例执行完后再回来继续执行 yield 之后的代码;
step 6 :yield 之后的是用例后置部分,用例前置条件的拆卸、数据清理在此处实现,例如:关闭chrome浏览器,此处执行完毕后整个用例才算执行完毕;
注意:yield 也可以替换为 return,但是 return 之后就视为此函数的代码执行完毕,return 之后就不能在写用例后置部分的代码,所以建议都使用 yield ,就算不需要用例后置也可以空着!
图片说明了读取params里面的值的传值过程
先在params定义要传的数据---->数据传到request(这个单词是固定写法)---->传到yield里面(yield request.params的写法是固定的)--->通过手动执行,在测试用例里面填写夹具函数的函数名进行调用---->然后在测试函数内就可以打印出params的数据
params里面有多少数据就调用测试函数多少次
yaml文件有哪些形式的内容(yaml支持各种不同数据类型)
- map对象(字典dict) 键: 值 :双引号后面记得要带空格
- 数组对象(列表list) 用一组-开头的
例子:
第一种: keys: aaabbb 第一种解析出来是字典
第二种: - name: 张三
- like: 翠花
第二种解析出来的是[{name:"张三"},{like:"翠花"}]
DDT数据驱动测试
@pytest.mark.parametrize("数据驱动的参数名","数据驱动的值")
parametrize传值过程:
caseinfo是参数名,caseinfo里面有["百里","北凡"]这些数据,
测试用例调用caseinfo一次就使用列表里面的一个元素,因为列表有两个元素测试用例就被调用了两次
解决数据驱动遇到的问题
- 如果有接口关联,那么需要在关联的接口调用前通过调用方法覆盖旧的值,来实现更新yaml文件的value值,比如:在yaml中调用随机数方法
- 一个接口对应一个yaml,如果一个接口有很多反例,那么yaml里面会有很多数据
更多推荐
所有评论(0)