Python+Appium【第六章】学习Pytest/配置Allure报告

  • Pytest介绍与安装
    • 什么是Pytest
      • 编写要求/规范
    • fixture
      • 设置fixture
      • 设置fixture作用范围
      • fixture传参适用
      • fixture之autouse、ids、name应用
    • conftest
      • 外层conftest
      • 内层调用外层
    • mark
      • 配置mark并使用
    • 设置用例执行顺序
      • 常用的方法
    • skip
      • skip三种用法
  • 什么是Allure
    • Allure环境搭建
    • 设置json报告
    • 输出html报告
  • 总结

Pytest介绍与安装

什么是Pytest

pytest是python的第三方单元测试框架,比自带的unittest更简洁高效,同时兼容unittest框架。

它还有如下优点:
1、简单灵活,容易上手,文档丰富
2、支持参数化,可以细粒度地控制要测试的测试用例
3、能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appium等自动化测试、接口自动化测试(pytest+requests)
4、pytest具有很多第三方插件,并且可以自定义扩展,比较好用的如pytest-selenium(集成selenium)、pytest-html(完美html测试报告生成)、pytest-rerunfailures(失败case重复执行)、pytest-xdist(多CPU分发)等
5、测试用例的skip和xfail处理
6、可以很好的和CI工具结合,例如jenkins

编写要求/规范

pytest测试用例编写规则:

1、测试文件以test_开头(以_test结尾也可以)
2、测试类以Test开头,并且不能带有__init__方法
3、测试函数以test_开头
4、断言必须使用assert

  • 示例
# -*- coding: utf-8 -*-
# @Time : 2022/1/25 9:35
# @Author : Limusen
# @File : test_demo_01


import pytest


def add(a, b):
    return a + b


class TestDemo1:

    def test_case_01(self):
        assert add(1, 2) == 3


if __name__ == '__main__':
    pytest.main(['-s', '-v'])

  • 图示
    Python+Appium【第六章】学习Pytest/配置Allure报告_第1张图片

fixture

fixture是pytest特有的功能,它用pytest.fixture标识,定义在函数前面。fixture有明确的名字,在其他函数,模块,类或整个工程调用它时会被激活。

fixture是基于模块来执行的,每个fixture的名字就可以触发一个fixture的函数,它自身也可以调用其他的fixture。
可以把fixture看做是资源,在你的测试用例执行之前需要去配置这些资源,执行完后需要去释放资源。类似unittest中的setupteardown功能。

  • fixture方法详解

fixture(callable_or_scope=None,*args,scope=“function”,params=None,autouse=False,ids=None,name=None):
scope:作用范围,设置范围后,会根据设置的范围去触发执行。范围可选值
function:每个方法(函数)都会执行一次。(默认)class:每个类都会执行一次。类中有多个方法调用,只在第一个方法调用时执行。
module:一个.py文件执行一次。一个.py文件可能包含多个类和方法。
package/session:多个文件调用一次,可以跨.py文件
params:传入参数,接收一个列表,列表中每个数据都作为用例的输入
autouse:在一个session内所有的test都会自动调用当前的fixture,默认为false
ids:测试字符串id的列表,每个测试字符串id对应于params,默认为参数值 name:fixture的名称,默认为装饰函数的名称

设置fixture

# -*- coding: utf-8 -*-
# @Time : 2022/1/25 9:35
# @Author : Limusen
# @File : test_demo_01


import pytest


@pytest.fixture()
def action():
    print("\n测试之前初始化数据...")
    yield
    print("\n测试环境清理垃圾数据")


def test_case_01(action):
    print("执行test_case_01")


def test_case_02(action):
    print("执行test_case_02")


if __name__ == '__main__':
    pytest.main(['-s', '-v'])

  • 图示
    Python+Appium【第六章】学习Pytest/配置Allure报告_第2张图片

设置fixture作用范围

  • 示例代码
# -*- coding: utf-8 -*-
# @Time : 2022/1/25 9:35
# @Author : Limusen
# @File : test_demo_01


import pytest


@pytest.fixture(scope="module")
def action():
    print("\n测试之前初始化数据...")
    yield
    print("\n测试环境清理垃圾数据")


def test_case_01(action):
    print("执行test_case_01")


def test_case_02(action):
    print("执行test_case_02")


if __name__ == '__main__':
    pytest.main(['-s', '-v','test_demo_03.py'])

  • 图示
    Python+Appium【第六章】学习Pytest/配置Allure报告_第3张图片

fixture传参适用

注意设置传参的时候必须要用request的内置变量,否则会报错

Python+Appium【第六章】学习Pytest/配置Allure报告_第4张图片

  • 示例代码
