8-27-web自动化DAY2-pytest和allure

Pytest 学习指南-allure学习指南

pytest

基本介绍

pytest框架是一个成熟,全面的测试框架,具有非常丰富的第三方插件,并且可以自定义扩展

比如:pytest-selenium , pytest-html , pytest-rerunfailures(失败case重复执行)pytest-xdist(多cpu分发)

pytest还以其简单灵活,上手简单著称,能够支持简单的单元测试和复杂的功能测试,支持参数化操作。

官方文档

安装指南

pip install pytest

验证安装:

pytest --version # 会展示当前已安装版本

文件基本命名格式

默认满足以下条件:

测试文件满足:test_xxx.pyxxx_test.py格式,即以test_为前缀或_test为后缀

测试类满足:以Test开头,且不能含有init方法(定义class时,要以T开头,不然pytest框架不会识别该类,自然就不会进入该类内部进行搜索)

因为测试类里进行前后置操作不能通过init等魔法函数,而是通过特定的函数setup_classteardown_class前面半段指定了是前置操作还是后置操作,后半段则是指定了该操作的重复级别:

class:类重复级别:该类中只执行一次

method:测试方法重复级别:该类中每个测试用例(方法)执行一次

执行:在命令行执行pytest命令时,会自动从当前目录及子目录中寻找符合上述约束的测试函数来执行。

模板

import pytest  #导入pytest模块


def test_beifan():  #测试用例
    pass
    
class TestBaili:  #测试套件
    def test_a(self): #测试用例,第一个测试方法
        pass
        
    def test_b(self):  #测试用例,第二个测试方法
        pass

pytest框架断言

常用断言:

  • assert xx:判断 xx 为真
  • assert not xx:判断 xx 不为真
  • assert a in b:判断 b 包含 a
  • assert a == b:判断 a 等于 b
  • assert a !=b:判断 a 不等于 b

pytest命令行执行

指定文件:
pytest ./xxx.py
指定方法
pytest ./xxx.py::类名::方法名
pytest ./xxx.py::TestData::test_demo1

### 常用命令参数
-v 输出用例更加详细的执行信息,比如用例所在文件和用例名称
-k 执行用例中包含'关键字'的用例
-s 输出用例中的调试信息,比如print打印消息,不加参数则不输出待执行的用例
-m 执行标记的内容,执行特定的测试用例,执行有相同标记的测试用例
-x 执行失败则停止执行,后面的用例不会被执行
--maxfail=n 执行失败n次后停止执行,n为最大程度接收失败的次数
--count=n 执行用例n次,n=2则执行两次
--lf (last failed) 重新执行上传失败的用例,若没有失败,则会全部跑
--ff (failed first) 重新运行所有用例,但是首先运行上传失败的用例

### 测试结果的标志
. 代表一个测试用例通过,..代表两个测试用例通过
s 代表skip,即用例跳过执行
F 即failure一般是断言发生错误
E error,一般是用例执行过程中报错

              

pytest 标记测试用例以及测试用例的指向执行

pytest的标记机制与用例执行的方法

pytest标记是需要通过pytest.mark来标记使用的,pytest为了应对各种测试场景也内置了许多标记。

  1. 参数化标记:pytest.mark.parametrize通过parametrize可以将用例数据和用例执行的逻辑代码分离,并实现根据用例,自动生成测试用例

  2. @pytest.mark.parametrize('item',[11,22,33,44,55,66])
    def test_demo(item)
        assert item >50
    用法:
    格式:pytest.mark.parametrize('每个用例包含的变量列表,以引号括住,变量间以,号隔开',实参列表,当每组变量数量只有一个时,使用一维数组即可,无特殊包裹要求,以逗号隔开,若存在多个变量则输入二维数组即可。)
    
  3. 跳过用例执行:pytest.mark.skip通过skip装饰的用例,在执行时会无条件跳过。可选参数reason:跳过测试函数的原因

  4. @pytest.mark.skip
    def test_demo():
        assert item>50
    @pytest.mark.skip(reason='不需要执行')
    def test_demo1():
        assert item>50
    
  5. 根据条件跳过用例:pytest.mark.skipifskipif可以根据条件来决定是否跳过用例的执行,如果条件为True则跳过测试函数执行。 参数:condition:跳过条件,reason:跳过的原因

  6. a =10
    @pytest.mark.skipif(a>20,reason='条件不成立,不执行')
    def test_demo():
        assert item >50
    
  7. 标记预期失败的用例:pytest.mark.xfailxfail可以将测试用例标记为预期执行失败的用例.

    • 参数
    • condition:将测试函数标记为xfail的条件(True/False)
    • reason:测试函数被标记为xfail的原因
    • raises:预期失败的异常类型
    • run:是否应该实际执行函数,如果False,该函数将始终xfail并且不会被执行
    • strict:严格模式(True或False)
  8. a=10
    @pytest.mark.xfail(a>20,reason='条件不成立,不执行',raises = AssertionError)
    def test_demo():
        assert item>50
    

