Python接口自动化测试pytest+yaml+allure核心讲解(一)

        学习本章节目标:了解pytest+yaml+allure测试框架的基本内容,后续章节将使用代码分层的思想逐渐搭建我们测试框架,比如我们的请求封装、断言的封装、参数依赖、日志封装、数据库封装、​​​​​​等等

一、pytest测试框架优势:

  1. 不需要写setUP()、tearDown()这样的方法,可以直接开始测试;
  2. 可以自动识别测试用例,不需要向unittest一样将测试用例放进TestSuite里组装;
  3. pytest提供了丰富的测试夹具功能(Test Fixtures),包括参数化的功能,使得测试数据的组织和调试更加便捷;
  4. pytest测试框架支持错误重试;

二、安装

命令行:pip install -U pytest

安装成功后,通过以下命令查看安装的版本

pytest --version

三、执行测试用例脚本

  1. 1.pytest命令行常用运行参数

    1. 静态挑选:
      1. pytest . 执行所有当前文件夹及子文件夹下的测试用例
      2. pytest ../tests 执行根当前文件夹同级的tests文件夹及子文件夹下的测试用例
      3. pytest [.py文件绝对路劲] 按测试文件挑选并执行测试用例
    2. 动态挑选:
      1. pytest -m [...] 执行特定的测试用例
      2. 首先给测试用例打标签,需要在测试类、测试方法上添加装饰器,测试类本身及测试方法均可打标签;格式 : @pytest.mark.xxx
      3. 注:xxx是测试类,测试方法的标签名,在运行测试时,可以通过标签名来运行特定的测试用例,例如:
      4. pytest -m "mark1 and mark2" 运行带有mark1和mark2的标签测试用例;
      5. pytest -m "mark1 not mark2" 仅运行带有mark1标签的测试用例;
      6. pytest -m "mark1 or mark2" 运行带有mark1或mark2的标签测试用例;
    3. pytes -k [...] 执行用例包含“关键字”的用例
    4. pytest -q [...] 简化控制台输出
    5. pytest -v [...] 可以输出用例更加详细的执行信息
    6. pytest -s [...] 输出用例中的调试信息
  2. 2.pytest.main()运行

    1. pytest支持在程序中运行(一般情况在main.py)测试用例,需注意的是pytest参数必 须放在一个列表或者元祖里
      1. pytest.main([...])

用例通过示例:

用例执行失败示例 2 !=1:

3.运行状态码:

    1. 退出码 0 :所有测试均被收集并且运行全部成功;
    2. 退出码 1 : 测试虽已收集并且被运行,但有些测试用例失败了;
    3. 退出码 2 :测试运行被用户中断;
    4. 退出码 3: 运行测试时发生了内部错误;
    5. 退出码 4 :pytest命令行用法错误;
    6. 退出码 5 :没有收集到任何测试用例

4.忽略测试用例

    1. 使用 --ignore参数忽略测试文件,比如忽略test_order.py文件下所有测试用例 终端执行--> pytest --ignore = test_order.py
    2. 使用 --deselect 参数忽略测试文件
    3. 使用@pytest.mark.skip装饰器忽略测试文件

5.失败测试用例重试

背景:持续部署平台自动触发的测试,偶尔网络不稳定,会出现测试用例偶发失败,避免浪费调试成本,常常设置测试用例失败自动重试机制。

安装: pytest install -U pytest-rerunfailures

语法:--reruns Num ,其中num是重试的次数

执行:pytest ./test_order.py --reruns 1 #定义失败后重试两次

四、测试用例命名规范及查找规则

1).py测试文件必须以“test_”开头(或“_test”结尾)

2)测试方法必须以“test_”开头

3)测试类必须以Test开头,并且不能有init方法

4)测试用例默认查找规则:

①、未指定任何参数,从已配置的testpaths中查找,如果没有配置testpaths,则从当前目录开始查找;

②、查找这些目录及子目录下以test开头或者test结尾的.py文件;

③、在查找到.py文件中,继续查找测试类或者测试函数,如果是测试方法,则以test开头的测试方法即被认为是测试文件,如果是测试类,则以test开头的类方法即被认为是测试文件(测试类不能有__init__方法)

④、执行-->直接在根目录下输入 pytest + 回车。

五、测试用例执行顺序

(1)默认执行顺序-->@pytest.mark.run(order = n)

(2)使用pytest-ordering自定义顺序

import pytest

@pytest.mark.run(order = 5)
def test_one():
    expect = 2
    actual = 2
    assert expect == actual
@pytest.mark.run(order = 4)
def test_two():
    expect = 1
    actual = 1
    assert expect == actual
