接口自动化介绍


导语

合格的自动化测试工程师 -> 接口自动化测试框架

入门条件 -> 设计-开发-重构框架

进阶之路:接口基础 -> 接口开发 -> Unittest与接口测试结合 -> 设计,开发框架

接口基础

  • HTTP接口熟悉
  • 常见接口介绍
  • 接口工具的使用
  • 接口测试基础的面试
  • 接口开发
    • 使用Django,开发Get,Post请求
    • 掌握Unittest与接口测试的结合
    • Unittest使用,断言,HTMLTestRunner,Case的管理,Request的引入使用

接口自动化测试框架从设计到开发

  • 设计框架
  • 根据框架,设计工具封装
  • 基类封装
  • Debug
  • 数据处理
  • 回写测试结果
  • 解决数据依赖
  • 结果统计
  • 邮件服务
  • 发送报告
  • 常见接口测试查缺补漏
  • 操作数据库
  • 操作cookie

接口基础面试

  • 如何理解接口?

前后端解耦,需要一个桥梁,负责前后端传输数据

  • 接口测试和功能测试的区别

是功能测试的一种,功能测试的定义非常广泛

自动化属于功能测试,无论是接口还是自动化测试,都是模拟用户的操作

接口测试只是模拟用户发送数据,只是没有经过前端/客户端

自动化模拟用户操作,减去了手工操作,通过脚本去实现

在国内来说,技术能力可能会比功能测试好-含金量不同

  • 常见的接口类型

Post,get,put,delete

  • 接口是如何传递参数

Get请求?前方为URL地址,后方为消息主体/请求数据

Post请求是以WebFrom/表单的形式提交数据

  • 如何测试一个接口?

Fiddler Postman soapUI Loadrunner Jmeter

工具只是一种实现方式而已

怎么简单怎么做(主要是效率)


模拟请求

  • 为什么模拟请求

解耦很重要

并行开发很重要(效率第一)

使用Fiddler模拟请求

步骤:进入Composer工具栏,传入对应headers,body

  • 使用fiddler模拟响应

进入AutoResponder工具栏,传入对应url,以及对应的response数据

搭建Django框架-测试环境

开发web端是比较实用的

  • 安装Django框架

在线安装:pip install Django ==指定版本

离线安装:python setup.py install

  1. 官网下载所需版本
  2. 解压,然后在cmd中,进入存放目录,输入命令
  3. 在终端输入命令:django-admin startproject HelloWorld(项目名可修改)

项目结构

  • HelloWorld/根目录

项目的容器。它的名字对Django无关紧要。您可以将其重命名为您喜欢的任何名称。

  • manage.py

一个命令行实用程序,可让您以各种方式与该Django项目进行交互。您可以manage.py在 django-admin和manage.py中 阅读有关的所有详细信息 。

  • 内部HelloWorld/目录

是项目的实际Python包。它的名称是Python包名称,您需要使用它来导入其中的任何内容(例如HelloWorld.urls)。

  • HelloWorld/init.py

一个空文件,告诉Python该目录应视为Python软件包。如果您是Python初学者,请在Python官方文档中阅读有关包的更多信息

  • HelloWorld/settings.py

此Django项目的设置/配置。 Django设置将告诉您所有设置的工作方式。

  • HelloWorld/urls.py

此Django项目的URL声明;Django支持的网站的“目录”。您可以在URL调度程序中阅读有关URL的更多信息。

  • HelloWorld/asgi.py

与ASGI兼容的Web服务器为您的项目提供服务的入口点。有关更多详细信息,请参见如何使用ASGI进行部署

  • HelloWorld/wsgi.py

与WSGI兼容的Web服务器为您的项目提供服务的入口点。有关更多详细信息,请参见如何使用WSGI进行部署

  • 运行django

在根目录下,在终端中运行:python manage.py runserver 127.0.0.1:8000

在browser中,输入127.0.0.1:8000

创建工程应用app

  • 创建新的app,使用系统模块manage

回到根目录,进入终端:python manage.py startapp name

  • 原理

需要知道地址怎么到server的,访问urls.py中的方法,执行urlpatterns中的方法

创建的app中的views.py模块中,定义方法

在urls.py模块中,引入login方法,urlpatterns变量中,调用login方法

  • 用户在敲下你的网址并回车,生成请求
  • 请求传递到urls.py;Django去urlpatterns中匹配链接(Django会在匹配到的第一个就停下来)
  • 一旦匹配成功,Django便会给出相应的view页面(该页面可以为一个Python的函数,或者基于view(Django内置的)的类),也就是用户看到的页面
  • 若匹配失败,则出现错误的页面
  • 一个工程项目,有很多个APP,每个APP都是工程组成的一部分

开发接口

  • 框架

都是基于代码

框架就是把所有的代码进行整合,写的简洁一些,逻辑是没有改变的

无非是多个中间服务商,Apache,Nginx之类的

