其他分享
首页 > 其他分享> > 接口测试+自动化接口接口测试详解

接口测试+自动化接口接口测试详解

作者:互联网

1:json模块的使用

  字典是一种存储类型,json是一种格式(完全不同)
  json.loads()函数是将json字符串转化为字典(dict)
  json.dumps()函数是将字典转化为json字符串

  json.dump()和json.load()主要用来读写json文件函数

2:接口自动化测试概叙

  什么是接口测试:

  前后端不分离:淘宝网站(响应的数据在页面,访问响应的数据是html的)返回的是一整个html(做接口难,需要解析数据,因为返回的是整个html代码)

  前后端分离,前端和后端通过api(接口交互),返回的只是数据本身(App可能并不需要后端返回一个HTML网页)

    (市面上主流项目前后端分离走json格式的)

     发请求以json数据格式返回的,通过api接口协议前后端进行交互的

3:swagger工具能导出接口文档的

4:前端页面:app,网页统层为前端展示(数据展示和用户的交互),前端框架:html,js,css,vue(展示漂亮),nodejs

5:后端:后台数据处理,校验,下订单等等业务处理(c语言,c++,java(大型都走java),go,python)

6:前端和后端的数据交互(接口)通过接口

  有些问题前端可能屏蔽,但是后端没有做限制,校验都没有做的,绕过前端,抓包发请求的方式攻破后端,项目可能出现问题

7:接口的概念

  接口是应用程序之间的相互调用

  接口是实体或者软件提供给外界的一种服务

  软件接口:api,微信提现调用银联的接口实现数据交互

  一种是内部接口:1:方法与方法之间的交互   2:模块与模块之间的交互

  一种调用对外部包装的接口

  web接口:http,https,webserver(目前大多做web接口)
  应用程序接口:soket接口--走的tcp/ip协议的
  数据库接口:

8:常用的接口方式(协议)

  1:webservice :是走soap协议通过http传输,请求报文和返回报文都是xml格式的,xml格式(soapui抓包)老项目(政府和银行)

          还要解析数据,麻烦,而且速度可能有降低,通信比较严格

  2:http协议:超文本传输协议(百分之70-80都走的http协议)  get post delete put四种主要的请求方式

  3:https协议:并非是应用层的一种新协议,只是http通信接口部分用ssl和tls协议代替而已

9:什么是接口测试:

  项目需需求  案例:一个登录接口

    场景:产品上规定用户名6-10个字符串下划线

      测试人员在前端做了校验,通过

      后端开发人员没有做校验

    风险:直接抓包取篡改你的接口,然后绕过验证,通过sql注入直接随意登录

    危害:公司损失

  接口测试是市场的主流需求

10:接口测试目标

  可以发现客户端没有发现的bug,(隐藏的bug)(提交订单,前端屏蔽了后端没有,可以随便乱填的)

  及早爆出风险(保证质量正常上线)

  接口稳定了,前端随便改

  最重要加内存系统安全性,稳定性

11:接口自动化测试概叙(怎么做)  (接口跑的是协议层。ui定位的是元素)

  1:项目业务(了解项目业务)
  2:接口文档(api文档)
  3:接口用例
  4:自动化脚本(根据接口文档和接口用例)
  5:pytest框架  重点
  6:调试执行     重点
  7:allure报告
  8:结果分析
  9:持续集成

12:http协议概述

 

 

   一:http响应报文包含四部分:如上图

    1:请求行  主要包含信息:POST (请求方法)/search(请求url) HTTP/1.1 (http协议及版本)

  二:http请求报文包含四部分:如上图

    1:请求行:    POST (请求方法)/search(请求url) HTTP/1.1 (http协议及版本)

    2:请求头       请求头,项目可能有防爬操作,python等语言请求被屏蔽,所以可能需要加头伪装

    3:请求空行

    4:请求体(请求正文)

