轻松易行完成接口自动化测验(基于python)彩世界彩
分类:彩世界彩票注册平台官网

4).参数的完整性

调用HTTP登陆接口示例

from pithy import request

@request(url='http://httpbin.org/post', method='post')
def post(self, key1='value1'):
    """
    post method
    """
    data = {
        'key1': key1
    }
    return dict(data=data)

# 使用
response = post('test').to_json()     # 解析json字符,输出为字典
response = post('test').json          # 解析json字符,输出为字典
response = post('test').to_content()  # 输出为字符串
response = post('test').content       # 输出为字符串
response = post('test').get_cookie()  # 输出cookie对象
response = post('test').cookie        # 输出cookie对象

# 结果取值, 假设此处response = {'a': 1, 'b': { 'c': [1, 2, 3, 4]}}
response = post('13111111111', '123abc').json

print response.b.c   # 通过点号取值,结果为[1, 2, 3, 4]

print response('$.a') # 通过object path取值,结果为1

for i in response('$..c[@>3]'): # 通过object path取值,结果为选中c字典里大于3的元素
    print i

首先是变量和数据类型,其次列表、字典以至 Json 的黄金年代对甩卖,再者就是循环 判定以致函数或类那个内容。 在那之中的重大:

端详接口

  • 请求url
/info
  • 呼吁方法
get
  • 请求cookies
参数名称 参数类型 参数说明
session String session
  • 响应消息
参数名称 参数类型 参数说明
code Integer 结果code
msg String 结果信息
data String 数据信息

3.Jenkins 不休集成 首先打算好 Jenkins 持续集成的服务器,然后去创制二个任务,创设完任务去 配置供给的信息举例git 源,然后实践的下令塑造后的有的操作,举例发邮件 等等创建任务的时候假设用 git 源,用 ssh 这种艺术的话,供给去设 sshkey,然后 是设置这么些任务的施行效能,日常是有两种办法:第后生可畏种周期举办项目营造, 它不关切你代码源是不是是有变动的,它是依照设定的年华期限去试行设定的任务,第三种是 icm 这种样式,它是定时检查源代码的改良,如若源代码有变动, 它正是推行设定的天职,要是源代码未有变动则不奉行,还应该有其余的方 式,都 要依靠实际必要去筛选相应的章程。

一、简介

正文从三个轻巧的报到接口测验出手,一步步调动优化接口调用姿势,然后轻便探究了须臾直接口测验框架的要点,最终介绍了弹指间我们当下正值使用的接口测量试验框架pithy。期望读者能够经过本文对接口自动化测验有叁个光景的询问。

3).接口完整性正是它的层级关系是或不是科学

更加多使用方法

点击查看


  1. 接口文书档案的预备

测量试验工具类

其生机勃勃能够依据项目情状去做,力求简化一些类库的施用,数据库访谈、日期时间、体系化与反种类化等数码管理,恐怕封装一些常用操作,如自由生成订单号等等,以增进脚本编辑撰写功效。

1、接口文书档案

卷入重复操作

来,我们再整合治理一下大家的须要:

  • 首先,不想去重复做拼接url的操作
  • 下一场,不想每一回都去手工业打字与印刷日志
  • 不想和requests session打交道
  • 只想定义好参数就直接调用

咱俩先看一下完成后,脚本可能是如何:

class DemoApi(object):

    def __init__(self, base_url):
        self.base_url = base_url

    @request(url='login', method='post')
    def login(self, username, password):
        """
        登录接口
        """
        data = {
            'username': username,
            'password': password
        }

        return {'data': data}

    @request(url='info', method='get')
    def info(self):
        """
        详情接口
        """
        pass

调用登陆接口的日志

******************************************************
1、接口描述
登录接口

2、请求url
http://127.0.0.1:5000/login

3、请求方法
post

4、请求headers
{
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Connection": "keep-alive",
    "User-Agent": "python-requests/2.7.0 CPython/2.7.10 Darwin/16.4.0"
}

5、body参数
{
    "password": "123456",
    "username": "admin"
}

6、响应结果
{
    "code": 200,
    "msg": "success"
}

在此边,大家接收python的装饰器功用,把公家本性封装到装饰器中去落到实处。未来感觉非常多了,没什么多余的东西了,我们能够小心于入眼参数的布局,剩下的正是何等去贯彻那些装饰器了,大家先理一下思路:

  • 获得装饰器参数
  • 收获函数/方法参数
  • 把装饰器和函数定义的参数合併
  • 拼接url
  • 拍卖requests session,有则应用,无则新生成一个
  • 建构全部参数,发送http央求并打印日志

