课程名称
全能软件测试工程师
课程章节
PyTest测试框架
课程讲师
大周
课程内容
PyTest断言
assert ...
PyTest参数化
import pytest
def add(a, b):
return a + b
# 第一种实现参数化的写法
@pytest.mark.parametrize(['x','y'],[(1,2),(0,3),(1,4)])
def test_add1(x, y):
...
# 第二种参数化的写法
xy = [(-1,3),(-1,4),(1,-4)]
@pytest.mark.parametrize(['x','y'],xy)
def test_add2(x,y):
...
PyTest测试用例组织
pytest用例默认执行顺序是从上到下
执行顺序通过装饰器设置:
@pytest.mark.run(order=1)
@pytest.mark.first # 优先级最高,但不推荐同时使用,容易产生冲突
在优先级方面
- 正数 :pytest.mark.first是最高优先级
- 倒数: pytest.mark.last优先级要低于order=-1
如果我们在进行标记顺序时,假设我们采用了数字的形式,那么就都用数字
PyTest指定运行测试用例
if __name__ == "__main__":
#根据路径指定运行模块或文件夹
# pytest.main(['test_pytest1.py'])
# pytest.main(['test_my_case/test_pytest1.py'])
# pytest.main(['test_my_case'])
#指定运行模块下的测试函数或者测试类
# pytest.main(['test_pytest4.py::test_01'])
# pytest.main(['test_pytest4.py::TestLogin::test_05'])
#指定多个测试模块运行
# pytest.main(['test_pytest4.py::TestLogin::test_05',
# 'test_pytest4.py::test_01'])
PyTest前置和后置操作
setup_class和teardown_class
该方法表示在类中执行测试用例前,只执行1次测试前置和测试后置
setup_method和teardown_method
该方法表示在类中每次执行测试用例前,测试前置和测试后置都会执行一次
setup_module和teardown_module
该方法表示只能类外面执行用例过程中,只执行1次。
setup_function和teardown_function
该方法表示在类外面执行用例过程中,每次都会执行前置和后置
1、setup_class和setup_module执行用例时,只执行一次前置和后置
2、setup_class、setup_method、setup是在类中执行的
3、setup_module、setup_function、setup是在类外执行的
4、其中setup类中、类外都可以执行
Fixture
fixture是pytest特有的功能,它用pytest.fixture标识,定义在函数前面。在你编写测试函数的时候,你可以将此函数名称做为传入参数,pytest将会以依赖注入方式,将该函数的返回值作为测试函数的传入参数。
fixture主要的目的是为了提供一种可靠和可重复性的手段去运行那些最基本的测试内容。比如在测试网站的功能时,每个测试用例都要登录和退出,利用fixture就可以只做一次,否则每个测试用例都要做这两步也是冗余。
Fixture多应用
- 同一个fixture返回多个值:可以使用元组解包
@pytest.fixture
def first_fixture():
return 1,2,3
def test_case1(first_fixture):
a,b,c = first_fixture
print(a,b,c)
- 一个函数传入多个fixture
@pytest.fixture
def second_fixture():
print("这是第二个fixture")
def test_case2(first_fixture,second_fixture):
print(first_fixture)
print(second_fixture)
Fixture作用域与自动化
- fixture里面有个scope参数可以控制fixture的作用范围:
session > module > class > function
- 当我们使用fixture时,把scope的值设置成class时,每一个测试类之前都会被运行,pytest在每个测试函数的外层会自动的把函数包装成一个测试类
- 在使用fixture时,
scope=function
时,无论时在函数中,还是在方法中,都是作用域为funtion在生效 - 在我们使用的最新的Python版本中,去掉了scope=method这个作用域
Fixture实现参数化
import pytest
# fixture实现参数化
test_case = [
{
'username':'admin',
'password':'12345678',
'case_desperation':'正确登录'
},
{
'username': 'imooc',
'password': '12345678',
'case_desperation': '错误的登录'
},
]
@pytest.fixture(params=test_case)
def param_data(request):
# request是pytest内置的fixture,必须这样写才能传进来
# 它的作用主要就是用来帮助我们传递参数
return request.param
def test_param(param_data):
usernmae = param_data.get('username')
password = param_data.get('password')
case_desperation = param_data.get('case_desperation')
print("username:"+usernmae+", password:"+password+", case_desperation:"+case_desperation)
Fixture实现测试控制
- 无理由跳过
@pytest.mark.skip
def function():
...
- 有理由跳过
@pytest.mark.skipif(...)
def function():
...
Fixture集成Allure
# 生成测试数据
if __name__ == "__main__":
pytest.main([
'test_pytest13.py',
'--alluredir',
'./result'
])
# 生成allure报告
os.system("allure generate ./result -o ./report_allure --clean")
# 直接在默认浏览器中打开测试报告
allure open ./report
课程收获
学习了PyTest测试框架。
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