接口自动化测试-pytest框架

1. 使用pytest完成接口自动化

1.1. pytest 简介

pytest 是 Python 的一款开源测试框架。

主要特点:

  • 简单灵活,文档丰富;
  • 能够支持单元测试、功能测试、接口自动化测试等;
  • 具有众多第三方插件,且可以自定义扩展;
  • 支持参数化,可控制测试用例的粒度;
  • 可以很好的和 CI 工具结合,例如 Jenkins 。

1.2. 使用参考

1.2.1. 命名约束

  • 测试文件以"test_"开头/以"_test"结尾
  • 测试类以"Test"开头,并且不能带有 __init__ 方法
  • 测试函数以"test_"开头

默认情况下,pytest 查找当前目录下所有以 test 开始或结尾的 Python 脚本,并执行文件内的所有以 test 开始的函数和方法。

1.2.2. 运行

在终端按需输入以下命令来运行 case:

  • 运行所有 case :pytest 
  • 运行指定 case :pytest testCase/test_demo1.py
  • 运行关键字匹配的 case :pytest -k “表达式”
  • 运行标记匹配的 case :pytest -m "标记"
  • 运行后控制台展示详细信息:pytest -v
  • ...

1.2.3. 断言assert

pytest 中可以使用 Python 原生的断言语句 assert 来进行验证。

常用:

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

可以指定断言失败的返回信息,举例如下:

assert response["result_code"] == expected["response"]["result_code"], "实际的返回结果是:{}".format(response["result_code"])

1.2.4. fixture

fixture 是 pytest 特有功能,目的是提供一种手段去运行最基本的、重复的测试内容,是将测试前后的预备工作、清理工作的代码分离出核心测试逻辑的一种机制。通常用来对测试方法、测试函数、测试类和整个测试文件进行初始化或还原测试环境。

@pytest.fixture(scope="function", params=None, autouse=False, ids=None, name=None)

  • scope:作用域,(

    function:方法,默认为function

    class:类

    module:.py文件

    session:会话)

  • params:可选的参数列表,可使多个参数调用fixture功能
  • autouse:是否默认调用该fixture,默认为False
  • ids:每个字符串id的列表
  • name:装饰器名字

1.2.4.1. fixture 作为函数参数

可以通过使用 @pytest.fixture 注册成为一个 fixture 函数,来为测试方法提供一个 fixture 对象。 

如下图所示,connect_mysql_uds 函数被注册成了一个 fixture 函数,在 test_query_couplist 方法中可以直接被作为参数使用。

1.2.4.2. 在 conftest.py 中管理 fixture

若希望多个测试文件共享fixture,可以在某个公共目录下建立一个conftest.py文件,将fixture放在其中。

  • conftest.py文件用于存放fixture的配置文件,文件名是固定的
  • conftest.py是层级共享的,存放位置决定了其作用的范围
  • conftest.py文件无需被import,会自动执行

1.2.4.3. 执行顺序

(作用范围从大到小的排序:session>module>class>function)

  • 较高作用范围的 fixture(例如session会话级)比低范围的 fixture(例如function函数级或class类级)优先执行。
  • 相同范围的 fixture 对象的按引入的顺序或依赖关系按顺序调用

1.2.4.4. yield

yield 语句之后的所有代码都视为 teardown 代码。

举例,如下图所示,整个会话结束后,会打印出”关闭数据库”的语句。 

1.2.5. mark

1.2.5.1. 标记和分类用例

@pytest.mark.level

用法步骤:

a. 先在 pytest.ini 文件中对标签进行注册

b. 对用例进行标记

@pytest.mark.P0

c. 运行指定标记的用例

在终端输入: pytest -m "P0"

1.2.5.2. 标记跳过用例

无条件跳过:

@pytest.mark.skip(reason="跳过原因描述")

在指定条件下跳过:

@pytest.mark.skipif(condition, reason="跳过原因描述")

1.2.5.3. 标记用例为预期失败

@pytest.mark.xfail(reason="预期失败描述")

对于功能未完成或已知有问题的用例,可以用 xfail 标记,这样即使断言失败,也不会影响其他测试用例的的执行。

执行 case 后,控制台中显示:

  • XFAIL:表示预期失败,实际也失败
  • XPASS:表示预期失败,实际运行没有失败

1.2.5.4. 参数化

我们进行接口测试时,往往很多时候操作步骤都是一样的,只有数据不一样,这时候就可以使用参数化功能,来减少代码冗余。

@pytest.mark.parametrize(argnames, argvalues, ids=None)

  • argnames:参数名称,字符串格式
  • argvalues:参数值列表,列表格式
  • ids:用例的 ID ,字符串列表格式

举例,如下图所示,装饰器会自动对 list_params 解包并赋值给装饰器的第一参数。装饰器的第一个参数中逗号分隔的变量可以作为测试方法的参数,在测试方法内就可以直接获取这些变量的值。

1.2.6. Allure

Allure 是一种灵活、轻量级、多语言的测试报告工具,以简洁精美的 web 报告形式展示。

Python 中有一个第三方库:allure-pytest,用于连接 pytest 和 allure ,使它们可以更好的配合使用。

Allure的常用用法:

使用方法

说明

@allure.epic()描述史诗,即未拆解的story
@allure.feature()描述功能模块
@allure.story()描述用户故事
@allure.title()描述用例标题
@allure.step()描述用例步骤
@allure.severity()描述用例等级:blocker,critical,normal,minor,trivial

报告的主要页面介绍:

  • Graphs

该页面展示本次执行结果的统计信息,比如执行结果成功失败比例、测试用例等级分布、用例执行时间等。

  • Behaviors

该页面根据代码中设定的 @allure.feature()、@allure.story() 等来展示用例执行的结果,这里可以看到用例执行的详细信息。

  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值