因篇幅节制,源码不再列出,有意思味的同室能够查阅已经落实的源代码

源代码查看地址:
https://github.com/yuyu1987/pithy-test/blob/master/pithy/api.py


1、央求的接口 2、诉求的章程 3、请求 的参数 4、央求的回来结果

为什么要做接口自动化测量试验?

在脚下互连网付加物迭代频仍的背景下,回归测验的时辰越来越少,很难在每一种迭代都对具备作用做完全回归。但接口自动化测量检验因其实现轻松、维护开销低,轻巧进步覆盖率等本性,越来越受重视。

5).支持再次实施破产的 case

八、pithy测量试验框架介绍

pithy意为精简有力的,意在简化自动化接口测量试验,提升测量检验功效

  • 品种地址:点击查阅
  • 帮扶文档:点击查阅

当前贯彻的法力如下:

  • 大器晚成键生成测量检验项目
  • http client封装
  • thrift接口封装
  • 简化配置文件使用
  • 优化JSON、日期等工具使用

编辑测验用例推荐使用pytest,pytest提供了广大测量检验工具以至插件,能够满足超越50%测量检验要求。

3、对作业的耳濡目染程度

生龙活虎键生成测量试验项目

>>>  pithy-cli init
请选择项目类型,输入api或者app: api
请输入项目名称,如pithy-api-test: pithy-api-test
开始创建pithy-api-test项目
开始渲染...
生成 api/.gitignore                   [√]
生成 api/apis/__init__.py             [√]
生成 api/apis/pithy_api.py            [√]
生成 api/cfg.yaml                     [√]
生成 api/db/__init__.py               [√]
生成 api/db/pithy_db.py               [√]
生成 api/README.MD                    [√]
生成 api/requirements.txt             [√]
生成 api/test_suites/__init__.py      [√]
生成 api/test_suites/test_login.py    [√]
生成 api/utils/__init__.py            [√]
生成成功,请使用编辑器打开该项目

变化项目树

>>> tree pithy-api-test
pithy-api-test
├── README.MD
├── apis
│   ├── __init__.py
│   └── pithy_api.py
├── cfg.yaml
├── db
│   ├── __init__.py
│   └── pithy_db.py
├── requirements.txt
├── test_suites
│   ├── __init__.py
│   └── test_login.py
└── utils
    └── __init__.py

4 directories, 10 files

做接口测验前的备选干活

保持cookies&增加log信息

利用requestsCurry的同三个Session对象(它也会在同二个Session 实例发出的保有央浼之间保持 cookie),就可以减轻地点的主题材料,示例代码如下:

#!/usr/bin/python
# coding=utf-8
import unittest
from pprint import pprint
from requests.sessions import Session
try:
    from urlparse import urljoin
except ImportError:
    from urllib.parse import urljoin


class DemoApi(object):

    def __init__(self, base_url):
        self.base_url = base_url
        # 创建session实例
        self.session = Session()

    def login(self, username, password):
        """
        登录接口
        :param username: 用户名
        :param password: 密码
        """
        url = urljoin(self.base_url, 'login')
        data = {
            'username': username,
            'password': password
        }

        response = self.session.post(url, data=data).json()
        print('n*****************************************')
        print(u'n1、请求url: n%s' % url)
        print(u'n2、请求头信息:')
        pprint(self.session.headers)
        print(u'n3、请求参数:')
        pprint(data)
        print(u'n4、响应:')
        pprint(response)
        return response

    def info(self):
        """
        详情接口
        """
        url = urljoin(self.base_url, 'info')
        response = self.session.get(url).json()

        print('n*****************************************')
        print(u'n1、请求url: n%s' % url)
        print(u'n2、请求头信息:')
        pprint(self.session.headers)
        print(u'n3、请求cookies:')
        pprint(dict(self.session.cookies))
        print(u'n4、响应:')
        pprint(response)
        return response


class TestLogin(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        cls.base_url = 'http://127.0.0.1:5000'
        cls.username = 'admin'
        cls.password = '123456'
        cls.app = DemoApi(cls.base_url)

    def test_login(self):
        """
        测试登录
        """
        response = self.app.login(self.username, self.password)
        assert response['code'] == 200
        assert response['msg'] == 'success'

    def test_info(self):
        """
        测试获取详情信息
        """
        self.app.login(self.username, self.password)
        response = self.app.info()
        assert response['code'] == 200
        assert response['msg'] == 'success'
        assert response['data'] == 'info'

居功至伟告成,我们把八个有关接口调用封装到多个类中,使用同多少个requests Session实例来维持cookies,並且在调用进度中打字与印刷出了日记,大家具备目的都贯彻了,但再看下脚本,又会觉获得不太安适,在每一种方法里,都要写贰回print 1、2、3... 要拼url、还要相当多细节等等,但事实上大家确实须要做的只是拼出首要的参数(url参数、body参数大概传播headers新闻卡塔尔,行不行只需定义必需的音讯,然后把别的共性的事物都卷入起来吧,统大器晚成置于一个地方去处理?

2). 无接口文书档案使用抓包工具获取新闻

使用

7).具备好多第三方插件,並且能够自定义扩张

