2.pytest参数化

目的:代码与测试数据分离

pytest数据驱动

@pytest.mark.parametrize ---装饰器
@pytest.mark.parametrize('x',[1,2,3]) #这边只要后面的参数是列表就行
def test_001(x):
assert x==3 #断言
@pytest.mark.parametrize('inData,repsData',get_excelData()) #这里是传了inData和repsData两个变量,两个变量里面写元组
def test_login(inData,repsData):
res = LoginClass().api_login(inData,getSession = False)
assert json.loads(res)['retcode'] == json.loads(repsData)['retcode']#断言

单个参数,进行参数化示例

 

 

多个参数,进行参数化示例

 

 

 

 一、pytest初始化操作和环境清除操作

 

1、方法级别初始化、清除

 

  • pytest 中的 setup 和 teardown
  • 在每个方法执行前后都会执行一次
  • 固定函数名称如下(函数名称不能写错)

 

def setup(self):
    print("setup_function--->")
 
def teardown(self):
    print("teardown_function--->")
def setup_method(cls):
    print("setup_function--->")
 
def teardown_method(cls):
    print("teardown_function--->")

实例如下

 

 

import pytest
 
class Test():
    def setup(self):
        print("setup_function--->")
 
    def teardown(self):
        print("teardown_function--->")
 
    def test_01(self):
        print("BB测试1")
 
    def test_02(self):
        print("BB测试2")
 
    def test_03(self):
        print("BB测试3")
 
if __name__ == '__main__':
    pytest.main(["-s","test_demo1.py"])
 
# 结果如下
test_demo1.py 
 
setup_function--->
BB测试1
.teardown_function--->
 
setup_function--->
BB测试2
.teardown_function--->
 
setup_function--->
BB测试3
.teardown_function--->

 

2、模块级别初始化、清除

  • 分别在整个模块中所有类中的内容执行前后运行setup_module和teardown_module
  • 设置全局方法 def setup_module() 和 def teardown_module()

 

# 定义全局方法
def setup_module():
    print("setup_function--->")
 
def teardown_module():
    print("teardown_function--->")
 
class Test01():
 
    def test_01(self):
        print("BB测试1")
 
    def test_02(self):
        print("BB测试2")
 
class Test02():
 
    def test_03(self):
        print("BB测试3")
 
# 结果如下
 
collected 3 items
test_demo1.py 
 
setup_function--->
BB测试1
.BB测试2
.BB测试3
.teardown_function--->

3、类级别初始化、清除

  • 在类中添加类方法 def setup_class(cls) 和 def teardown_class(cls)
  • 在定义了类方法 def setup_class(cls) 和 def teardown_class(cls) 的类中所有的用例执行前后只执行一次

 

class Test01():
    @classmethod
    def setup_class(cls):
        print("setup_function--->")
 
    @classmethod
    def teardown_class(cls):
        print("teardown_function--->")
 
    def test_01(self):
        print("测试1")
 
    def test_02(self):
        print("测试2")
 
class Test02():
 
    def test_03(self):
        print("测试3")
 
# 结果如下
collected 3 items                                                                                            
test_demo1.py 
 
setup_function--->
测试1
.测试2
.teardown_function--->
 
# 如下的用例打印前后未执行初始化和清除操作
测试3
.

 

 

 

  

二、环境初始化,使用conftest.py ---专门做初始化

初始化内容:

1.清空所有数据

2.新增一些数据

import pytest,json
from Lib.ApiLogin import LoginClass
from Lib.ApiLesson import LessonClass
@pytest.fixture(scope='module',autouse=True)#环境初始化 、数据清除
def delete_all_lesson(request):
#1- 登录
session = LoginClass().api_login('{"username": "auto","password": "sdfsdfsdf"}')
#2- 列出所有课程
inData = {'action': 'list_course',
'pagenum' :'1',
'pagesize' : '20'
}
resList = json.loads(LessonClass().list_lesson(session,inData))['retlist']
for one in resList:
lessonId = one['id']#获取课程id
# 3- 删除所有的课程
LessonClass().delete_lesson(session,lessonId)


#创建课程测试数据
for one in range(1,7):
lessonData = {"name": f"波波{one:0>3}", "desc": "初中课程", "display_idx": f"{one}"}
LessonClass().add_lesson(session,lessonData)

#环境、数据清除----teardown
def fin():

print('----测试环境恢复----')

request.addfinalizer(fin)

#一个xx.py 可以有很多个class

注意:

在conftest文件中设置好初始化和环境清除的方法后,并且设置
如何调用?
前提是conftest文件中这个初始化方法设置了不会自动执行,然后才要在TestCase用例测试类里面的方法上加上:@pytest.mark.usefixtures('初始化方法')
usefixtures是没有返回值的,但如果fixture有return返回值时,就不能使用usefixtures,就需要直接把conftest中的def方法名直接放入测试用例中去,例如:def test_add_lesson(conftest中的def方法名)

例如下面:有对初始化操作针对的是包,模块级别的,有针对函数,方法级别的,并且可以设置这个初始化操作是否自动执行

 

 




pytest中批量执行用例和执行部分用例,方法如下:

• 在测试方法上加下面装饰器

• @pytest.mark.last    ---最后一个执行
• @pytest.mark.run(order=1)---第几个执行


在测试类里面指定某条同用例执行的话,需要给那条用例加标签
@pytest.mark.add  这是add标签
@pytest.mark.add#标签--
def test_add_lesson(self):
inData = {"name": "心田001", "desc": "初中化学课程", "display_idx": "2"}
print('------新增课程---开始--')
res = LessonClass().add_lesson(self.session,inData)
assert json.loads(res)['retcode'] == 0
print('------新增课程---结束--')


pytest中筛选用例的执行方式:
1、通过标签来筛选需要执行的用例,在运行命令后面加个 -m=标签名,命令如下:
pytest testlesson.py -s -m=add 如果要运行多个标签,如要运行新增,列出和删除标签的用例: pytest testlesson.py -s -m=add,list,delete

2、通过在文件名后面加2个冒号再+类名或者类名和方法名 ,来执行某个用例文件中的某个测试用例模块或者是用例模块中的某个用例
pytest -s testlesson.py ::类名::方法名
例如:pytest -s testlesson.py::Test1::test_1

3.也可以通过-k筛选用例,根据用例名来筛选执行某些用例
例如:pytest -s -k test testlesson.py (这是通过-k执行用例名带test的用例来执行)

4.执行main方法的话,后面要加个后缀--alluredi
if __name__ == "__main__":
  pytest.main(['testLesson.py::类名::方法名','-s'],'--alluredir')
如果想一键运行整个用例,可以在根目录加个bat文件
1.先cd进用例的目录里去
2.写执行命令 pytest -sq

 

执行命令的文档

执行命令小结:

pytest -s  是详细输出

pytest -q 是简化输出

pytest -k 是筛选用例

pytest  -m 是指定标签输出

pytest  -x 是遇到错误时停止测试

pytest --maxfail=1   是当用例错误个数达到指定个数时停止测试

 

 

 

 

 

 

 





posted @ 2020-08-25 22:12  小boboa  阅读(364)  评论(0编辑  收藏  举报