Pytest框架实现一些前后置(固件、夹具)的处理,常用三种。
一、setup/teardown、setup_class/teardown_class
为什么需要这些功能?
比如:web自动化的打开浏览器、关闭浏览器。
import pytest
def test_fi01():
print("测试函数01")
assert 1 == 2
class TestLogin:
age = 18
def setup_class(self):
print("\n在每个类执行前的初始化工作:比如:创建日志对象、创建数据库连接、创建接口请求对象")
def setup(self):
print("\n执行测试用例之前初始化:打开浏览器,加载网页")
# 标记执行顺序
@pytest.mark.run(order=1)
def test_01(self):
print("\n测试方法01")
# 标记成冒烟用例
@pytest.mark.smoke
def test_02(self):
print("\n测试方法02")
# 标记成模块用例
@pytest.mark.login
def test_03(self):
print("\n测试方法03")
# 标记成无条件跳过
@pytest.mark.skip(reason="还没调试好")
def test_04(self):
print("\n测试方法04")
# 标记成有条件跳过
@pytest.mark.skipif(age >= 18, reason="已成年,不执行")
def test_05(self):
print("\n测试方法05")
def teardown(self):
print("\n执行测试用例后的扫尾工作:关闭浏览器")
def teardown_class(self):
print("\n在每个类执行后的扫尾工作:比如:销毁日志对象、断开数据库连接、销毁接口请求对象")
二、使用fixture装饰器,来实现部分用例的前后置
装饰器
@pytest.fixture(scope="", params="", autouse=True, ids="", name="")
参数解析:
- scope:被@pytest.fixture标记的方法的作用域。function(默认)、class、module、package/session
- params:参数化。支持列表[]、元组()、字典列表[{},{},{}]、字典元组({},{},{})
- return和yield都有返回的意思,但是return后面的代码不执行,yield后的代码可以执行。
- autouse = True:自动执行,默认False。
- ids:当使用参数化时,给每个变量设置的变量名。意义不大。
- name:给表示的是被@pytest.fixture标记的方法取一个别名。
- 当取了别名之后,就不能使用原来的名字。
import pytest
@pytest.fixture(scope="function", params=["Tom", "Jack", "Jerry"], ids=["t", "ja", "je"], name="abc")
def my_fixture(request):
print("\nfixture:这是前置的方法")
yield request.param
print("\nfixture:这是后置的方法")
class TestUser:
def test_06(self, abc):
print("\n测试方法06", abc)
def test_07(self):
print("\n测试方法07")
class TestUser2:
def test_user2_01(self):
print("\n测试方法test_user2_01")
执行效果:
============================= test session starts =============================
collecting ... collected 5 items
test_useradd.py::TestUser::test_06[t]
fixture:这是前置的方法
测试方法06 Tom
PASSED
fixture:这是后置的方法
test_useradd.py::TestUser::test_06[ja]
fixture:这是前置的方法
测试方法06 Jack
PASSED
fixture:这是后置的方法
test_useradd.py::TestUser::test_06[je]
fixture:这是前置的方法
测试方法06 Jerry
PASSED
fixture:这是后置的方法
test_useradd.py::TestUser::test_07
测试方法07
PASSED
test_useradd.py::TestUser2::test_user2_01
测试方法test_user2_01
PASSED
============================== 5 passed in 0.03s ==============================
三、通过conftest.py和pytest.fixture()结合使用可以实现全局的前置应用(比如项目的全局登录,模块的全局处理)
上面两种方式作用只能生效在同一个模块下,如何实现跨模块的前后置呢?
- conftest.py文件是单独存放的一个夹具配置文件,名称不可改。
- 用处:可以在不同的模块文件中使用同一个fixture函数。
- 原则上conftest.py需要喝运行的用例放到统一层,并且不需要做任何的import导入操作。
# 全局前后置方法
import pytest
@pytest.fixture(scope="function")
def all_fixture():
print("\nfixture:全局前置")
yield
print("\nfixture:全局后置")
四、前后置总结
- setup/teardown、setup_class/teardown_class 它是作用于同一模块下所有用例或者所有类的前后置。
- @pytest.fixture() 它的作用是同一模块下既可以部分也可以全部的前后置。
- conftest.py和pytest.fixture() 结合使用,作用于全局的前后置。
五、断言
- assert
assert 1 == 2
六、pytest结合allure-pytest插件生成allure测试报告
1.下载allure,安装,配置环境变量。
- 下载地址:https://github.com/allure-framework/allure2
- 解压后,将bin目录路径配置到PATH中。
- 验证:allure --version
- 如果dos中验证通过,但IDE中识别不到,需要重启IDE(idea、pycharm)
2.执行命令,生成json格式的临时报告
--alluredir ./temp
3.生成allure报告
os.system("allure generate ./temp -o ./reports --clean")
- allure generate 命令,固定的
- ./temp 临时的json报告路径
- -o 输出 output
- ./reports 生成的allure报告的路径
- --clean 清空./reports原来的报告
报告展示:
4.问题:进入reports目录双击index.html直接打开,发现页面都是loading
原因:allure报告需要用allure命令渲染之后才能显示效果。
解决办法:使用命令 allure open ./reports