pytest(二)前后置(固件、夹具)、断言、生成allure测试报告

        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,安装,配置环境变量。

  1. 下载地址:https://github.com/allure-framework/allure2
  2. 解压后,将bin目录路径配置到PATH中。
  3. 验证:allure --version
  4. 如果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原来的报告

报告展示: 

pytest(二)前后置(固件、夹具)、断言、生成allure测试报告_第1张图片

 4.问题:进入reports目录双击index.html直接打开,发现页面都是loading

pytest(二)前后置(固件、夹具)、断言、生成allure测试报告_第2张图片

 原因:allure报告需要用allure命令渲染之后才能显示效果。

解决办法:使用命令 allure open ./reports

你可能感兴趣的:(Python,#,Python接口自动化,python)