@pytest.mark.run(order = 2)
def test_pay():
    print('pay...')

@pytest.mark.run(order = 3)
def test_login():
    print('login...')
@pytest.mark.run(order = 1)
def test_order():
    print('oreder...')


--------------------执行结果---------------
C:\Users\钟坤\PycharmProjects\Api_test\venv>pytest -v test_one.py
===================== test session starts =====================
platform win32 -- Python 3.7.9, pytest-7.3.1, pluggy-1.0.0 -- d:\python\python37\python.exe
cachedir: .pytest_cache
metadata: {'Python': '3.7.9', 'Platform': 'Windows-10-10.0.19041-SP0', 'Packages': {'pytest': '7.3.1', 'pluggy': '1.0.0'}, 'Plugins': 
{'allure-pytest': '2.9.45', 'html': '3.2.0', 'metadata': '3.0.0', 'ordering': '0.6', 'rerunfailures': '10.2'}, 'JAVA_HOME': 'C:\\Progr
am Files\\Java\\jdk1.8.0_281'}
rootdir: C:\Users\钟坤\PycharmProjects\Api_test\venv
plugins: allure-pytest-2.9.45, html-3.2.0, metadata-3.0.0, ordering-0.6, rerunfailures-10.2
collected 5 items

test_one.py::test_order PASSED                                                                                                 [ 20%] 
test_one.py::test_pay PASSED                                                                                                   [ 40%] 
test_one.py::test_login PASSED                                                                                                 [ 60%] 
test_one.py::test_two PASSED                                                                                                   [ 80%] 
test_one.py::test_one PASSED                                                                                                   [100%] 

========== 5 passed in 0.03s ===========

六、常用断言类型

等于:== 不等于:!= 大于:> 小于:< 属于:in

不属于:not in 大于等于:>= 小于等于:<= 不是:is not

七、pytest数据驱动核心用法

        数据驱动是在自动化测试中处理测试数据的方式,通常采用的是测试数据与功能函数分离的方式,在自动化测试运行时,数据驱动框架会读取数据源中的数据,把数据作为参数传递到功能函数中,再根据数据的条数多次运行同一个功能函数,后面的内容将以yaml作为数据源来讲解。

        实现:使用pytest内置装饰器@pytest.mark.parametrize,一个参数以字符串的形式存在,它代表被测试函数接受的参数,如果有多个参数,则以逗号分隔;另一个参数用于保存测试数据,如果只有一组数据,则以列表的形式存在,如果有多组数据则以列表嵌套元祖的形式存在,例如[0,1]或者[(0,1),(23,5)]

# 单次循环

@pytest.mark.parametrize("a",["b"])

def test_parametrize(a):

print(a)

# 多次循环

@pytest.mark.parametrize("a,b",[("c","d"),("e","f")])

def test_parametrize(a,b):

print(a,b)

# 参数值为字典形式

@pytest.mark.parametrize("hero",[{"name":"张三"}])

def test_parametrize(hero):

print(hero["name"])

八、yaml文件格式

安装yaml:pip install pyyaml

安装配置文件:pip install configparser

 对象:即键值对的集合,又称为映射(mapping)/哈希(hashes)/字典(dictionary);

 数组:一组按次序排列的值,又称为序列(sequence)/列表(list);

 纯量:单个的、不可再分的值

对象:

key:

    child-key: value

    child-key2: value2

#等于-->{"key": {"child-key": "value","child-key2": "value2"}



#数组:

key:

    - A

    - B

    - C

#等于-->{"key": [A,B,C]}

#组合:

key:

    - child-key: value

    child-key2: value2

#等于-->{"key": [{"child-key": "value","child-key2": "value2"}]}

#数组嵌套:

key:

    -

        - A

        - B

        - C

等于-->{"key": [[A,B,C]]}

九、Allure 测试报告

安装:pip install pytest-html

作用:Allure测试报告非常美观,提供各种维度的测试分析,Allure测试报告的总览页面如下:

了解Allure测试报告各个装饰器的作用

添加项目信息:

report目录下创建environment.properties文件,配置环境信息,例如:

运行:allure serve ./report ,运行后,点击网址,可打开测试报告

        今日的分享到此结束了,后续章节中将逐步搭建我们的测试框架,感兴趣的的同学可点赞+收藏,持续更新,最后在分享四个常用的网站,大家可提前熟悉,后面的讲解会持续使用这几个网站:

1.yaml文件格式校验:https://www.bejson.com/validators/yaml_editor/
2.json格式化校验:https://www.bejson.com/json/format/
3.在线jsonpath解释器:https://www.lddgo.net/string/jsonpath
4.文心一言:https://yiyan.baidu.com/

  • 12
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值