一、ddt(数据驱动测试 Data-Driven Testing)
1、数据和测试逻辑分离,便于维护。当数据和测试逻辑各自需要修改的时候,不会影响到对方
2、测试用例之间是独立的,符合测试需求,当不使用数据驱动测试的时候,测试用例的中断会影响另外测试用例的执行
3、参数化
1)测试用例函数会根据用例参数调用多次
2)声明@pytest.mark.parametrize()
@pytest.mark.parametrize('variable',data)
def test_login(variable):
pass
语法:@pytest.mark.parametrize('variable',data)中variable与测试函数中的def test_login(variable)参数variable变量名要一致,data是测试用例数据,通过data中的测试用例数据来驱动测试用例函数的执行,用例与用例之间是相互的独立的,一个用例的运行失败不会影响下一个测试用例的执行。
二、fixture 测试夹具
1、fixture:测试用例执行的前置和后置条件,即测试用例执行的环境
2、fixture夹具:就是函数
1)声明@pytest.fixture()
@pytest.fixture()
def function():
.....前置条件.....
yield "hello" # 返回值
.....后置条件.....
a、return和yield的区别:遇到return会终止,后面的代码不会运行,而yield的不会终止,后面的代码会运行,使用yield后就不再是普通的函数了,是一个生成器函数,遇到yield的就会先运行yield处的处理,然后再返回来执行后面的语句
b、如果没有后置条件,那可以使用return返回值,如果有后置条件那就使用yield
c、返回值的用处:1、比如要打开浏览器测试功能,前置条件就是打开浏览器,将打开浏览器的这个对象返回给测试函数,关闭浏览器这个对象可以使用测试的后置条件;2、数据库连接,准备好链接地址和端口地址,用户名密码,链接后返回一个数据库链接的对象,使用完后需要关闭数据库链接可使用后置条件
d、yield注意事项:
如果yield前面的代码,即前置条件部分已经抛出异常了,则不会执行yield后面的后置条件内容
如果测试用例抛出异常,yield后面的后置内容还是会正常执行
2)夹具的参数列表
@pytest.fixture(scope="function", params=None, autouse=False, ids=None, name=None)
scope:可以理解成fixture的作用域,默认:function,还有class、module、package、session四个【常用】
autouse:默认:False,需要用例手动调用该fixture;如果是True,所有作用域内的测试用例都会自动调用该fixture
name:默认:装饰器的名称,同一模块的fixture相互调用建议写个不同的name
3)夹具的调用
a、将fixture名称作为测试用例函数的输入参数
直接使用夹具函数名如:function_fixture将夹具函数名作为参数传入到测试用例函数中,使用夹具函数名可以获取夹具函数的返回值
b、测试用例加上装饰器:@pytest.mark.usefixtures(fixture_name)
c、fixture设置autouse=True
@pytest.fixture(autouse=True),scope默认为function,所有测试用例函数都不需要传入夹具函数名,就可以自动调用夹具函数了,同理当scope=class/module/package/session时,autouse为True会在这些作用范围内自动调用夹具函数
d、相关知识点
在类声明上面加 @pytest.mark.usefixtures() ,代表这个类里面所有测试用例都会调用该fixture
可以叠加多个 @pytest.mark.usefixtures() ,先执行的放底层,后执行的放上层
可以传多个fixture参数,先执行的放前面,后执行的放后面
如果fixture有返回值,用 @pytest.mark.usefixtures() 是无法获取到返回值的,必须用传参的方式
注意:添加了 @pytest.fixture ,如果fixture还想依赖其他fixture,需要用函数传参的方式,不能用 @pytest.mark.usefixtures() 的方式,否则会不生效
4)夹具作用域
a、默认作用域为函数@pytest.fixture(scope="function")
每个使用夹具的测试用例函数或者方法都会执行夹具
b、@pytest.fixture(scope="class"):夹具作用域设置为类
整个类夹具都只会运行一次
c、@pytest.fixture(scope="module"):夹具作用域设置为模块
整个模块夹具都只会运行一次
d、@pytest.fixture(scope="package"):夹具作用域设置为包
整个包夹具都只会运行一次
e、@pytest.fixture(scope="session"):夹具作用域设置session
整个session夹具都只会运行一次,所谓的session就是指运行一次pytest,整个测试会话(即开始执行pytest到结束测试)夹具只运行一次
5)fixture实例化顺序
a、较高 scope 范围的fixture(session)在较低 scope 范围的fixture( function 、 class )之前实例化【session > package > module > class > function】
b、具有相同作用域的fixture遵循测试函数中声明的顺序,并遵循fixture之间的依赖关系【在fixture_A里面依赖的fixture_B优先实例化,然后到fixture_A实例化】
c、自动使用(autouse=True)的fixture将在显式使用(传参或装饰器)的fixture之前实例化
6)conftest.py
a、共享fixture,conftest.py的模块名字是固定写法
b、该py可以让所有需要使用fixture的模块都省去了import,将共享的夹具函数放入conftest.py文件中,模块中调用夹具可以直接使用夹具函数名,不需要使用import,避免有过多的导入包操作,当测试用例函数调用时发现使用的夹具,当时在当前py中找发现没有定义,就会去当前父路径下的conftest.py中找
c、conftest.py放到项目的根目录
3、allure
1)java写的一个输出报告平台
2)使用步骤
a、下载allure的zip包进行解压
b、配置allure bin路径到环境变量
c、pytest绑定allure:pip install allure-pytest
d、pytest --alluredir=目录路径 输出结果:目录路径下都是用例执行输出的allure解析数据
e、allure serve 目录路径 输出结果:将目录下的allure数据生成成一个测试报告