五、编写接口测验

2).接口再次回到的第意气风发参数的自笔者商量

测量检验思路

  • 使用requests [应用链接]库模拟发送HTTP央浼
  • 使用python典型Curryunittest写测量试验case

2、http 左券的学问

六、优化

测量检验从业者学习 python 应该调整的剧情:

二、引言

1.巡回判断以至字典这块是关键

签到接口

  • 请求url
 /login
  • 号召方法
 post
  • 呼吁参数
参数名称 参数类型 参数说明
username String 登录名称
password String 登录密码
  • 响应音讯
参数名称 参数类型 参数说明
code Integer 结果code
msg String 结果信息

5).特殊参数的反省

本子达成

#!/usr/bin/python
# coding=utf-8
import requests
import unittest


class TestLogin(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        cls.login_url = 'http://127.0.0.1:5000/login'
        cls.info_url = 'http://127.0.0.1:5000/info'
        cls.username = 'admin'
        cls.password = '123456'

    def test_login(self):
        """
        测试登录
        """
        data = {
            'username': self.username,
            'password': self.password
        }

        response = requests.post(self.login_url, data=data).json()

        assert response['code'] == 200
        assert response['msg'] == 'success'

    def test_info(self):
        """
        测试info接口
        """

        data = {
            'username': self.username,
            'password': self.password
        }

        response_cookies = requests.post(self.login_url, data=data).cookies
        session = response_cookies.get('session')
        assert session

        info_cookies = {
            'session': session
        }

        response = requests.get(self.info_url, cookies=info_cookies).json()
        assert response['code'] == 200
        assert response['msg'] == 'success'
        assert response['data'] == 'info'

总括首先情状的预备,其次做接口自动化的指标,基于指标设计测量检验用例,设计完 测验用例分明重返结果证实的档案的次序,那么些都规定好后遵照 pytest 模版写用例就可以了。

接口消息

6).帮助运营由 nose, unittest 编写的测验 case

安装

pip install pithy-test
pip install pytest

1). 接口文书档案起码含有八个部分

干什么要自个儿写框架呢?

利用requets unittest相当轻易完毕接口自动化测量试验,而且requests的api已经特别人性化,非常简单,但经过包装今后(极度是指向性公司内一定接口卡塔 尔(英语:State of Qatar),再加多对部分常用工具的包裹,能够进一层进步业务脚本编辑撰写功能。


  1. 进展接口自动化 前提:显然举办的指标,是要做单接口的监察依然交易流程的监督,可能是在 测验情形把全数接口都覆盖,又或然接口自动化测量检验是为着线上劳动仍然是了 线下测量检验情形服务 比方:将来要做的是上单接口的监察,监察和控制的目标只为了有限支撑接口的可用性, 申明那几个接口是可用的就能够了。所以依赖分歧的目标设计接口测量试验是有例外 的测试点的,比方单接口的监察,只必要统筹正向的用例就足以了,注明接口 是通的就能够了。因为线上做太多的测量检验轻巧生出特别多的脏数据。若是在测量试验遭遇要做每种接口的全覆盖,那么每种接口的正向用例,万分用例都以要覆 盖到的,假诺用例特别多要依照效果与利益的宗旨来规定部分接口用例的限量选取三个最优的集纳做为接口用例的集结注意点:每种用例尽大概独立实行,如若急需有个别缓存数据要么写死照旧长时间有效的,幸免一个接口的用例须求借助别的接口,那样做的自始自终的经过是只要被注重的接口失败了可避防止正视的接口施行是没戏的 最终:情状、接口文书档案、用例的统筹的集合以致接口的指标都明确后得以起头写了

  2. 实质上接口自动化代码编写表明 首先根据接口文书档案找到央求的 url 及接口地址加上 host 第三盘部须要的参数 第四盘部如若有头文件就把头文件放进来,若无头文件可以忽视第四发出恳求 第五对相应结果开展推断 相应结果判定关怀的六局地:

优化JSON、字典使用

# 1、操作JSON的KEY
from pithy import JSONProcessor
dict_data = {'a': 1, 'b': {'a': [1, 2, 3, 4]}}
json_data = json.dumps(dict_data)
result = JSONProcessor(json_data)
print result.a     # 结果:1
print result.b.a   # 结果:[1, 2, 3, 4]

# 2、操作字典的KEY
dict_data = {'a': 1, 'b': {'a': [1, 2, 3, 4]}}
result = JSONProcessor(dict_data)
print result.a     # 1
print result.b.a   # [1, 2, 3, 4]

# 3、object path取值
raw_dict = {
    'key1':{
        'key2':{
            'key3': [1, 2, 3, 4, 5, 6, 7, 8]
        }
    }
}

jp = JSONProcessor(raw_dict)
for i in jp('$..key3[@>3]'):
    print i

# 4、其它用法
dict_1 = {'a': 'a'}
json_1 = '{"b": "b"}'
jp = JSONProcessor(dict_1, json_1, c='c')
print(jp)

8).方便的和不断集成工具集成