三:通过谷歌浏览器的f12分析http报文

 

 

  Host : 主机ip地址或域名
  User-Agent :用户客户端,比如说操作系统或者浏览器的版本信息,

          (客户端相关信息,如操作系统,浏览器信息)可能拿到User-Agent去做兼容的,
       服务器拿到User-Agent服务器生成兼容客户端的文本
       浏览器需要服务器发回兼容我浏览器的版本,服务器拿到信息作一个判断,
  Accept: 接收的意思,指定客户端接收信息的类型,(我想接收的是一个图片还是html还是json还是一个xml文档告诉服务器,服务器对应返回)

       如imag/jpg/,text/html,有时候我们一个接口给很多系统公司去用,这个系统可能想要的xml就告诉服务器你给我传递xml数据
       有些公司想要的是json数据(主流都是json格式)告诉服务器你给我json
      这里可以在请求头域设置Accept告诉服务器我需要的内容的格式

  Accept-Charset :客户端接收的字符集,客户端接收字符集告诉服务器:如gb2312,iso-8859-1,utf-8
  Accept-Encoding: 可接受内容的编码,如:gzip压缩格式, deflate

     (为了方便进行内容的传输,节省传输时间,提供传输效率,可能进行一些编码和压缩,节省传输流量)
  Accept-Language:接受的语言,如Accept-Language: zh-CN,zh;q=0.9 ,做国际化可以识别这里,中文环境给我中文数据
  Authorization:客户端提供给服务端,进行权限认证的信息(进行权限认证的,请求的话有个鉴权的这样的功能,

        不是说想什么服务器就发给什么,有可能需要进行一些基本的认证,认证信息可以放在这里)
  Cookie:携带的cookie信息 非常重要的字段(我登录成功之后就会在本地保存一些cookie,保存一些文本,

        下一个请求的时候直接把cookie发给服务器,告诉服务器我已经登录了,有一个证明在这里cookie携带回去)做校验的
  Referer:当前文档的URL,即从哪个链接过来的(我这个请求到底从那个连接过来的)

      比如:Referer: http://test.lemonban.com/ningmengban/app/login/login.html登录的这个连接
      是从login/login.html从我们这个网站的首页来的,防止盗链,把这个链接盗取了用到自己网站去,

      或者说可以统计我这样的一个请求到底来自于那个页面,
  Content - Type:请求体内容类型,请求构建以什么形式传递参数的,如:x-www-form-urlencoded表单形式

        (往服务器提交内容,告诉服务器我提交的内容是什么格式的,表单,json格式,xml格式)
  Content - Length:数据长度 ,(提交内容的数据长度有多少个字节告诉服务器,防止进行请求的篡改)
  Cache-Control:缓存机制,如Cache-Control:no-cache :别给我缓存 ,有些请求会缓存到本地的,
  Pragma:防止页面被缓存,和Cache-Control:no-cache作用一样(1.0中间的,为了兼容和1.0)

  四:cookie 

    第一次访问网站,如果网站有cookie机制,访问第一个请求的时候返回set-cookie

    set-cookie设置cookie值,通过响应数据的头,响应头里面通过set-cookie把值给客户端,获取cookie里面对应的值     

 

 

 13:fiddler

  fidder的使用技巧(能抓包,会看数据)抓取https要设置证书:(免费的,开源的,能抓很多对应消息,app的也可以)

  fidder是一款免费,灵活,操作简单,功能强大的http代理工具,是目前最常用的http抓包工具之一

  可以抓取所有的http/https包,过滤会话,分析请求详细内容,伪造客户端请求,篡改服务器响应,重定向,网络限速,断点调试等功能

  fiddler的工作原理:

    正向代理(正向代理服务器,通过浏览器发送请求以前是直接发给服务器,fidder转发(代理服务器),

    浏览器请求发给fidder代理服务器,fidder代理服务器转发给服务器,

    服务器数据转发给fidder代理服务器,代理服务器发给浏览器

  正向代理:转发浏览器的请求和响应,抓包工具 对客户端透明 

  反向代理:nginx——负载均衡的——性能  一个服务器

       tomcat    db(现在用户级别很大,一个tomcat搞不定,需要帮手,三个tomcat分担流量(怎么协调加nginx--负载均衡))

      浏览器发请求过来,不知道请求发给谁,请求量很大,通过nginx把请求分发到各个tomcat里面去,避免的一个tomcat承受不住

14:接口工具对比:(掌握fidder)

  fidder       免费的http查看工具,系统代理,工作在应用层          独立运行(是)      支持移动设备(是)     是否收费(否)
  wireshark      网络抓包,监听网卡,工作在网络接口层               独立运行(是)      支持移动设备(否)     是否收费(否)
  httpwatch      集成到IE,chrome中的网页数据分析工具             独立运行(否)      支持移动设备(否)       是否收费(基础版/专业版)
  charles        http代理,http监控,http反代理,查看http通讯查看信息工具    独立运行(是)      支持移动设备(是)       是否收费(是)
  ByrpSuite      http代理,用于工具web应用程序的集成平台,          独立运行(是)      支持移动设备(是)      是否收费(是)
            包含了很多工具,抓包,漏扫,爆破,黑客必备工具之

  wireshark--底层,网络层--用这个

15:websocket: (和http一样是传输协议)

  实时性强 使用场景: 聊天系统 股权交易 直播--部分业务

16:cookie

  服务器发给客户端 在请求的响应数据  响应头:Set-cookies   本地存放 cookies攻击  

17:sessionid

  会话id 身份验证-存放到 服务器

18:tooken

  令牌(令牌代表身份信息,身份标识----身份校验(数据库db校验,每发个请求就需要校验很麻烦,避免频繁访问数据库,token就表示身份))

  cookie和token(cookie里面最关键的就是session id值)

  cookie里面有时候有sessionid和token值

19:接口测试数据格式

  一:接口自动化测试数据源(测试用例来源哪里)测试用例一般存放在哪里
    一:excel测试用例
    二:yaml格式用例
    三:csv

  二:自动化脚本中的数据类型:

    1:表单格式:[urlencoded格式]:又叫form格式,或者是x-www-form-urlencoded格式(type类型为表单形式,传数据表单形式)

      表单格式是键值对组成的,键和值之间用=,多个值之间用&  如:name=zhengsan&age=16

    2:json格式(str字符串:键值对类型的字符串) 

      json有对象,数组两种结构,有字符串,数字,逻辑值,空值四种数据类型
      用大括号{}表示对象,对象由属性组成的,属性由键值对组成的,键和值用冒号隔开,属性之间用逗号隔开,键必须用双引号引起来
      用中括号[]表示数组,数组由单独的值组成
      json灵活,json可以嵌套

20:json格式详解

  对象:大括号表示,对象由属性组成,属性由键值对组成,键和值对之间用冒号隔开,属性之间用逗号隔开,另外键必须双引号
     {"姓名":"姚明","年龄":38}
  数组:用中括号表示
     ["小明","小李","小百"]
     [{"姓名":"姚明","年龄":38}]
  嵌套:对象中可以再嵌套对象和数组
    {"姓名":"姚明","年龄":38,"家禽":["小明","小李","小百"]}

21:了解教管系统:(在线管理系统)(前后端分离的) 什么框架,什么配置

  项目描述:教师管理系统是一款在线管理学生课程的一款软件
  主要功能包括:
    课程:包含了所有课程名和课程详情
    老师:可以查看老师姓名,授课内容及授课班级
    学生:包括班级号,班级包含课程,所属学生和班级学生进度

  框架结构:
    后端架构:cherrypy与django结合
    diango:包含了所有的课程名和课程详情
    cherrypy:使用cherrypy作为diango的development server
  数据库:sqlite
  前端:html,js,css

22:python自动化过程中:

  配置文件格式:text(很少用),cnf,ini,yaml,excel(很少用),.py也可以

23:简单的接口测试源代码

config.py            #配置文件
    #time:2020/10/5
    HOST="http://127.0.0.1:80"           #等同localhost,但是建议写localhost,写url全称,项目换了环境只要改这个配置url就行
    http://127.0.0.1:80/mgr/login/login.html
    http://127.0.0.1:80/mgr/login/login.html
    http: // localhost / mgr / login / login.html
    账号和密码:auto / sdfsdfsdf

login.py

    # 登录接口
    import requests                      #请求库使用request
    import json
    from api接口自动化.teachTest.config import HOST
    #user_headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"}

    # 2:url路径--考虑可维护性(各个环境ip不同,不同环境测试,增加配置文件)
    url =f"{HOST}/api/mgr/loginReq"

    #3:头部,请求头---头都是字典类型的
    header={"Content-Typ":"application/x-www-form-urlencoded"}         #type类型

    #4--请求体body,最常用都是字典写的(传表单形式可以字典来做)
    payload={"username":"auto","password":"sdfsdfsdf"}
    print(type(payload))

    #5--发送请求
    #def post(url, data=None, json=None, **kwargs):
    '''
      url:必填
      data=None  #请求体的参数---默认表单类型---写的参数默认转成表单传递给客户端---application/x-www-form-urlencoded(传表单就是传data)
          传data就不用传type---因为传的时候默认header头格式是表单格式
      json=None  #请求体的参数---默认json格式---写的参数默认转成json传递---application/json (传json格式就传json)
    
      **kwargs  #关键字可变数量参数,传  变量=值(一般传递:头headers,cookies,proxy代理,ssl校验)
              cookies,token--一般封装到头部。
    '''
    #reps=requests.post(url,data=payload,headers=header)  #reps请求本身的对象
    #
    
    1:打印请求头        print(reps.request.headers)
    2:打印请求体         print(reps.request.body)              #username=auto&password=sdfsdfsdf
    3:打印响应体        print(reps.text)                      #text这是查询str字符串类型,返回的类型:字符串
    
        print(reps.json())                           #也能查看响应体的,但是响应体必须是json,不是json就报错了--(返回的类型:字典)
        print(json.loads(reps.text)["retcode"],type(reps.text))          #返回的类型:字符串,转字典json.loads()
    4查看响应头            print(reps.headers)        #访问接口,接口返回一个Set-Cookie,Set-Cookie是客户服务器给客户端的,在headers里面体现出来
                        cookie值如果后面接口需要就需要带上去(标识)

    5--用json传输入,
        reps=requests.post(url,json=payload,headers=user_headers)                  #这样写传入的数据是json格式,但是接口文档要求传入表单,肯定不会成功,
        
    reps.encoding="unicode_escape"                 #编码设置,为了看到中文(设置响应的编码格式)
        print(reps.text)                        查看响应体
        print(reps.request.headers)                查看请求头        输出:header={"Content-Typ","application/x-www-form-urlencoded"}
        
    reps=requests.post(url,json=json.dumps(payload),headers=header)                  #指明头,传的格式是表单(这样还是不行,后期自己研究)
    reps.encoding="unicode_escape"
    # print(reps.request.headers)
    # print(reps.text)


    #6:这样发请求fidder抓不到包(发给服务的没有经过fidder代理,fidder没有中转)
    #如果需要fiddler抓包需要加个代理参数proxies:fiddler抓包需要请求经过他,---设置代理(设置代码发请求到fidder)
    fiddler_porxies={
        "http":"http://127.0.0.1:8888",
        "https":"http://127.0.0.1:8888"
    }                                      #写fiddler的端口号+fiddler的路径, 抓包两个协议,http和https(都走的http所以下面的不用改成https)
    reps=requests.post(url,data=payload,headers=header,proxies=fiddler_porxies)   #porxies=porxies加到代理专门参数
    reps.encoding="unicode_escape"
    print(reps.request.headers)
    print(reps.text)

lesson.py
    #time:2020/10/6
    import requests
    import json
    from api接口自动化.teachTest.config import HOST
    lesson_url =f"{HOST}/api/mgr/sq_mgr/"
    Host = 'http://127.0.0.1:80'
    api_url = f'{Host}/api/mgr/sq_mgr/'
    header = {'Content-Type': 'application/x-www-form-urlencoded'}#字典
    payload={
        "action":"add_course",
        "data":'''{"name":"初中化学",
                "desc":"初中化学课程",
                "display_idx":"4"
                }'''
    }
    print(type(payload))                    #根据接口文档data里面要是个json,现在这么写{"name":"初中化学", "desc":"初中化学课程","display_idx":"4"}是个字典
                                                         #加三引号'''{"name":"初中化学", "desc":"初中化学课程","display_idx":"4"}''',表达是个json
    reps = requests.post(lesson_url,data=payload)
    reps.encoding = 'unicode_escape'
    print(reps.request.headers)
    print(reps.text)

    '''
    # type--json 
    #参数  payload2
     1- json参数---建议使用 reps = requests.post(api_url,json=payload2)
     2- data参数 import json 
        reps = requests.post(api_url,data=json.dumps(payload2),headers = header)
       使用data参数传递json,(接口本身接收的数据是json)data写json---头也要指定json格式,使用data默认是表单,所以要改成json,
       json.dumps()用于将字典形式的数据转化为字符串
       data=json格式----headers=json格式(两边都要转,麻烦)
    '''

24:requests.post方法:data和json参数区别(重点)

  一:params参数,如果传入的是字典,自动编码为表单,针对的是get方法,

    一般get请求需要---def get(url, params=None, **kwargs):----只有get请求传有params,其他请求没有
  二:data参数。如果传入是字典,自动编码为表单形式传递, 针对的是post/put方法
  三:data参数,如果传入的是字符串,按原格式直接发布出去 针对的是post/put方法
  四:json参数,如果传入的是字典,自动编码为json字符串 针对的是post/put方法
  五:json格式,如果传入的是字符串,按原格式基础上添加双引号发布出去 针对的是post/put方法
  六:headers参数,传递的是字典格式,针对的是所有方法

  data=json.dumps(dictpayload)等同于json=dictpayload      dictpayload是一个字典

 (data=payload)所以data和json传递数据最好以字典形式去做,payload请求体最好构建成字典,也可以构建成字符串,看具体情况

  用data还是json取决接口本身的type类型,

25:requests库请对应的方法和相应的参数:(request库最基本的四种方法)

  参数\函数       get     post(提交)     put(修改)     delete(删除)
  url              有      有            有           有
  params           有
  data                有           有            有
  json 有
  headers           有      有           有             有
  cookies            有      有           有             有

   params参数是get方法独有的 

26:requests库响应消息体四种格式:(打印的信息)

  四种返回格式:           说明                 用处
  r.text:文本响应内容           返回字符串类型              获取页面html
  r.content:字节响应内容         返回字节类型(byte)           下载图片或者文件,r.content返回的是字节流
  r.json:json解码响应内容       返回字典格式               明确服务器返回json数据才能用
  r.raw:原始响应内容          返回原始格式(和fiddler一样,抓取源数据)

27:request库的使用,查看请求信息和响应信息,设置编码等

  

 

 

  

 

标签:http,请求,reps,接口,json,详解,测试,格式
来源: https://www.cnblogs.com/yuanwt93/p/14497704.html