基于pytest/unittest实现接口自动化测试


一、jsonpath

jsonpath是类似于xpath的一种定位方式,用于接口返回的数据定位,通过jsonpath定位到的内容以list形式进行返回,如果表达式出现错误,则返回布尔类型值False。
1、jsonpath安装
命令行中输入:pip install jsonpath
2、jsonpath基本格式规范
$ 表示根节点,也是所有jsonpath表达式的开始
. 表示获取子节点
… 表示获取所有符合条件的内容
* 代表所有的元素节点
[] 表示迭代器的标示(可以用于处理下标等情况)
[,] 表示多个结果的选择
?() 表示过滤操作
@ 表示当前节点

3、jsonpath举例
代码(json_path下的demo.py)如下:

'''
1、返回list形式
2、出现错误,返回布尔类型
'''
import jsonpath
# 定位数据
data = {
    "store": {
        "book": [
            {
                "category": "reference",
                "author": "Nigel Rees",
                "title": "Sayings of the Century",
                "price": 8.95
            },
            {
                "category": "fiction",
                "author": "Evelyn Waugh",
                "title": "Sword of Honour",
                "price": 12.99
            },
            {
                "category": "fiction",
                "author": "Herman Melville",
                "title": "Moby Dick",
                "isbn": "0-553-21311-3",
                "price": 8.99
            },
            {
                "category": "fiction",
                "author": "J. R. R. Tolkien",
                "title": "The Lord of the Rings",
                "isbn": "0-395-19395-8",
                "price": 22.99
            }
        ],
        "bicycle": {
            "color": "red",
            "price": 19.95
        }
    },
    "expensive": 10
}

# 基于jsonpath获取元素
'''
$   根节点
..  所有符合条件的内容
.   子节点
*   所有的元素节点
[]  迭代器的表示(用于处理下标等情况)
[,] 多个结果的选择
?() 过滤操作
@   当前节点
'''
# 获取某个值
bike = jsonpath.jsonpath(data, 'store.bicycle.color')
# 返回列表
print(bike)
# 列表通过索引取值
print(bike[0])
# store下所有price的值
price = jsonpath.jsonpath(data, '$.store..price')
print(price)
# ,   连接操作符,连接第一个和第四个值
book_price = jsonpath.jsonpath(data, '$.store.book[0,3].price')
print(book_price)
# 过滤操作,过滤价格大于10的物品
book_1 = jsonpath.jsonpath(data, '$.store[..?(@.price>10)]')
print(book_1)

二、关键字封装

对接口测试的基本操作进行封装。
代码(api_key.py)如下:

import json
import jsonpath
import requests


class ApiKey:
    # get请求封装
    def get(self, url, params=None, **kwargs):
        return requests.get(url=url, params=params, **kwargs)

    # post请求封装
    def post(self, url, data=None, **kwargs):
        return requests.post(url=url, data=data, **kwargs)

    # jsonpath获取值封装
    def get_text(self, data, key):
        # json数据转换为字典
        json_data = json.loads(data)
        value = jsonpath.jsonpath(json_data, '$..{0}'.format(key))
        return value[0]

三、基于unittest实现接口自动化测试

1、测试用例
此处以登录请求为例,调用关键字进行post请求,数据以yaml文件形式存放。
代码(test_case_unittest01.py)如下:

import unittest

from ddt import ddt, file_data

from api_keyword.api_key import ApiKey