七、扩展

http接口央求的架子大家定义好了,我们还能够做些什么吗?

  • [x] 非HTTP合计接口
  • [x] 测量试验用例编写
  • [x] 配置文件管理
  • [x] 测量检验数据管理
  • [x] 工具类编写
  • [x] 测验报告生成
  • [x] 持续集成
  • [x] 等等等等

急需做的也许挺多的,要做什么样绝不做什么样,也许先做哪些,作者感觉能够依附以下几点去看清:

  • 是或不是有利于加强协会分娩成效
  • 是还是不是方便人民群众提升测量试查验质量量
  • 有未有现存的车轱辘能够用

上边就几项重大的点进展一下验证,限于篇幅,不再实行了

3).扶助参数化

测量检验报告

这些理应是大家最关切的了,毕竟那是测量检验专业的现身;
近期python的主流单元测验框均有report插件,由此不提议和谐再编辑,除非有非常供给的。

  • pytest:推荐使用pytest-html和allure pytest

  • unittest:推荐使用HTMLTestRunner

python 做接口自动化须求策画的内容

一再集成

继续不停集成推荐使用Jenkins,运转条件、依期职务、触发运转、邮件发送等后生可畏多级成效均可以在Jenkins上达成。

彩世界彩票注册平台官网 1

三、境遇筹划

有限支撑本机已设置python2.7以上版本,然后安装如下库

pip install flask
pip install requests

背后我们会接受flask写二个用来测量试验的接口,使用requests去测量检验


3). 接口测验包括接口自动化和手工业接口测验

测验用例编写

推荐固守如下法则:

  • 原子性:每一种用例保持独立,相互不耦合,以收缩苦闷;
  • 专一性:二个用例应该小心于验证生机勃勃件事情,实际不是做过多政工,三个测量检验点不要再一次认证;
  • 稳定性:绝大多数用例应该是可怜平稳的,也正是说不会时不时因为除景况以外的因素挂掉,因为假若在五个测验项目中有许多不牢固的用例的话,测量检验结果就无法很好的反射项目品质;
  • 分类清晰:有相关性的用例应写到叁个模块或叁个测量检验类里,那样做即方便维护,又拉长了报告的可读性;

2).能够援救轻巧的单元测量试验和复杂性的功力测量试验

接口代码

#!/usr/bin/python
# coding=utf-8
from flask import Flask, request, session, jsonify

USERNAME = 'admin'
PASSWORD = '123456'

app = Flask(__name__)
app.secret_key = 'pithy'


@app.route('/login', methods=['GET', 'POST'])
def login():
    error = None
    if request.method == 'POST':
        if request.form['username'] != USERNAME:
            error = 'Invalid username'
        elif request.form['password'] != PASSWORD:
            error = 'Invalid password'
        else:
            session['logged_in'] = True
            return jsonify({'code': 200, 'msg': 'success'})
    return jsonify({'code': 401, 'msg': error}), 401


@app.route('/info', methods=['get'])
def info():
    if not session.get('logged_in'):
        return jsonify({'code': 401, 'msg': 'please login !!'})
    return jsonify({'code': 200, 'msg': 'success', 'data': 'info'})

if __name__ == '__main__':
    app.run(debug=True)

末尾试行如下命令

python demo.py

一倡百和如下

 * Running on http://127.0.0.1:5000/ (Press CTRL C to quit)
 * Restarting with stat

世家能够见见服务业已起起来了

6).效任性的自己商量 扫下方二维码 电商项目直播

九、总结