只需要知道url跳转到哪儿,在哪儿解析,Response什么信息

真正的API在views模块里面

注意事项:
  • 代理端口需区分,否则会冲突
  • HTML中form表单,与from区分
  • HTML中路径需以/斜杠结尾
  • Unittest
    • 创建一个类的时候,继承Unittest框架中TestCase类
    • 内置方法
      Command Describe
      setUp 每次方法之前执行
      tearDown 每次方法之后执行
      sefUpClass 类执行前执行
      tearDownClass 类执行后执行
      Test_XX 单词在前的case方法,缺少test则不会运行
  • 断言–assert
    Command Describe
    assertEqual x == y ?None : z
    assertNotEqual x != y ?None : z
    assertTrue type(x) == True ? None : z
  • 全局变量

    相比类变量更加快捷

    命名方式:Globals()[‘变量名’] 解决依赖

  • 跳过case执行:

    语法糖:@unittest.skip(‘case’)

  • 创建容器

    创建语法

    Suite = unittest.TestSuite()

    添加case

    Suite.addTest(类名(casename))

    可添加多个case

    执行容器

    unittest.TextTestRunner().run(容器名)
  • 结合HTMLTestRunner,生成TestReport

    搜索Python3 HTMLTestRunner,最好是GitHub上面的

    创建HTMLTestRunner.py,移至Python->lib目录

    在case文件中,引入HTMLTestRunner模块

  • Unittest之面试

    如何使用Python开发测试框架

    语言:Python

    接口:使用requests第三方库

    管理case:unittest框架-断言-skipcase-suite容器-依赖关系

    报告:HTMLTestRunner

    数据管理:Excel,MySql

    Case执行:持续集成或批处理文件

  • 建议

    Unittest中,case是按照ascll码比较,进行升序执行

    尽量减少依赖执行

    GET请求URL与Data分离传参,无响应

    Globals()[‘变量’] = data 下个case调用会报错

  • Mock服务
    • 以代码来实现自动响应请求的功能,模拟返回数据
    • 引入mock
      import unittest.mock
    • 使用方法
      mock_name = mock.Mock(return_value=模拟数据)
      请求方法 =  mock_name(改变返回模拟数据)
    • 示例
      mock_data = mock.Mock(return_value=response_data)
      
      method = mock_data
      
      res = method(request_data, url, method)
    • 重构封装mock
      封装mock-method
      
      from unittest import mock
      
      def mock_test(mock_method, url, method, request_data=None, response_data=None):
      
          if response_data == None:
      
              res = mock_method(url, method, response_data)
      
              return res
      
          else:
      
              mock_data = mock.Mock(return_value=response_data)
      
              mock_method = mock_data
      
              res = mock_method(request_data, url, method)
      
              return res

  • 设计接口自动化测试框架
    • Case过多,避免繁琐操作
    • 不排除某些需求,设定特殊的值,而手动添加
    • 编写接口测试用例

      用例示范

    • 需要考虑的点

      接口地址

      请求数据

      接口类型

      预期结果

      Header - cookie

      数据依赖–接口自动化的难点

    • 操作Excel

      定义一个类

      用例示范
    • 重构封装excel函数

      封装request_data, header

      封装调用类

    • 封装request类

      对response_data,进行格式化

      Json.dumps(response, ensure_ascii=False, intent=2, sort_keys=True)

      使用ensure_ascii的注意事项:

      json_dumps(dict)时,如果dict包含有汉字,一定加上 ensure_ascii=False。否则按参数默认值True,意思是保证dumps之后的结果里所有的字符都能够被 ascii 表示,汉字在ascii的字符集里面,因此经过dumps以后的str里,汉字会变成对应的unicode。

    • 写入excel测试结果

      判断接口返回状态:

      接口是否通畅

      调用status_code方法:

    • 引入jsonpath_rw 第三方库

      从第三方库中引入jsonpath,parse 方法

      B = {'foo': [{'baz': 'news'}, {'baz': 'music'}]}

      赋予规则

      A = parse(‘foo[*].data’)

      解析数据

      C = A.find(b)

      使用列表推导式,获取数据

      Data = [match.value for match in C][0] index get content

Author: Ming Hui
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source Ming Hui !
 Previous
IP地址 IP地址
IP地址什么是IP地址 用来标记网络上的一台电脑 局域网ip地址可以相同,但会导致冲突(数据丢失) 所以ip地址允许重复 IP地址的作用 IP地址:用来在网络中标记一个终端,比如192.168.1.1; 在本地局域网内是唯一的。
2020-07-12
Next 
接口自动化测试 接口自动化测试
为什么要做接口测试? 在日常前后端开发中,他们之间为什么是独立完成的? 接口的由来:连接前后端,以及移动端 不同端的工作进度不一样,需要对最开始出来的接口,进行接口测试 接口测试带来了哪些好处? 比如调用第三方的接口,淘宝,银行,
2020-07-07