@ddt
class Test_ApiCase(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        cls.ak = ApiKey()

    @file_data('../data/user.yaml')
    def test_1(self, user, msg):
        # 请求接口
        url = 'http://39.98.138.157:5000/api/login'
        # 请求参数
        userInfo = {
            'username': user['username'],
            'password': user['password']
        }
        res = self.ak.post(url=url, json=userInfo)
        print(res.text)
        # 获取响应结果
        msg1 = self.ak.get_text(res.text, 'msg')
        print(msg)
        # 断言
        self.assertEqual(msg1, msg, msg='异常')


if __name__ == '__main__':
    unittest.main()

2、yaml文件
代码(user.yaml)如下:

-
  user:
    username: admin
    password: '123456'
  msg: success
-
  user:
    username: admin1
    password: '1234561'
  msg: 用户名或密码错误
-
  user:
    username: admin2
    password: '1234562'
  msg: 用户名或密码错误

四、基于pytest+allure实现接口自动化测试

1、pytest安装
pip install pytest

2、allure安装
解压压缩包
在这里插入图片描述
解压后将bin目录地址添加进环境变量
在这里插入图片描述
配置pytest的allure
命令行中输入:pip install allure-pytest

3、yaml数据
yaml与unittest的yaml一致

4、yaml数据解读
pytest没有unittest的ddt来接读yaml数据,因此需要额外添加一个模块来解读yaml文件。
代码(yaml_driver.py)如下:

import yaml


def load_yaml(path):
    file = open(path, 'r', encoding='utf-8')
    data = yaml.load(file, Loader=yaml.FullLoader)
    return data

4、关键字封装
相比于之前的key增加了@allure.step()来显示步骤,使测试报告更加清晰,代码(api_key.py)如下:

import allure
import json
import jsonpath
import requests


class ApiKey:
    @allure.step("发送get请求")
    def get(self, url, params=None, **kwargs):
        return requests.get(url=url, params=params, **kwargs)

    @allure.step("发送post请求")
    def post(self, url, data=None, **kwargs):
        return requests.post(url=url, data=data, **kwargs)

    @allure.step("获取返回结果字典值")
    def get_text(self, data, key):
        # 数据转换成json类型
        json_data = json.loads(data)
        value = jsonpath.jsonpath(json_data, '$..{0}'.format(key))
        return value[0]

5、conftest配置
进行初始配置,此处为了防止中文乱码出现进行配置。
代码(conftest.py)如下:

def pytest_collection_modifyitems(items):
    """
    测试用例收集完成时,将收集到的item的name和nodeid的中文显示在控制台上
    """
    for item in items:
        item.name = item.name.encode("utf-8").decode("unicode_escape")
        item._nodeid = item.nodeid.encode("utf-8").decode("unicode_escape")

6、测试用例
此处实现pytest下的两个测试用例的执行。
代码(test_case03_allure.py)如下:

import pytest
import allure
from pytest_demo.api_keyword.api_key import ApiKey
from pytest_demo.data_driver import yaml_driver


@allure.epic("接口测试")
class Test_ApiCase():
    @allure.story("01.登录接口测试")
    @pytest.mark.parametrize('userdata', yaml_driver.load_yaml('./data/user.yaml'),
                             ids=[
                                 "输入正确账号密码,登录成功",
                                 "输入错误账号密码,登录失败0",
                                 "输入错误账号密码,登录失败1"
                             ])
    def test_1(self, userdata):
        # 初始化工具类
        ak = ApiKey()
        # 请求接口
        url = 'http://39.98.138.157:5000/api/login'
        # 请求参数
        userInfo = {
            'username': userdata['user']['username'],
            'password': userdata['user']['password']
        }
        res = ak.post(url=url, json=userInfo)
        print(res.text)
        with allure.step("校验响应结果"):
            # 获取响应结果
            msg = ak.get_text(res.text, 'msg')
            print(msg)
            # 断言
            assert msg == userdata['msg']

    @allure.story("02.个人用户查询接口")
    def test_2_getuserinfo(self):
        ak = ApiKey()
        with allure.step("发送接口登录请求"):
            # 请求接口
            url = 'http://39.98.138.157:5000/api/login'
            # 请求参数
            userInfo = {
                'username': 'admin',
                'password': '123456'
            }
            res = ak.post(url=url, json=userInfo)
        with allure.step("发送个人查询接口请求"):
            url = 'http://39.98.138.157:5000/api/getuserinfo'
            headers = {
                'token': res.json()['token']
            }
            res1 = ak.get(url=url, headers=headers)
            print(res1.text)
        with allure.step("返回结果校验"):
            name = ak.get_text(res1.text, 'nikename')
            # 断言
            assert "风清扬1" == name

7、执行
执行入口代码(main_run.py)如下:

import os
import pytest


def run():
    pytest.main(['-v', './case/test_case03_allure.py',
                 '--alluredir', './result', '--clean-alluredir'])
    os.system('allure generate ./result/ -o ./report_allure/ --clean')


if __name__ == '__main__':
    run()

8、allure测试报告
在这里插入图片描述
浏览器打开html
在这里插入图片描述
在这里插入图片描述

安装包及源码下载地址

链接:https://pan.baidu.com/s/1t46vfl0W6YZG3yjK17iJpw
提取码:r0va
–来自百度网盘超级会员V2的分享

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Pytest是一个用于接口自动化测试的框架,它可以帮助您编写和组织测试,并提供一些有用的特性,如支持多种断言库、支持并行测试、提供丰富的报告等。 在设计Pytest接口自动化框架时,需要考虑以下几点: 1. 易用性:Pytest的语法简单易懂,易于编写和维护测试用例。 2. 可扩展性:Pytest支持插件机制,可以根据需要扩展其功能。 3. 可读性:Pytest报告中提供了详细的错误信息,方便定位问题。 4. 并行测试:Pytest支持并行测试,可以提高测试效率。 5. 支持多种断言库:Pytest支持多种断言库,如assert语句、基于内置库unittest的断言方法等。 通过考虑以上几点,可以设计出一个功能强大、易用性高的Pytest接口自动化框架。 ### 回答2: pytest接口自动化框架是一种用于编写、执行和管理接口自动化测试的开源测试框架。它基于Python语言,提供了丰富的功能和灵活的设计,使得接口测试变得简单、可维护和可扩展。 pytest的设计思想是"简单即美",它采用了直观的语法和简洁的规范,使得测试用例的编写变得简单易懂。通过使用pytest,我们可以使用简单的装饰器、断言和参数化等功能来编写清晰和可读性强的测试代码。 pytest框架还提供了丰富的插件生态系统,使得我们能够针对实际的测试需求灵活地扩展功能。例如,可以使用插件来生成测试报告、集成持续集成工具、通过参数化实现数据驱动等。这样,我们可以根据项目的需求选择并集成适合的插件,从而使得测试框架更加强大和易于扩展。 此外,pytest框架还支持并行执行测试用例、分布式测试、失败重试等特性,这些功能能够提高测试执行效率和稳定性。同时,其良好的Pytest的集成能力让我们能够简单地与其他工具(如Selenium、Appium等)进行集成,从而实现更全面的测试覆盖。 总而言之,pytest接口自动化框架设计简单易用,具有灵活扩展的特点,并且提供了丰富的特性和插件生态系统。这使得我们能够高效地编写、执行和管理接口自动化测试,从而提高软件质量和加速交付。 ### 回答3: pytest是一种简洁、可扩展且易于使用的Python测试框架,适用于各种类型的测试,包括接口自动化测试。以下是关于如何设计一个pytest接口自动化测试框架的一些建议。 1.项目结构:对于一个pytest接口自动化测试框架,建议按照功能模块或测试类别对测试用例进行组织并进行结构化管理。项目结构应该清晰,易于维护和扩展。 2.配置管理:使用pytest的配置文件pytest.ini或conftest.py来管理框架的配置信息,例如API地址、登录信息、数据库连接等。这样可以方便地配置不同环境下的接口测试。 3.用例设计和管理:用pytest的装饰器标记测试类和方法,例如@pytest.mark.parametrize、@pytest.mark.parametrize、@pytest.mark.skip等。此外,可以使用pytest的fixture机制来共享测试数据、测试环境等。 4.测试报告:pytest提供丰富的插件来生成美观的测试报告,如pytest-html、pytest-allure等。测试报告可以包含测试用例的执行结果、错误信息、日志、失败截图等,便于结果分析和问题定位。 5.异常处理:在接口自动化测试中,经常会遇到异常情况,如接口超时、响应错误等。可以使用pytest的try..except..finally来处理这些异常,并对异常进行记录和处理,以保证测试脚本的健壮性和稳定性。 6.数据管理:在接口自动化测试中,往往需要准备测试数据、验证响应数据等。可以使用pytest的参数化机制来管理测试数据,例如使用CSV、Excel或JSON文件来存储和读取测试数据。 7.断言机制:pytest提供了丰富的断言函数来判断测试结果是否符合预期,如assert、assertEqual、assertTrue等。可以根据接口的返回值进行断言,以验证接口功能是否正确。 总之,设计一个pytest接口自动化测试框架需要考虑项目结构、配置管理、用例设计、测试报告、异常处理、数据管理和断言机制等。合理使用pytest的功能和插件,能够提高测试效率、降低测试成本,并且易于维护和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值