python之测试框架pytest(二)

一、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数据生成成一个测试报告

上一篇:angular2单元测试学习


下一篇:pytest文档51-内置fixture之cache使用