allure

安装与下载

需要下载本地文件,并且添加到环境变量里

windows:下载,解压,并配置环境变量:Releases · allure-framework/allure2 · GitHub
mac:brew install allure

环境变量:将bin目录纳入path路径中

python安装第三方依赖

win:pip install allure-pytest

mac:pip3 install allure-pytest

allure-pytest依赖会自动安装Allure-pytest和Allure-python-commons包,以生成与Allure 2兼容的报告数据

基本用法

命令行执行,在进行pytest测试时,生成allure数据: pytest --allure=./allure-results

命令行执行,将生成的allure数据解析出来,展示在浏览器中: allure serve ./allure-results

Allure 注解

使用方法 参数值 参数说明
@allure.epic() epic描述 敏捷里面的概念,定义史诗,往下是feature
@allure.feature() 模块名称 功能点的描述,往下是story
@allure.story() 用户故事 用户固戍,往下是title
@allure.title 用例的标题 重命名HTML报告名称
@allure.testcase() 测试用例的链接地址 对应功能测试用例系统里的case
@allure.issue 缺陷 对应缺陷管理系统里面的链接
@allure.description() 用例描述 测试用例的描述
@allure.step() 操作步骤 测试用例的步骤
@allure.severity() 用例等级 blocker,critical,normal,minor,trivial
@allure.link() 链接 定义一个链接在测试报告展示
@allure.attachment() 附件 报告添加附件

image-20240806180710247


image-20240806180754787

import allure
import pytest
 
@allure.feature('test_success')
def test_success():
    """this test succeeds"""
    assert True
 
@allure.feature('test_failure')
def test_failure():
    """this test fails"""
    assert False
 
@allure.feature('test_skip')
def test_skip():
    """this test is skipped"""
    pytest.skip('for a reason!')
 
@allure.feature('test_broken')
def test_broken():
    raise Exception('oops')
 
if __name__ == '__main__':
    # pytest.main(["-s","allure-test.py"])
    '''
    -q: 安静模式, 不输出环境信息
    -v: 丰富信息模式, 输出更详细的用例执行信息
    -s: 显示程序中的print/logging输出
    '''
    pytest.main(['-s', '-q','test_allure02.py','--clean-alluredir','--alluredir=allure-results'])
    os.system(r"allure generate -c -o allure-report")
 

在报告中添加图片附件,文件附件

安装第三方依赖

pip install pytest-allure-adaptor

@allure.attach的用法

  1. allure.attach(body,name,attachment_type,extension)

    参数说明:

    • body: 要写入附件的内容
    • name: 附件名字
    • attachment_type: 附件类型,是allure.attachment_type 其中一种
    • extension: 附件的拓展名
  2. allure.attach.file(source,name,attachment_type,extension)

    参数说明:

    • source: 文件路径,相当于传一个文件
    • name: 附件名字
    • attachment_type:附件类型,是allure.attachment_type其中的一种
    • extension: 附件的拓展名

使用范例(添加文本文件)

# file_name: test_allure_attachments.py


import pytest
import allure


@pytest.fixture()
def attach_for_text():
    allure.attach(body="这是一段文本,setUp", name="test文本01", attachment_type=allure.attachment_type.TEXT)
    yield
    allure.attach(body="这是一段文本,teardown", name="test文本02", attachment_type=allure.attachment_type.TEXT)


def test_attachment_text(attach_for_text):
    pass


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

使用范例(添加图片和html)

# file_name: test_allure_attachments.py


import pytest
import allure


def test_mutiple_attachments():
    allure.attach.file("./pytest_study/image/pikaqiu.jpg", attachment_type=allure.attachment_type.JPG)

    allure.attach("<html><body><font color='red'>这是一段html</font></body></html>",
                  attachment_type=allure.attachment_type.HTML)


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