python接口测试框架选择之pytest+yaml+Allure

前言

2021年,部门的测试组尝试着用jmeter做简单的接口测试,使用工具就需要遵守工具的很多规则,并且jmeter对需要写辅助测试代码的场景不友好。2022年,改为用python写接口测试。在经过一段时间的摸索,团队选择pytest+yaml+Allure搭建自动化接口框架。

一、为什么选择pytest?

  • pytest完全兼容python自带的unittest
  • pytest让单元测试更简单,能很好的管理测试用例。
  • 对于实现接口测试的复杂场景,pytest的fixture、PDB等高阶用法都能实现需求。
  • 入门简单,对于代码基础薄弱的团队人员,也可以用pytest实现较简单的单个接口测试。
  • 社区活跃,遇到问题可以在网上找到解决方法。

pytest官方文档:

pytest: helps you write better programs — pytest documentation

pytest实战例子:修改用户信息

场景:测试修改用户昵称是否成功
涉及接口:用户登录接口、用户信息修改接口、用户信息接口。用户信息修改接口和用户信息接口需要上传登录接口下发的token字段
接口处理逻辑分析:

  1. 用户登录后拿到token,将token设为全局变量。
  2. 上传修改后的用户昵称到用户修改接口
  3. 请求用户信息接口,拿到昵称字段,判断是否为修改后的的昵称。

代码展示

import pytest
updata_name = "sunny"
expect_result = updata_name #期待修改后的昵称
class TestUpdataUserInfo:
    def setup_class(self):
        print("请求登录接口,获取到token")
        self.token = "token" #将token设为全局变量,这里暂时用"token"代替接口返回的token

    def teardown_class(self):
        # 此方法写请求获取用户信息接口,拿到用户昵称逻辑代码
        tokenStr = self.token  # 获取到token,用于请求修改用户信息接口
        print("请求用户信息接口,拿到昵称")
        nickName = "sunny"#假设接口拿到的昵称为"sunny"
        assert nickName==expect_result #校验是否为期待的昵称

    def test_update_userInfo(self):
        #此方法写上传修改后的用户昵称到用户修改接口的逻辑
        tokenStr = self.token #获取到token,用于请求修改用户信息接口
        print("token:"+tokenStr)
        print("上传需要修改的昵称")
if __name__ == '__main__':
    pytest.main(['-s', 'pytest-demo.py'])

二、为什么选择yaml?

  • 写法简洁易懂,视觉上也很舒适
  • yaml支持python,yaml+pytest实现数据分离很简便。
  • 配置有序,支持数组写法,数组中的元素可以是基本数据类型也可以是对象

实战例子:用yaml写测试数据

上文的pytest例子中,测试上传的昵称数据和期待修改后的昵称数据都是写在updataUserInfo.py文件,这种写法不方法管理,现在改为用yaml文件写测试数据。

代码展示

  1. 创建yaml文件:updataUserInfo.yaml,将测试数据写入
test:
  name: test case1
  updateName: "sunny"
  result:
    expectName: "sunny"
  1. 获取到yaml数据如下
{'test': {'name': 'test case1', 'updateName': 'sunny', 'result': {'expectName': 'sunny'}}}
  1. 获取到yaml文件里的数据,进行请求和校验
import pytest
import yaml

# updata_name = "sunny"
# expect_result = updata_name #期待修改后的昵称
class TestUpdataUserInfo(object):

    def setup_class(self):
        ##获取yaml文件里面的数据,
        with open("./updataUserInfo.yaml", 'r') as f:
            content = yaml.safe_load(f)
            print(content)
        self.update_name = content['test']['updateName']
        self.expect_name = content['test']['result']['expectName']

        print("请求登录接口,获取到token")
        self.token = "token" #将token设为全局变量,这里暂时用"token"代替接口返回的token

    def teardown_class(self):
        # 此方法写请求获取用户信息接口,拿到用户昵称逻辑代码
        tokenStr = self.token  # 获取到token,用于请求修改用户信息接口
        print("请求用户信息接口,拿到昵称")
        nickName = "sunny"#假设接口拿到的昵称为"sunny"
        assert nickName==self.expect_name #校验是否为期待的昵称

    def test_update_userInfo(self):
        #此方法写上传修改后的用户昵称到用户修改接口的逻辑
        tokenStr = self.token #获取到token,用于请求修改用户信息接口
        print("token:"+tokenStr)
        print("需要修改的值为:"+self.update_name)
        print("上传需要修改的昵称")


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

三、为什么选择Allure?

  • 生成高大上的测试报告,展示测试结果直观明了,利于向领导展示自动化测试成果。
  • 有失败用例截图、测试步骤和测试说明信息。方便测试人员查看测试结果。

pytest使用allure官方文档

Pytest

Allure测试报告展示

python接口测试框架选择之pytest+yaml+Allure_第1张图片

写在后面的话 

pytest+yaml+Allure对于搭建接口测试框架,是一个很不错的选择。即使团队中有代码基础相对薄弱的同事,可以先帮忙写yaml文件,也可以通过在yaml文件中补充用例,来使用写好的测试脚本,而不需要完全掌握代码。

你可能感兴趣的:(pytest接口测试,python,单元测试,开发语言,自动化,测试工具)