# -*- coding: utf-8 -*-
# @Time : 2022/1/25 9:35
# @Author : Limusen
# @File : test_demo_01


import pytest


@pytest.fixture(params=[100, 200, 300])
def action(request):
    # 注意:这个地方必须用request.param
    return request.param


def test_case_01(action):
    print(action)
    assert 50 < action


if __name__ == '__main__':
    pytest.main(['-s', '-v', 'test_demo_04.py'])

  • 图示
    Python+Appium【第六章】学习Pytest/配置Allure报告_第5张图片

fixture之autouse、ids、name应用

  • 示例
# -*- coding: utf-8 -*-
# @Time : 2022/1/25 9:35
# @Author : Limusen
# @File : test_demo_01


import pytest

numb = [100, 200, 300]


@pytest.fixture(params=numb, autouse=True, ids=['01', '02', '03'], name='params')
def action(request):
    # 注意:这个地方必须用request.param
    return request.param


def test_param(params):
    print(params)
    assert 50 < params


def test_params_autouse():
    print('test_params_autouse')


if __name__ == '__main__':
    pytest.main(['-s', '-v', 'test_demo_05.py'])

  • 图示
    Python+Appium【第六章】学习Pytest/配置Allure报告_第6张图片

conftest

conftest.py文件应用:

pytest中的fixture是pytest用于将测试前后进行预备,清理工作的代码分离出核心测试逻辑的一种机制。
但是我们更加希望的是在一个测试套件中,能够共享fixture的机制,这样一个测试套件里面的所有测试点都能够共同使用。
在pytest中可以通过conftest.py来共享fixture,如果希望多个测试文件共同使用一个fixture时候,可以在该目录下创建conftest.py文件。

  • 注意事项

使用conftest.py:
1、该文件所在目录必须存在__init__.py文件
2、该文件不能被其他文件导入,会自动被调用
3、所有同目录测试文件运行前都会执行该文件
4、该文件名字是固定的,不可以做任何修改

外层conftest

  • 外层conftest编写
# -*- coding: utf-8 -*-
# @Time : 2022/1/25 10:33
# @Author : Limusen
# @File : conftest


import pytest


@pytest.fixture(scope="module")
def package_fixture():
    print("调用外层fixture模块开始...")
    yield
    print("调用外层fixture模块结束...")
  • py文件编写
# -*- coding: utf-8 -*-
# @Time : 2022/1/25 9:35
# @Author : Limusen
# @File : test_demo_06


import pytest


def test_case_01(package_fixture):
    print("执行test_case_01")


def test_case_02(package_fixture):
    print("执行test_case_02")


if __name__ == '__main__':
    pytest.main(['-s', '-v','test_demo_06.py'])

Python+Appium【第六章】学习Pytest/配置Allure报告_第7张图片

内层调用外层

  • 示例
# -*- coding: utf-8 -*-
# @Time : 2022/1/25 9:35
# @Author : Limusen
# @File : test_demo_01


import pytest


def test_case_01(package_fixture):
    print("执行test_case_01")


def test_case_02(package_fixture):
    print("执行test_case_02")


if __name__ == '__main__':
    pytest.main(['-s', '-v', 'test_demo_06.py'])

  • 图示
    Python+Appium【第六章】学习Pytest/配置Allure报告_第8张图片
  • 调用多个fixture
    Python+Appium【第六章】学习Pytest/配置Allure报告_第9张图片

mark

mark主要用于在测试用例/测试类中给用例打标记(只能使用已注册的标记名),实现测试分组功能,并能和其它插件配合设置测试方法执行顺序等。

  • 设置步骤如下:

    1、注册标签名,通过pytest.ini配置文件注册;
    2、在测试用例的前面加上:@pytest.mark.已注册标签名
    3、运行时,根据用例标签过滤(-m标签名)

配置mark并使用

需要新建一个pytest.ini文件,存放我们的标签

  • pytest.ini
    Python+Appium【第六章】学习Pytest/配置Allure报告_第10张图片
  • 测试用例
    Python+Appium【第六章】学习Pytest/配置Allure报告_第11张图片

设置用例执行顺序

默认情况下,pytest测试用例的执行顺序是按先外层后内层(目录下的文件),再根据名称按ascii码值的顺序升序执行,文件内的测试方法根据编写的先后顺序执行。

如果想自定义pytest测试用例的执行顺序,可以通过多种方式实现

常用的方法

1、利用pytest_ordering插件,通过装饰器 @pytest.mark.run(order=1)来进行控制,数字越小,越前执行。

需要提前使用pip安装插件

pip install pytest_ordering 

Python+Appium【第六章】学习Pytest/配置Allure报告_第12张图片

2、交换用例位置