在本文中,大家以拉长脚本开拓作用为前提,一步一步塑造了一个简便的测量试验框架,但因水平所限,并未有提到测验数据起始化清理、测量试验中怎么样MOCK等话题,前路仍旧任重(Ren Zhong卡塔 尔(阿拉伯语:قطر‎而道远,希望给大家叁个启示,美中不足还望多多教导,特别多谢。


参考:

[1] requests:http://www.python-requests.org/en/master/
[2] thriftpy:http://thriftpy.readthedocs.io/en/latest/
[3] objectpath:http://objectpath.org/
[4] pytest:https://docs.pytest.org

  1. python3 第三方库 requests pytest 框架,供给的条件都要未雨筹划粮草先行好 选用pytest 那几个框架的原因

测量试验数据管理

广大的措施有写在代码里、写在配备文件里(xml、yaml、json、.py、excel等)、写在数据Curry等,该处未有啥样好引入的,建议依照个人喜好,怎么方便怎么来就足以。


好啊,以上便是自己的享用,假如您跟本人同样都喜悦python,也在读书python的道路上跑步,应接您步入python学习群:839383765 群内每一日都会享用最新职业资料,分享python免费课程,协同沟通学习,让学习变大器晚成种习贯!

包裹接口调用

写完这些测试登入脚本,你或者会发觉,在全体项目标测量试验进度,登入恐怕不断用到一遍,假诺老是都如此写,会不会太冗余了? 对,确实太冗余了,上面做一下简短的包装,把登入接口的调用封装到一个情势里,把调用参数暴漏出来,示例脚本如下:

#!/usr/bin/python
# coding=utf-8
import requests
import unittest
try:
    from urlparse import urljoin
except ImportError:
    from urllib.parse import urljoin


class DemoApi(object):

    def __init__(self, base_url):
        self.base_url = base_url

    def login(self, username, password):
        """
        登录接口
        :param username: 用户名
        :param password: 密码
        """
        url = urljoin(self.base_url, 'login')
        data = {
            'username': username,
            'password': password
        }

        return requests.post(url, data=data).json()

    def get_cookies(self, username, password):
        """
        获取登录cookies
        """
        url = urljoin(self.base_url, 'login')
        data = {
            'username': username,
            'password': password
        }

        return requests.post(url, data=data).cookies

    def info(self, cookies):
        """
        详情接口
        """
        url = urljoin(self.base_url, 'info')
        return requests.get(url, cookies=cookies).json()


class TestLogin(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        cls.base_url = 'http://127.0.0.1:5000'
        cls.username = 'admin'
        cls.password = '123456'
        cls.app = DemoApi(cls.base_url)

    def test_login(self):
        """
        测试登录
        """
        response = self.app.login(self.username, self.password)
        assert response['code'] == 200
        assert response['msg'] == 'success'

    def test_info(self):
        """
        测试获取详情信息
        """
        cookies = self.app.get_cookies(self.username, self.password)
        response = self.app.info(cookies)
        assert response['code'] == 200
        assert response['msg'] == 'success'
        assert response['data'] == 'info'

OK,在此二个版本中,大家不止在把登陆接口的调用封装成了三个实例方法,完毕了复用,並且还把host(self.base_url卡塔 尔(英语:State of Qatar)提取了出来,但难点又来了,登入之后,登入接口的http响应会把session以 cookie的款式set到顾客端,之后的接口都会接受此session去央求,还恐怕有,正是在接口调用进度中,希望得以把日志打字与印刷出来,以便调节和测量试验可能出错开上下班时间翻看。
好啊,大家再来改生龙活虎版。

1).特别轻巧上手,入门轻巧,文书档案充足,文书档案中有相当多实例能够参谋行当动态、本领沟通、

四、测验接口考虑

上面选用flask达成七个http接口,多个登入,别的叁个询问详细情况,但要求报到后手艺够,新建一个demo.py文件(注意,不要选用windows记事本卡塔 尔(英语:State of Qatar),把下部代码copy进去,然后保留、关闭

1).重临的状态码检查

2.函数和类,类的学习这块要花相当多日子去读书它的集成、封装、多态等,那是叁个不休累积的长河,先把前边的东西弄精通了,然后去学如何用函数的情势去管理这一个比较根底的剧情 python 大纲学习内容详见另意气风发篇文章扫下方二维码 电商项目直播 二、python 接口自动化 API 测验不一致于 UI 自动化测量试验,它最首要关切系统架构的工作逻辑层,或许说多个也许两模块的逻辑关系,重点在逻辑关系。

4).推行测验进程中得以将一些测验跳过,可能对一些预期退步的 case 标识成退步

本文由彩世界注册首页发布于彩世界彩票注册平台官网,转载请注明出处:轻松易行完成接口自动化测验(基于python)彩世界彩

上一篇:2017年人工智能现七大走向 下一篇:没有了
猜你喜欢
热门排行
精彩图文