前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >pytest api做自动化测试

pytest api做自动化测试

作者头像
赵云龙龙
发布2021-05-10 15:31:20
6950
发布2021-05-10 15:31:20
举报
文章被收录于专栏:python爱好部落python爱好部落

我们在做api测试的时候,如果只要测试单个接口,可以用httprunner。 这个工具的思维我们可以借鉴一下。 如果我们想灵活的应用呢,可以自己用数据驱动的方式,来实现自己的自动化框架。 用pytest就可以实现。 首先我们将charles的har包转换成yaml文件。 用命令

代码语言:javascript
复制
har2case test_login_demo.har -2y

就可以得到类似的这个文件:

代码语言:javascript
复制
teststeps:
-   name: /services/api/mobile/service/appversion
    request:
        headers:
            Accept-Encoding: gzip
            Connection: Keep-Alive
            Content-Length: '77'
            Content-Type: application/json; charset=UTF-8
            Host: stg-ec.ef.com.cn
            User-Agent: Android/SmartEnglish:2.1.14(okhttp/4.8.1)
        json:
            serviceRequest:
                appVersion: 2.1.14
                platform: Android
                productId: 4
        method: POST
        url: https:///services/api/mobile/service/appversion
    validate:
    -   eq:
        - status_code
        - 200
    -   eq:
        - headers.Content-Type
        - application/json; charset=utf-8

将这个文件提取出来:

代码语言:javascript
复制
import yaml
import os
def get_test_data(filepath):

    if os.path.exists(filepath):

        case = []  # 存放测试用例名
        requests = []  # 存放http请求对象
        validate = []  # 存放断言
        with open(filepath, encoding='utf-8') as f:
            data = yaml.load(f.read(), Loader=yaml.SafeLoader)['teststeps']
            print(data)
            for i in range(len(data)):
                case.append(data[i]['name'])
                requests.append(data[i]['request'])
                validate.append(data[i]['validate'])
            params = zip(case, requests, validate)
            return case, params
    else:
        print("file not exist!")
cases, parameters = get_test_data('C:\\work\\code\\python\\oneapp.yaml')

好了,我们可以写case了

代码语言:javascript
复制
from apitest import get_test_data
import pytest
import requests
import allure

cases, parameters = get_test_data('C:\\work\\code\\python\\oneapp.yaml')

list_params = list(parameters)


class TestApi():
    @pytest.fixture(scope="session")
    def get_cookie_session(self):
        url = "https://services/api/mobile/service/login"
        json = {
            "serviceRequest": {
                "userName": "stestc13035",
                "password": "1",
                "appVersion": "2.1.14",
                "platform": "Android",
                "productId": 4
            }
        }
        res = requests.session().post(url=url, json=json, verify=False)
        token = res.json()["serviceResponse"]["token"]
        session = res.json()["serviceResponse"]["sessionId"]
        yield token, session

        # return cookie, session

    @pytest.mark.parametrize('case, parameters,ids', list_params, ids=cases)
    def test_each_api(self, case, parameters, ids, get_cookie_session):
        token, session = get_cookie_session
        with allure.step("test the case {}".format(case)):
            header = parameters["headers"]
            json = parameters["json"]
            parameters["json"]["serviceRequest"]["token"] = token
            parameters["json"]["serviceRequest"]["sessionId"] = session
            method = parameters["method"]
            url = parameters["url"]

            res = requests.request(method, url=url, headers=header, json=json, verify=False)
            assert res.status_code == 200


import os

if __name__ == "__main__":
    pytest.main(['-s', '-q', 'test_oneapp_api.py', "--alluredir", "./xml", '--reruns', '1', '--reruns-delay', '1'])
    os.system("allure serve ./xml")

这样就可以运行起来了,运行的报告如下: 总体如下:

具体如下:

这样一个很简单的框架就搭建起来了。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-05-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 python粉丝团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档