交换前Python+Appium【第六章】学习Pytest/配置Allure报告_第13张图片

交换后
Python+Appium【第六章】学习Pytest/配置Allure报告_第14张图片

skip

测试用例跳过(忽略)设置:在实际工作中,经常需要跳过某个测试用例,比如现阶段某个功能还没有开发完毕,但是先把测试用例写到了pytest中,因此需要先把这个测试用例给跳过.

skip三种用法

1、使用@pytest.mark.skip(self,reason=None):
在要跳过的测试用例前加入该标签,并可以选择传入一个非必须参数reason表示原因

2、使用@pytest.mark.skipif(self,condition,reason=None):
在要跳过的测试用例前加入该标签,根据condition条件判断是否进行跳过

3、使用skip()方法:
在测试用例中调用pytest.skip()方法来实现跳过,可以选择传入msg参数来说明跳过原因;如果想要通过判断是否跳过,可以写在if判断里

  • 示例代码
# -*- coding: utf-8 -*-
# @Time : 2022/1/25 9:35
# @Author : Limusen
# @File : test_demo_09


import pytest


@pytest.mark.skip(reason="无条件跳过用例")
def test_case_01():
    print("执行 test_case_01")


@pytest.mark.skipif(condition='True')
def test_case_02():
    print("执行 test_case_02")


def test_case_03():
    pytest.skip("函数内跳过")
    print("执行 test_case_03")


def test_case_04():
    print("执行 test_case_04")


if __name__ == '__main__':
    pytest.main(['-s', '-v', 'test_demo_09.py'])

  • 图示
    Python+Appium【第六章】学习Pytest/配置Allure报告_第15张图片

什么是Allure

allure是一款开源的,专门用来展示测试结果的一个工具,allure可以与很多的测试框架做集成,比如:java的Junit、TestNG,python的pytest等allure会将测试用例的执行数据保存到json文件中去,再利用allure的命令行将文件转换成HTML形式呈现出来。

Allure环境搭建

allure搭建步骤如下:

  • 1.使用命令 安装allure插件
pip install allure-pytest
  • 2.安装allure命令行工具:

    2.1 安装jdk,并配置好环境变量,allure命令行工具由java开发;

    2.2 通过地址:https://github.com/allure-framework/allure2/releases 下载最新版本的allure命令行工具并解压

    2.3 配置环境变量

    新增ALLURE_HOME:allure命令行工具解压路径在path最后追加;%ALLURE_HOME%\bin

  • 下载allure插件
    Python+Appium【第六章】学习Pytest/配置Allure报告_第16张图片

  • 配置插件的环境变量
    Python+Appium【第六章】学习Pytest/配置Allure报告_第17张图片

  • 检查环境变量是否配置完毕(打开cmd,输入allure)
    Python+Appium【第六章】学习Pytest/配置Allure报告_第18张图片

设置json报告

  1. 新建reports文件
  2. 再新建json_html文件,存放json文件

Python+Appium【第六章】学习Pytest/配置Allure报告_第19张图片

  • 设置json文件生成路径路径
# -*- coding: utf-8 -*-
# @Time : 2022/1/25 14:06
# @Author : Limusen
# @File : allure_demo

import pytest
import os

current_path = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
report_json_path = os.path.join(current_path, '..', 'reports', 'json_html')

# 设置json报告输出路径 --alluredir

if __name__ == '__main__':
    pytest.main(['-s', '-v', '--alluredir=%s' % report_json_path])

输出html报告

  • 将json文件转换成html文件
# -*- coding: utf-8 -*-
# @Time : 2022/1/25 14:06
# @Author : Limusen
# @File : allure_demo

import pytest
import os

current_path = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
report_json_path = os.path.join(current_path, '..', 'reports', 'json_html')
report_html_path = os.path.join(current_path, '..', 'reports', 'html')

# 设置json报告输出路径 --alluredir

if __name__ == '__main__':
    # --clean-alluredir 每次执行之前删除上一次的json文件
    pytest.main(['-s', '-v', '--alluredir=%s' % report_json_path, '--clean-alluredir'])
    #  执行命令,将json文件转换成html报告输出
    os.system('allure generate %s -o %s --clean' % (report_json_path, report_html_path))

Python+Appium【第六章】学习Pytest/配置Allure报告_第20张图片

  • 查看html报告
    Python+Appium【第六章】学习Pytest/配置Allure报告_第21张图片

总结

本文主要分享了pytest的常用知识以及如何配置allure报告,有什么问题可以再下方提问,觉得不错的话请不要吝啬你们手中的小心心,帮忙点个赞 万分感谢~

你可能感兴趣的:(Python-App自动化,python,单元测试,压力测试)