pytest unittest测试框架
1、报告
2、用例收集
3、执行用例
4、断言
5、数据驱动
6、重新运行失败的用例
7、筛选
8、前置后置的处理
9、加载测试用例
pytest目录
1、pytest介绍
2、pytest之mark功能
3、pytest之命令运行用例
4、pytest之fixture功能
pytest之fixture参数化-多运行、pytest层级覆盖,测试用例与其同级或者在其子目录
5、pytest之参数化
6、pytest之重运行
7、pytest之html测试报告
8、pytest之allure测试报告
9、pytest之jenkins集成
pytest和unittest区别
1、表达用例
unittest:定义一个类,继承unittest.TestCase
pytest:类/函数
2、断言的表达:
unittest: self.assertxxxx()
pytest: assert 表达式(结果为True-断言成功,否则断言失败) 逻辑/成员/比较/函数返回值
3、收集用例:
unittest:TestLoader类+TestSuite类.discover收集用例
pytest:自动收集用例
收集的机制:
1)、从哪个目录开始收集,
pytest命令在哪个目录下执行,就默认从哪个目录下开始搜索用例
2)、文件:目录下所有的文件都需要去看是否有用例吗?
不需要,目录下,有文件/子包
符合一下标准的文件,才会去文件中确认是否有用例
标准:1) .py 2)文件名以test_开头,或者以_test结尾
3)、用例名称:以test_开头的函数,或者以Test开头的类(不含__init__方法)名下,以test_开头的方法。
4)、执行顺序:
1)、文件名称顺序,-ASCII排序
哪个文件先识别,哪个文件下的用例,先执行
2)、文件内部,代码的先后顺序,从上到下
4、fixture:setup& teardown 前置后置
unittest:setup &teardown 、setupClass&teardownClass ---固定的名称
pytest:function(用例)->class(测试类)->model(.py) ->Session(会话)
pytest:不固定的名字(函数)/前置后置放在一个函数里,/独立的,不与测试类放在一起
定义: 1)、怎么知道函数它是一个前置后置
2)、怎么区分前置和后置
3)、作用域是什么?测试函数/类/模块/会话
4)、如果返回数据
共享: conftest.py ----名称固定,专门用来存放fixture./
作用域(哪些范围内的用例都可以使用):conftest.py所在的文件夹内的用例都可以使用,
可以在不同的层级,创建conftest.py
调用: 4)、测试用例当中,如何调用这个前置后置
5)、如何接收fixture的返回值
定义:1)、怎么知道函数它是一个前置后置, 在函数前面: @pytest.fixture
@pytest.fixture
def init():
pass
2)、怎么区分前置和后置,yield--前后置的分割线
@pytest.fixture()
def init():
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
yield
driver.quit
3)、作用域是什么?测试函数/类/模块/会话
function: 默认值,--unittest当中setup和teardown,夹了测试用
class:测试类,--unittest当中setupClass 和teardownClass
module:模块.py --整个py文件,
session:会话, --收集到的所有测试用例
调用: 4)、测试用例当中,如何调用这个前置后置?
在测试用例/类的前面:
@pytest.mark.usefixture("定义的fixture名称")
5)、接收返回值的方式
将fixture的函数名称,作为用例的参数
用例的参数=返回值
import pytest
from selenium import webdriver
# 定义fixture
@pytest.fixture()
def init():
# 前置
print("我是前置")
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
yield
# 后置
print("我是后置")
driver.quit()
@pytest.fixture(scope="class")
def mycc():
print("我是类级别的前置")
yield
print("我是类级别的后置")
# 测试用例
def test_baidu():
print("234333333")
# 只在淘宝这个方法初始化了
@pytest.mark.usefixtures("init")
def test_taobao():
print("taobao.....")
class TestAA:
def test_aa(self):
print('aaaaaaaaa')
5、插件:
unittest:无
pytest:700+
html插件
allure插件
重运行
6、筛选用例,使用方法:
注册标签名
在测试用例/测试类前面加上,@pytest.mark已注册的标记名
注册方式:
1)、创建pytest.ini文件,在文件中按如下形式添加标签名
[pytest]
markers =
demo: marks tests as slow
注:冒号之后是可选的描述信息
代码中的写法
@pytest.mark.demo
def test_aaa():
print("aaaaaaa")
assert True
执行的时候,命令
pytest -s -v -m demo,只执行demo的标记用例
2)、在conftest.py文件中,通过hook注册
def pytest_configure(config):
config.addinivalue_line("markers", "smoke1:标记只运行冒烟用例")
config.addinivalue_line("markers", "demo1: 示例运行")
总结:
1、区别- 自动收集/断言/写用例/插件/前置和后置
2、筛选用例:1)注册标签,2)打标记,@pytest.mark.标记名 ,3)运行时过滤: pytest.main(["-m", "标签名称", "-s", "-v"])
fixture -总结:定义/调用
定义:申明pytest.fixture/yield 区分前后置/作用域scope
1)测试用例文件当中定义
2)conftest.py当中定义 ,共享
conftest.py定义的fixture,哪些范围内的用例可以调用我
conftest.py所在的包下,所有的用例均可以
在不同的包下,可以创建自己的conftest.py
调用:测试用例/测试类
1) 用例不需要使用fixture返回值
2)用例要使用fixture的返回值:
方式一:@pytest.mark.userfixtures("")fixture函数名称作为用例参数
方式二: fixture函数名称作为用例参数
用例的参数有2种: 1)数据驱动 2)fixture
3)需要的时候才调用
4)如果测试类下面,所有的测试用例,都是用同一个函数级别的前置后置
那么可以直接在类名上,声明调用:@pytest.mark.userfixtures("函数级别的fixture")
conftest.py 所在目录下,全局共享。含子目录同样共享
html的测试报告
安装:pip install pytest-html
命令:pytest --html=相对路径
allure报告
allure:命令行工具,
在windows中使用,首先下载 allure包
Central Repository: io/qameta/allure/allure-commandline
找到zip格式的下载下来。
然后配置path中 环境变量。
安装一个插件库,pip install allure-pytest
使用,pytest --alluredir=/tmp/my_allure_results
使用allure命令,生成html样式的报告
allure serve alluredir的路径
解决问题
1、日志,失败截图
日志,记录用例执行的过程
失败截图,用例失败,在失败的操作截取当前的页面
用例中每一个步骤 === 调页面对象的行为 + 测试数据
页面对象
selenium webdriver API
日志/失败截图
1、等待可见
2、查找元素
3、点击-必然的前提,等待和查找
4、输入-必然的前提,等待和查找
5、获取属性-必然的前提,等待和查找
6、获取文本-必然的前提,等待和查找
2、减少pageobjects的行为封装
等待可见
查找元素
点击-必然的前提,等待和查找
输入-必然的前提,等待和查找
获取属性-必然的前提,等待和查找
获取文本,必然的前提,等待和查找
1、测试报告
2、有地写用例,运行用例
3、日志/失败截图
4、筛选用例/重运行功能