目录
1、什么是接口?
2、接口组成的要素是什么?
3、你对requests了解多少
4、如何使用requests
5、requests.get作用
6、requests.get语法形式
7、requests.get的返回值
8、接口测试的优势是什么
9、什么是接口测试
10、为什么要写用例
11、接口测试用例设计主要考虑哪些
12、做接口测试运用过哪些测试工具
13、抓包工具用过哪些
14、接口功能测试用例包含哪些内容
15、接口测试报告包含哪些内容
16、测试指标范围包含哪些
17、response返回内容有哪些
18、TCP/IP参考模型有哪几层
19、常用协议的端口号
20、常见的状态码有哪些
21、post请求四种传送正文的方式有哪些
22、你们公司的接口测试流程是怎样的
23、请简述一下cookie、session以及token的区别
24、接口测试如何设计用例
25、通用接口用例设计
26、根据业务逻辑来设计用例
27、接口测试注意事项
28、接口测试执行中对比数据库吗
29、谈谈你对HTTP协议的了解
30、get和post请求有什么区别
31、在接口测试过程中发现的bug多不多?
32、接口测试中有哪些要注意的测试点
33、接口执行测试后返回结果做对比,一般对比那一部分内容
34、为什么开展接口测试
35、之前使用过抓包工具吗?如何使用的
36、 json数据是什么,你平时如何解析json数据
37、postman在你工作中使用的流程是什么样的
38、在接口测试中关联是什么含义?如何使用postman设置关联
39、postman支持什么类型的协议测试
40、postman参数化由哪几种方式
41、Newman如何执行postman脚本
42、你对http请求跟webservice请求的了解
43、接口测试你为什么要做参数化
44、请详细阐述接口测试和UI测试在测试活动中是如何协同测试的
45、系统间的接口联调测试
46、你们公司接口中常见的错误码及含义,及返回信息参数有哪些等,举例说明
47、为什么进行抓包测试
48、怎么进行抓包
49、 https包怎么抓
50、接口自动化测试框架分为几层
51、如何解决接口数据依赖问题,请举例说明
52、如何做到数据和代码分离
53、如何实现用例可配置(可配置指的是实现运行全部用例和只运行部分用例)
54、如何实现参数化,请举一些实例
55、requests中,传递参数params、data、json的区别是
56、项目中有没有加入日志信息,怎么实现的
57、什么时候需要对数据库进行效验
58、接口测试发现哪些bug
59、接口用例运行多长时间
60、能够大致讲一下你们接口自动化框架是怎么搭建的吗
61、你的项目中接口用例有多少?每次大概执行多长时间
62、在接口自动化中,如何让token不失效
63、下个接口请求参数依赖上个接口的返回数据
64、接口测试中依赖登录状态下的接口如何测试
65、依赖于登录的接口如何处理
66、依赖第三方的接口如何处理
67、接口产生的垃圾数据如何清理
68、不可逆操作,如何处理,比如删除一个订单这种接口如何测试
69、接口自动化的参数你是如何实现的?说说你的想法
70、如何使你的接口自动化测试用例直接跳过前面几条,直接执行第7 条
71、如何使你的接口自动化脚本,对于同一个请求让同一个用户请求多次
72、params和data区别
73、为什么要对requests进行封装
74、如何使用Seesion解决接口保持状态
75、requests分层设计
76、接口的加密测试中对称加密与非对称加密有什么区别? 如何开展测试? 请详解
77、请详细阐述接口测试和UI测试在测试活动中是如何协同测试的
78、在手工接口测试或者自动化接口测试的过程中,上下游接口有数据依赖如何处理?
79、http接口测试和web Service接口测试区别是什么
80、设计接口测试用例例时,涉及的是电商系统,其中包括很多修改,如商品、商家、店铺等等,针对这些数据的修改,会涉及到很多参数。如商品的名称,商品的尺码,商品的颜色等等。那在设计实现“修改”接⼝口时,如何确定要传哪些参数?是只需要传我要修改的参数,还是全部参数都要传
81、目前接口文档是由word格式管理理,因迭代快,产生很多文档,分不不清哪些是不用的接口,哪些是正在用的接口,哪些是更新后的接口,文档杂乱,另外因是word格式管理,不方便查询,如何管理?每次查看接口文档需要下载多个word,不能避免下载操作查看,效率不高,如何提高工作效率?
82、HttpRequest 和 HttpResponse 是什么?干嘛用的
83、Post和Get请求的区别
84、cookie和session的区别
85、HTTP协议状态码有什么用,列出你知道的HTTP协议的状态码,然后讲出他们都表示什么意思
86、请简单说一下三次握手和四次挥手
87、说说HTTP和HTTPS区别
88、HTTP常见请求头
89、七层模型?
接口就是API,意思是应用程序编程接口 接口本质上是程序开发的函数和方法,提供参数和返回值
接口访问的地址、请求的方法、参数、返回值 接口访问的地址协议://IP地址或域名:端口号/应用名/功能名 请求的方法 get、post等参数用户使用接口时,需要向接口提供的数据 返回值接口给用户的反馈结果
requests是请求,作用是发送请求,获得响应,往往使用在网络爬虫,接口自动化测试
安装python,安装requests模块,创建.py文件,编写python代码,导入requests模块 调用requests方法
用于实现使用get方法发送http请求,get方法主要是用来获取资源的,根据接口的需求文档来确定是不是使用get方法
requests.get(url,params,headers,auth,cookies) 参数url是必须写,其他根据实际情况选择是否使用
返回Response对象 常使用Response对象的status_code来获取相应状态码,使用Response对象的text属性获取相应正文
规范性与扩展性好
接口测试是测试系统组件间接口的一种测试,接口测试主要用于检测外部系统和内部系统之间以及各个子系统之间的交互点。测试的重点是检查数据的交换、传递和控制管理的过程,以及系统间的相互逻辑依赖关系等
理清思路,避免漏测和重复测试 提高测试效率 跟进测试进度 告诉领导做过 跟进重复性工作 更好的记录问题、发现问题、复现问题 同时这也是接口测试流程中的一个产物
功能是否正常 功能是否按照接口文档实现,是否依赖业务 异常情况(参数异常、数据异常) 安全测试用例(cookieheader)
postman JMeter python-requests
fiddler
用例名称、接口地址、请求方式、前置条件、描述、请求头部、请求参数、状态码、预期返回结果
系统接口概况、测试目的与范围、测试工具与资源、测试记录及结果分析(单场景接口、混合场景结构)、测试结论
被测接口接收请求和返回报文 被测接口返回状态 被测接口对应业务逻辑处理 涉及数据沉淀的处理 复杂场景下多个接口串联交互
status_code #响应状态码 content #字节方式的响应体,会自动为你解码gzip和deflate压缩 headers 以字典对象存储服务器响应头 json()返回以json格式内容 url 获取url encoding 编码格式 cookies 获取cookie raw 返回原始响应体 text 以字符串形式返回响应体
应用层、传输层、互联网层、网络接口层
21/tcp FTP 文件传输协议 22/tcp SSH 安全登录、文件传送(SCP)和端口重定向 23/tcp Telnet 不安全的文本传送 25/tcp SMTP Simple Mail Transfer Protocol (E-mail) 69/udp TFTP Trivial File Transfer Protocol(微型文件传输协议) 80/tcp HTTP 超文本传送协议(WWW) 110/tcp POP3 Post Office Protocol (E-mail) 443/tcp HTTPS used for securely transferring web pages 3389/tcp 远程访问5631/tcp 5632/udp pcanywhere端口号 1433 SqlServer服务端口号 1521 Oracle服务端口号 3306 Mysql服务端口号 8080 Tomcat默认服务端口号
1XX 信息提示用于指定客户端相应的某些动作 2 XX 成功用于表示请求成功 3XX 重定向,用于移动的文件并且常被包含在定位头信息中制定的新的地址信息 4XX 客户端错误用于指出客户端的错误 5XX 服务器错误用于指出服务器的错误 200 301 404 501
appliction/x-www-form-urlencoded multipart/form-data Raw binary
接口测试是我们~~~项目中做的,主要有~~接口、~~接口等 1、从开发中取得接口文档,了解接口业务,主要包括接口地址、请求方式、入参、出参、返回格式等信息 2、使用JMeter进行接口测试 创建一个线程组 然后建立一个http请求默认值 再新建很多http请求,一个请求时一个用例输入相应接口路径、访问方式、参数等 创建断言和察看结果树 3、最后调用并执行测试用例,编写测试报告 4、在做接口测试的时候遇到过很多问题,都是自己独立解决的,比如返回值乱码(修改JMeter的配置文件UTF-8)
cookie数据存放在客户的浏览器上、session数据放在服务器上、token是接口测试时鉴权码,一般情况下登陆后才可以获取到token,然后在每次请求接口时需要带上token参数,cookie不安全,别人可以分析存在本地的cookie并进行cookie欺骗,考虑到安全应当使用session 可以将登录信息等重要信息存放为session,其他信息可以保存在cookie
接口测试一般考虑入参形式的变化和接口的业务逻辑 一般设计接口测试用例采用等价类边界值场景法居多 接口测试用例设计思路: 1.接口业务逻辑测试 接口逻辑测试是指根据业务逻辑,输入参数,输出值的描述,对正常输入情况下所得输出值是否正确的测试, 也就是测试对外提供的接口服务是否正常 2.模块接口测试 模块接口测试是为了保证数据的安全及程序在异常情况下的逻辑正确性而进行的测试模块,接口测试主要包括以下几个方面 1)鉴权码token异常(为空没有错误过期) 2)其他参数的异常 必填项的检查 参数的长度、类型、格式异常 常规的参数有数字、字符串、日期 参数长度,位数、身份证、电话的长度 参数的类型,数字精度,字母,中文,带空格的参数,特殊字符 日期格式:日期年月日,年月日时分秒,日期格式(包含/-:等) 3)错误码异常覆盖
通过性验证:首先肯定要保证这个接口功能是好使的,也就是正常的通过性测试,按照接口文档上的参数,正常传入,是否可以返回正确的结果。 参数组合:现在有一个操作商品的接口,有个字段type,传1的时候代表修改商品,商品id、商品名称、价格 有一个是必传的,type传2的时候是删除商品,商品id是必传的,这样就要测参数组合了,type传1的时候, 只传商品名称能不能修改成功,id、名称、价格都传的时候能不能修改成功。 接口安全: 绕过验证,比如说购买了一个商品,它的价格是300元,那我在提交订单时候,我把这个商品的价格改成3元,后端有没有做验证,更狠点,我把钱改成-3,是不是我的余额还要增加? 绕过身份授权,比如说修改商品信息接口,那必须得是卖家才能修改,那我传一个普通用户,能不能修改成功,我传一个其他的卖家能不能修改成功 参数是否加密,比如说我登陆的接口,用户名和密码是不是加密,如果不加密的话,别人拦截到你的请求,就能获取到你的信息了,加密规则是否容易破解。 密码安全规则,密码的复杂程度校验 异常验证: 所谓异常验证,也就是我不按照你接口文档上的要求输入参数,来验证接口对异常情况的校验。比如说必填的参数不填,输入整数类型的,传入字符串类型,长度是10的,传11,总之就是你说怎么来,我就不怎么来,其实也就这三种,必传非必传、参数类型、入参长度。
根据业务逻辑来设计的话,就是根据自己系统的业务来设计用例,这个每个公司的业务不一样,就得具体的看自己公司的业务了,其实这也和功能测试设计用例是一样的。 举个例子,拿bbs来说,bbs的需求是这样的: 1、登录失败5次,就需要等待15分钟之后再登录 2、新注册的用户需要过了实习期才能发帖 3、删除帖子扣除积分 4、...... 像这样的你就要把这些测试点列出来,然后再去造数据测试对应的测试点。
测试的时候这几个方面: 改变请求参数,看响应结果是否和接口文档一致 查看参数是否有敏感信息(比如个人账户信息,资金信息) 查看是否对关键参数进行加密处理(密码信息) 所有列表页接口必须考虑排序值 接口返回的图片地址能否打开,图片尺寸是否符合需求; 接口有翻页时,页码与页数的异常值测试; 当输出参数有联动性时,需要校验返回两参数的实际结果是否都符合需求每个接口入参的默认值、异常类型、非空校验 入参支持多个值时,要考虑传的值的个数多的情况下,接口会不会报错
肯定要对比,因为接口返回值的数据来源于数据库,接口对数据的操作还要进行深层次的数据库检查
超文本传输协议,端口为80 是由请求和响应两部分组成的请求头,请求行,请求正文组成;响应是由响应 头、响应行、响应正文组成 面向安全的话使用https
GET在浏览器回退时是无害的,而POST会再次提交请求。 GET产生的URL地址可以被Bookmark,而POST不可以。 GET请求会被浏览器主动cache,而POST不会,除非手动设置。 GET请求只能进行url编码,而POST支持多种编码方式。 GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。 GET请求在URL中传送的参数是有长度限制的,而POST没有。 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。 GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。 GET参数通过URL传递,POST放在Request body中
请举例 提前准备好项目中的缺陷,输入一个负数,系统假设服务端没有做提现金额的判断,当前余额为100,提现金额-100,那么提现-100,余额就变为200,越体现,余额就越大 余额= 当前余额-提现金额
接口中返回了图片地址,要手工去进行图片测试(大小内容) 接口完成查询功能的时候,数据返回的排序显示 接口测试的时候,关注参数的默认值,必填项
一般对比就是返回状态码,其次在对比返回其他的关键内容
接口测试属于集成测试、测试接入越早,就越能在项目早期发现问题,修复问题成本降低 接口测试非常快速,ui自动化执行一个测试用例10s左右,接口用例执行一般毫秒级
之前在项目中使用过fiddler抓包工具进行HTTP协议请求的抓取 打开fiddler之后,默认浏览器配置127.0.0.1 8888端口的代理,在fiddler设置好过滤策略,打开需要 进行抓包的网站进行操作,就可以抓包
json是一种开发常用的数据报文格式,由键值对和数组两种格式构成,可以通过工具bejson网站等
1)编写测试用例 2)在postman中先建好url环境变量 3)根据接口用例所属的模块新建集合管理 4)在集合中不同模块下录入测试用例 5)录入测试用例的时候根据预期结果在tests页签中增加断言 6)导出通过newman去运行
关联就是把上一个接口返回值的部分截取出来,作为下一个接口的参数,能让接口串联运行 在postman中设置关联的步骤如下: 1)通过正则表达式提取的方式或json取值的方式把下一个接口需要的信息从上一个接口截取出来 2)使用设置全局变量的代码把取出来的值保存到全局变量 3)在下一个接口中,使用(全局变量)代替要替换的静态值
http和https协议
内建变量、pre-scripts编写js脚本、批量运行时导入csv或json格式的文件
newman run 脚本名称可以添加参数生成html报表等
webService接口:是走soap协议通过http传输,请求报文和返回报文都是xml格式的,我们在测试的时候都 用通过工具才能进行调用,测试。可以使用的工具有SoapUI、jmeter、loadrunner等 http api接口:是走http协议,通过路径来区分调用的方法,请求报文都是key-value形式的,返回报文一 般都是json串,有get和post等方法,这也是最常用的两种请求方式。可以使用的工具有postman、 RESTClient、jmeter、loadrunner等
举个例子,例如购物车接口请求数据需要登录接口里面返回的token值,这个存在接口之间依赖关系的时候,我们需要把依赖字段值进行参数化再比如接口中会有一些公共参数,每个接口里面都存在,如果值是固定的,那我们可以把这些进行参数化记录,减 少在每个接口里面书写出错的问题 再比如手机号,我传131开头的、133开头的、135开头的,如果不会参数化,就要写三个http请求,分别传 这三种参数,学会了参数化,只写一个http请求就够了,以此来减少重复的工作
接口测试和UI测试这两块其实是有一部分是重叠的,UI测试是通过前端写的界面来调用接口,而接口测试是直接调接口。所以排除前端的处理的逻辑和调用的正确性,在理论上接口测试是可以覆盖所有的UI测试。但实际过程中,如果只是在接口层覆盖所有的业务流,在UI上只测试前端的逻辑,最终的结果可能会是忽视很多原有 的功能点,导致了UI测试的不充分。所以存在多人分工且时间充分的时候可以尝试接口去做业务流的全覆盖,否则不要轻易尝试
两个系统之间的部分数据是相互读取的 1.在一个甲系统增加,修改A数据后,乙系统也会相应的呈现这个改动的数据;在乙系统增加,修改B数据后, 甲系统也会相应的呈现这个改动的数据; 即A部分的数据,是由甲系统来维护的,乙系统读入数据并同步;B部分的数据,是由乙系统来维护的,甲系统 读取数据并同步; 2.在具体的操作过程中,在甲系统增加,修改A数据后,然后在乙系统查看对应的数据是否同步一致;反之亦 然; 在乙系统查看对应的数据是否同步一致?分为三个层面; (1)甲系统传输过来的数据和乙系统接收到的数据是否一致; (2)乙系统接收到数据后,会存入到自己的数据库,这个存储过程是否成功?(主要是考虑到甲系统传过来的 数据格式是否和乙系统的格式一致)且数据存储成功与否乙系统会返回一条信息(例如:返回1,表示数据正确 传输并存储到数据库了;返回0及错误信息表示数据传输或存储出了问题) (3)然后在乙系统的界面查看,新增或修改的数据是否和接收到的数据一致
编码 名称 说明 1 操作成功 2 操作失败 33 参数解析失败 一般指json格式错误 44 订单重复提交 (会返回提交成功时的承运信息) 401 身份安全验证失败 500 系统错误 999 需要登录 返回值为json格式,如下: { "status": 1, "message": "处理成功", "result": "请求结果", "totalRow": 100, "totalPage": 5 } status 1表示成功,具体参考2.1返回状态码 message 提示信息 (必有,字符串型) result 详细结果 (可选,类型各接口不同,相见接口内定义) totalRow 总记录条数,用于分页使用 (可选,整型) totalPage 总页数 (可选,整型)
有些时候公司没有标准的接口文档,测试人员只能抓包来获取接口信息 抓包可以迅速找到请求,通过抓包可以查看整个请求过程,以及响应过程,可以通过抓包来分辨前台还是后台 bug 通过抓包,可以查看是否有敏感信息泄露,比如用户密码和个人账号信息等数据。 可以通过抓包进行测试,拦截请求,修改请求数据,查看对应响应结果,抓包本身就是接口测试的一部分。
工具上,使用Fiddler或者charles 这两个工具 Fiddler设置http代理,设置端口号,在手机上设置和fiddler在同一网段,设置代理ip,设置代理端口, 手机上的请求就能被获取到了。 抓取请求查看,可以过滤,找到自己域名下的请求,通过分析请求地址,请求参数,响应结果来查找问题。
https和http协议区别在于https多了一个ssl协议,更加安全,默认端口是443,而http协议默认端口是80 抓取https,需要申请证书,在fiddler或者charles中,可以模拟下载证书,下载之后,在手机上访问代理 服务器的ip和端口,下载证书,就可以抓取到https的请求了。
自动化测试框架分为5层(配置层,脚本层,数据层,测试报告层,驱动层)接口项目工程规划大致可分为几类,首先是测试结果类,比如说叫test_rusult,里面存放一些比如说,日志文件,测试报告。然后是测试用 例testcase,里面分模块存放测试用例。接下来是公共方法类,比如说叫public,或者是tools。里面比如 说存放一些,读取excel数据的方法,发送http请求的方法,收集log日志的方法,发送邮件,操作数据库等 方法。还有就是配置文件类,比如说叫config,里面存放一些比如说,指定运行部分用例的配置文件,连接数据库的配置文件。最后是写一个run方法,运行所有的用例。
第一种,global全部变量的方式解决,将你需要用到的依赖数据提取出来,升他为全局变量。比如说在APP接 口测试里面常用到token做鉴权效验,用一个全局变量来处理依赖的数据,比如登录后返回token,其它接口都 需要这个token,那就用全局变量来传token参数。全局变量有其局限性,不能夸.py文件调用。 第二种,放setUp里面,将接口有依赖的数据提取出来,放到setUp里面,每次运行用例前,都会首先自动运 行setUp函数。 第三种,反射实现。首先定义一个类,比如说获取cookie,定义一个GetCookie,里面的类属性给他一个初 始值,比如说cookie=None。然后用python里面的setattr函数给刚才定义cookie值为空的属性赋值。最 后再用getattr函数取出里面的cookie。个人感觉这种方式实现比较好,也不用担心cookie有效期的问题。
第一种:写在excel表格里,像这种主要是读取excel数据有点麻烦,常用的用来读取excel的第三方库有openpyxl,xlrd等。当然读取excel数据最好用的还是用来做数据分析的pandas模块,不用写那么多for循 环。 第二种:数据存放到yaml文件里,一个模块或者是一个功能写一个yaml文件,最后写个读取yaml文件的公共 方法就行了。yaml格式的文件比较简单,大家可以学下。 第三种:存放在数据库里面。听同事说的,具体以哪种形式存还没了解过。第四种:数据存放在json文件里。
先为什么要做用例可配置:举个场景,你要吧你写的脚本给你同事运行,假设你同事不懂代码,或者是刚来没多久,还没看懂你的代码。这个时候你要叫人家帮你执行下用例,人家肯定两眼一懵逼啊!这个时候配置文件 的作用就来了,你只需要将你的配置文件简单说下,人家就能执行,比如说你的配置文件是这样写的,写了一 个按钮的变量,给的默认参数是all执行全部,但是还可以传列表,假设你设计时是根据你的用例编号,或者 模块名,判断用例编号,或者模块名是否在这传的列表里面,从而执行选定的用例。达到用例可配置的效果在接口自动化中有遇到过什么样的问题 问题一: 我在接口测试中遇到最多的问题就是,接口测试数据类型变化的问题,首先我最开始写在pycharm里面的数据 是字典格式,写好之后把他copy拿到excel里面去,读取出来就变成字符串了,刚开始还没发现这个问题,还 以为是我数据没写对,后面type了一下,才发现是字符串。最后解决主要是用eval函数给他进行强转一下就 好了。这里在补一个读取excel数据遇到的奇葩问题吧,最开始用的是xlrd模块,读取int整数到pycharm里 面变成float小数了,后面百度了一下发现是这个模块的问题,记得当时解决是在整数的前面加上一个英文引 号就好了。 问题二: 接口测试中断言精确度的问题,这个问题我认为很重要,关系到用例是否正确与否,是否出现BUG。断言我主 要是用的unittest里面的assertEqual判断预期和实际是否相等,assertIn,判断返回数据是否包含。但 是有时候返回数据并没有一个太精确的唯一值,像这种就不好用assertEqual判断是否相等。只能用 assertIn,判断返回数据是否包含,像这种只能是多写几个断言,断言响应文本里面的值。如果要举例,可以 举个搜索商品的例子,返回的商品数据比较多,而且商品本身也会有上架下架之类的变动,确实不好做断言。 问题三: 有一次开发人员那边改了某个接口字段,没通知到测试这边,导致用例报错。这里要举个实际的例子
测试每天测试东西,除开页面而言,其本质就是数据驱动测试,无论是正常的场景也好,异常的场景也好,其 实就是数据在发生变化。众所周之,使用unittest框架编写测试用例不能定义形参在方法里面,在我使用 unittest做接口测试过程中,参数化主要是用的ddt这个模块实现的。ddt模块最常用的有3个常用函数 ddt,data,unpack。ddt用来装饰类,data用来接收数据,uppack用来拆包。调用公共方法,读取到 excel数据,将数据赋值给一个变量给data装饰器使用,在方法里面用一个参数接收装饰器里面的数据, data装饰器会自动对这个函数进行拆包,比如说,从excel里面读取是一个列表嵌套字典的数据类型,经过 data拆解后就会变成字典,最后根据key取值,发起http请求。
在get请求中使用params参数,会自动把参数添加到url后面 data传递的是content-type:application/x-www-from-urlencoded,表单形式的数据 json传递的是content-type:application/json,json格式的数据
给用例添加加日志信息,主要是用的logging这个python自带模块,根据日志的不同级别,info,debug,warning,error,critical针对性的写了一个日志类,设置好日志输出格式,将日志指定保 存到.txt结尾的文本文件里面,像一些常见的打印信息,就用info收集,在可能会出现错误的try-except 结构中就用error收集错误信息,方便定位问题。
比如说充值,提现,金额有无相应的增加和减少,都需要对数据库进行效验
用了一个淘宝授权过期的账号,去请求购买商品的接口,通过接口正常购买成功,但是订单归属却丢失了,说明接口未对淘宝授权过期的过期的用户做效验
7条用例的运行时间约为1.79秒,70条就是18秒,490条就是2分06秒,依此类推
好的,我们采用unittest和ddt数据驱动思想搭建测试框架,(对数据excel读取、yaml配置、Requests接口请求、Re参数化、Pymysql数据库效验、日志等模块实现封装),其中,用 Openpyxl来处理excel,存储测试数据(用例数据) pyyaml来配置文件(configparse,pyyaml) Pymysql来连接mysql数据库,执行sql数据,进行数据效验 Requests请求库,来向接口发起请求 使用logging模块来创建日志器,记录项目中的日志信息 使用HttpTestRunner来生成HTML测试报告 使用re模块来实现参数化(正则匹配) 使用动态创建属性(类属性)的机制来实现接口之间的依赖 (setattr getattr)
我们项目有65个接口;大概1200条用例,执行时间大概半个小时
1.调用登录接口,拿到获取的token 2.将拿到的token放在header中,调用确认登录接口 3.确认登录接口调用成功,接口返回信息正常
不同的接口封装不同的函数或方法,需要的数据return出来,用一个中间变量a去接收,后面的接口传a就可以了
本质是:在每次发送请求时需要带上session或cookie才能发送成功,在构建post请求时添加必要的session或者cookie
登录接口依赖token的,可以先登录后,token存到一个yaml或者json或者ini的配置文件里面 后面所有的请求去拿这个数据就可以全局使用了 如果是cookies的参数,可以用session自动关联
这个需要自己去搭建一个Mock服务、模拟接口返回数据 mock可以用在单元测试过程中,还有一个用途,当前端开发在开发页面的时候,需要服务端提供API接口,此时服务端还没开发完成,或者说没搭建测试环境,这时候前端开发会自己mock一个api服务端,自己给自己提 供调用接口的返回数据。
造数据的数据清理,需要python连接数据库,做增删改查操作 测试用例前置,setUp做数据准备 后置操作,tearDown做数据清理
主要靠手工测试造数据,直接在数据库改字段状态。自动化也一样,造数据可以用python连接数据库,做增删改查的操作 测试用例前置,setUp做数据准备 后置操作,tearDown做数据清理。
我会用python中Re模块中的sub方法去替换
可以在 Excel 创建一列,指定是否跳过,然后在用例时,过滤掉这些用例 使用条件判断,通过 case_id==7 来决定是否执行
在 Excel 中设置相关执行次数的字段,在ddt数据驱动时,使用代码来控制执行次数。
由于get请求无请求体,post请求有请求体 使用params参数时,默认会把参数附加到url后面,所以发送get请求时应使用params参数 使用data参数时,参数会存放到请求体中,所以发送post请求时不能使用params,应使用data,除非 接口及支持get又支持post,同样get请求也不能使用data参数。
通过封装,我可以直接把所有的请求参数统一使用字典来传递 比如,我们接口需要的数据也就是测试数据往往会保存在excel表里面,那么我们取到后是字符串类型,字符 串类型是无法作为请求参数传递的,所有我每次都要做数据转换,再传递给接口,为了节省这个过程,我只需 要把这个过程封装到我的requests里即可,每次取数据后会自动给我处理 第二,当我想保持某个状态时,不想每次都初始化一个session对象,那么我可以把它封装到我的reuqests 里面,以后直接调用即可
初始化Session实例,通过这个实例调用request()方法发送请求
cases测试执行逻辑层,用于存放所有的测试用例类 configs配置层,用于存放当前框架中的所有配置信息(使用不频繁,修改不频繁的数据) datas测试数据层,用于存放所有的测试数据,测试参数(可以使用excel,json,yaml,数据库来存储) libs自定义库文件层,用于存放自定义或者二次开发的库文件 logs 日志层,用于保存运行框架过程中产生的所有有效日志信息 reports报告层,用于保存所有的测试报告文件(一般为html报告) scripts 脚本封装层,用于保存所有的操作封装模块(yaml,excel,log.mysql,requests,参数化等) run.py用例启动文件,使用套件加载用例,批量执行并生成报告
对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密 钥(secret key),这种方法在密码学中叫做对称加密算法。 对称加密的一大缺点是密钥的管理与分配,换句话说,如何把密钥发送到需要解密你的消息的人的手里是一个 问题。在发送密钥的过程中,密钥有很大的风险会被黑客们拦截。现实中通常的做法是将对称加密的密钥进行 非对称加密,然后传送给需要它的人。 非对称加密为数据的加密与解密提供了一个非常安全的方法,它使用了一对密钥,公钥(public key)和私 钥(private key)。私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。非对称加密 使用这对密钥中的一个进行加密,而解密则需要另一个密钥。比如,你向银行请求公钥,银行将公钥发给你, 你使用公钥对消息加密,那么只有私钥的持有人--银行才能对你的消息解密。与对称加密不同的是,银行不需 要将私钥通过网络发送出去,因此安全性大大提高。目前最常用的非对称加密算法是RSA算法. 开展测试-TBD
接口测试和UI测试这两块其实是有一部分是重叠的,UI测试是通过前端写的界面,来调用接口,而接口测试是直接调接口。所以排除前端的处理的逻辑和调用的正确性,在理论上接口测试是可以覆盖所有的UI测试。但实 际过程中,如果只是在接口层覆盖所有的业务流,在UI上只测试前端的逻辑,最终的结果可能会是忽视很多原 有的功能点,导致了UI测试的不充分。所以存在多人分工且时间充分的时候可以尝试接口去做业务流的全覆盖,否则不要轻易尝试。
在工具中可以使用全局变量等方式将需要的数据进行传送
区别是有的。主要是传统ws有一套完整的协议标准。其中有soap协议,用来进行消息的传递。以传统工业标准的ws返回数据为例,返回结果需要包装在一个soap协议指定的语法格式中。即使你只需要简单的返回字符1, 也需要包装在协议种返回,协议描述了成功失败否,结果值等。而普通的get,你输出1,在调用端得到字符1。 web service和http接口的区别在于: 1.接口中实现的方法和要求参数一目了然。 2.不用担心大小写问题。 3.不用担心中文 urlencode 问题。 4.代码中不用多次声明认证(账号,密码)参数。 5.传递参数可以为数组,对象等。
关键还是看后台逻辑实现。 举例:User有两个属性username,password 后台逻辑实现:update User set username=? where id=xxx; 那,如果你只想更新username的时候,可以不传password,其值是保持不变的。 后台逻辑实现:udpate User set username=?,password=? where id=xxx; 这种情况下,即使你只想更新username,也需要传password的值给后台,不然password就会被更新为空。 此外,还有一些数据如id等,如果sql中没有写,那即使传递了本字段的参数,数据库也不会更新。因此,在 写关于“修改”的接口时,需要考虑一下,后台的逻辑是怎么实现的,然后确认要传递哪些参数。
如果是webservice,使用WSDL的格式来进行查看接口的文档,以前的接口必要的时候使用一些配置管理的工 具,比如wiki之类的系统来实时更新现有的接口状态
HttpRequest 是 django 接受用户发送多来的请求报文后,将报文封装到 HttpRequest 对象中去。 HttpResponse 返回的是一个应答的数据报文。render 内部已经封装好了 HttpResponse 类。 视图的 第一个参数必须是 HttpRequest 对象,两点原因:表面上说,他是处理 web 请求的,所以 必须是请求对 象,根本上说,他是基于请求的一种 web 框架,所以,必须是请求对象。 因为 view 处理的是一个 request 对象,请求的所有属性我们都可以根据对象属性的查看方法来获 取具体的信息:格式:request. 属性 request.path 请求页面的路径,不包含域名 request.get_full_path 获取带参数的路径 request.method 页面的请求方式 equest.GET GET 请求方式的数据 request.POST POST 请求方式的数据 request.COOKIES 获取 cookie request.session 获取 session request.FILES 上传图片(请求页面有 enctype="multipart/form-data"属性时 FILES 才有数据。 ?a=10 的键和值时怎么产生的,键是开发人员在编写代码时确定下来的,值时根据数据生成或者用户 填写 的,总之是不确定的。 403 错误:表示资源不可用,服务器理解客户的请求,但是拒绝处理它,通常由于服务器上文件和目录 的权 限设置导致的 web 访问错误。如何解决:1、把中间件注释。2、在表单内部添加{% scrf_token %} request.GET.get()取值时如果一键多值情况,get 是覆盖的方式获取的。getlist()可以获取多个 值。 在一个有键无值的情况下,该键名 c 的值返回空。有键无值:c: getlist 返回的是列表,空列表 在 无键无值也没有默认值的情况下,返回的是 None 无键无值:e:None HttpResponse 常见属性: content: 表示返回的内容 charset: 表示 response 采用的编码字符集,默认是 utf-8 status_code:返回的 HTTP 响应状态码 3XX 是对请求继续进一步处理,常见的是重定向。 常见方法: init:创建 httpResponse 对象完成返回内容的初始化 set_cookie:设置 Cookie 信息:格式: set_cookies('key','value',max_age=None,expires=None) max_age 是一个整数,表示指定秒数 后过期,expires 指定过期时间,默认两个星期后过期。 write 向响应体中写数据 应答对象: 方式一:render(request,"index.html") 返回一个模板 render(request,"index.html", context) 返回一个携带动态数据的页面 方式二:render_to_response("index.html") 返回一个模板页面 方式三:redirect("/") 重定向 方式四:HttpResponseRdeirect("/") 实现页面跳转功能 方式五:HttpResponse("itcast1.0")在返回到额页面中添加字符串内容 方式六:HttpResponseJson() 返回的页面中添加字符串内容。 JsonResponse 创建对象时候接收字典作为参数,返回的对象是一个 json 对象。 能接收 Json 格式数据的场景,都需要使用 view 的 JsonResponse 对象返回一个 json 格式数据 ajax 的使用场景,页面局部刷新功能。ajax 接收 Json 格式的数据。 在返回的应答报文中,可以看到 JsonResponse 应答的 content-Type 内容是 application/json ajax 实现网页局部刷新功能: ajax 的 get()方法获取请求数据 ajax 的 each()方法遍历输出这些数据
GET请求,请求的数据会附加在URL之后,以?分割URL和传输数据,多个参数用&连接。URL的编码格式采用的 是ASCII编码,而不是uniclde,即是说所有的非ASCII字符都要编码之后再传输POST请求:POST请求会把 请求的数据放置在HTTP请求包的包体中。上面的item=bandsaw就是实际的传输数据。因此,GET请求的数据 会暴露在地址栏中,而POST请求则不会传输数据的大小:在HTTP规范中,没有对URL的长度和传输的数据大小 进行限制。但是在实际开发过程中,对于GET,特定的浏览器和服务器对URL的长度有限制。因此,在使用GET 请求时,传输数据会受到URL长度的限制。对于POST,由于不是URL传值,理论上是不会受限制的,但是实际 上各个服务器会规定对POST提交数据大小进行限制,Apache、IIS都有各自的配置POST的安全性比GET的 高。这里的安全是指真正的安全,而不同于上面GET提到的安全方法的安全,上面提到的安全仅仅是不修改服 务器的数据。比如,在进行登录操作,通过GET请求,用户名和密码都会暴露再URL上,因为登录页面有可能被 浏览器缓存以及其他人查看浏览器的历史记录的原因,此时的用户名和密码就很容易被他人拿到了。除此之 外,GET请求提交的数据还可能会造成Cross-siterequestfrogery攻击。
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。2、cookie不是很安全,别人可以分析 存放在本地的cookie并进行cookie欺骗考虑到安全应当使用session。3、session会在一定时间内保存在 服务器上。当访问增多,会比较占用服务器的性能考虑到减轻服务器性能方面,应当使用cookie。4、单个 cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。5、建议:将登陆信息等 重要信息存放为SESSION其他信息如果需要保留,可以放在cookie中
通过状态码告诉客户端服务器的执行状态,以判断下一步该执行什么操作100-199:表示服务器成功接收部分 请求,要求客户端继续提交其余请求才能完成整个处理过程。200-299:表示服务器成功接收请求并已完成处 理过程,常用200(OK请求成功)。300-399:为完成请求,客户需要进一步细化请求。302(所有请求页面 已经临时转移到新的url)。304、307(使用缓存资源)。400-499:客户端请求有错误,常用404(服务器 无法找到被请求页面),403(服务器拒绝访问,权限不够)。500-599:服务器端出现错误,常用500(请 求未完成,服务器遇到不可预知的情况)
三次握手过程:1首先客户端向服务端发送一个带有SYN标志,以及随机生成的序号100(0字节)的报文2服务端 收到报文后返回一个报文(SYN200(0字节),ACk1001(字节+1))给客户端3客户端再次发送带有ACk标志 201(字节+)序号的报文给服务端至此三次握手过程结束,客户端开始向服务端发送数据1客户端向服务端发起 请求:我想给你通信,你准备好了么?2服务端收到请求后回应客户端:I'ok,你准备好了么3客户端礼貌的再 次回一下客户端:准备就绪,咱们开始通信吧整个过程跟打电话的过程一模一样:1喂,你在吗2在,我说的你 听得到不3恩,听得到(接下来请开始你的表演)补充:SYN:请求询问,ACk:回复,回应四次挥手过程:由于 TCP连接是可以双向通信的(全双工),因此每个方向都必须单独进行关闭(这句话才是精辟,后面四个挥手 过程都是其具体实现的语言描述)四次挥手过程,客户端和服务端都可以先开始断开连接1客户端发送带有fin 标识的报文给服务端,请求通信关闭2服务端收到信息后,回复ACK答应关闭客户端通信(连接)请求3服务端发 送带有fin标识的报文给客户端,也请求关闭通信4客户端回应ack给服务端,答应关闭服务端的通信(连接)请 求
HTTPS和HTTP的区别主要如下:1、https协议需要到ca申请证书, 一般免费证书较少,因而需要一定费用。2、http是超文本传输协议,信息是明文传输,https则是具有安全 性的ssl加密传输协议。3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后 者是443。4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份 认证的网络协议,比http协议安全。
1.Host(主机和端口号)2.Connection(链接类型)3.Upgrade-Insecure-Requests(升级为HTTPS请求)4.User-Agent(浏览器名称)5.Accept(传输文件类型)6.Referer(页面跳转处)7.Accept- Encoding(文件编解码格式)8.Cookie(Cookie)9.x-requested-with:XMLHttpRequest(是Ajax 异步请求)
IP,TCP/UDP,HTTP,RTSP,FTP分别在哪层? IP:网络层TCP/UDP:传输层HTTP、RTSP、FTP:应用层协议 url的形式 形式:scheme://host[:port#]/path/…/[?query-string][#anchor]scheme:协议(例如:http, https,ftp)host:服务器的IP地址或者域名port:服务器的端口(如果是走协议默认端口,80or443) path:访问资源的路径query-string:参数,发送给http服务器的数据anchor:锚(跳转到网页的指定锚 点位置)http://localhost:4000/file/part01/1.2.html