2026/1/31 19:23:51
网站建设
项目流程
沈阳开发网站,制作电子软件的app,企业营销方案,广州市建设工程造价站网站一、基础知识
1.接口测试原理
接口测试的原理就是模拟客户端向服务器发送请求#xff0c;服务器接收请求报文后对相应的报文做处理并向客户端返回应答#xff0c;客户端接收应答的过程。
我也在文末准备的学习资料以及配套的视频教程#xff0c;需要视频教程的可以去文末…一、基础知识1.接口测试原理接口测试的原理就是模拟客户端向服务器发送请求服务器接收请求报文后对相应的报文做处理并向客户端返回应答客户端接收应答的过程。我也在文末准备的学习资料以及配套的视频教程需要视频教程的可以去文末观看需要资料的也可以点击文末小卡片免费领取。2.接口测试点及用例设计方法接口测试采用的方法其实与黑盒测试一致的甚至可以把接口测试理解为没有界面的功能测试。只不过接口测试的关注点主要在请求和响应上。另外还包括接口的安全接口的性能等。常用的用例设计有等价类边界值法等。一般测试用例的设计要从单接口参数的校验到整个业务功能点的验证还可以验证一些安全性和异常情况。3.接口测试要点检查接口返回的数据是否与预期结果一致。接口测试结果检查通常需要通过SQL语句从数据库内进行查询确认。检查接口的容错性假如传递数据的类型错误时是否可以处理。接口参数的边界值例如传递的参数足够大或为负数时接口是否可以正常处理。接口的性能http请求接口大多与后端执行的SQL语句性能算法等比较相关。接口的安全性外部调用的接口尤为重要一般每个接口都要进行鉴权验证。4.常见HTTP状态码状态码含义1**临时响应并需要请求者继续执行操作2**请求成功。操作被成功接收并处理3**重定向代码用于已经移动的文件并且在头信息中指定新的地址信息4**客户端错误请求包含语法错误或者无法完成请求5**服务器错误服务器在处理请求的过程中发生错误比如200 服务器成功处理请求404 未找到资源410 找到资源但现在已不存在500 内部服务器错误503 服务器目前无法为请求提高服务302 临时重定向304 客户端的缓存资源时最新的要客户端使用缓存5.HTTP基础知识DNSDomain Name Server 域名服务器http:// www.baidu.com: 80/ adv_search? wpyorderfalse# tagHTTP报文格式分为两种请求报文请求行请求头部回车换行消息体响应报文状态行响应头部回车换行消息体HTTP由请求和响应构成是一个标准的客户端服务器模型B/S架构。HTTP协议永远都是客户端发起请求服务器回送响应。B/S架构又叫浏览器/服务器模型严格意义上说这个B不仅仅只是浏览器凡是能够发生HTTP请求的对象或者工具都可以叫做客户端。HTTP请求组成部分URL地址请求参数可选请求头请求体仅限POST请求对于响应内容部分主要关注两个点响应状态码响应内容HTTP工作过程浏览器输入dns域名解析域名与IP映射第一次访问去DNS找对应IP不是第一次访问则本机存有IP建立tcp连接三次握手发送http request请求信息web服务器接收请求应用服务器处理业务逻辑关闭tcp连接请求响应完成。如果浏览器在其头部信息中加入了connection:keep-alive则tcp连接将任然保持打开状态。浏览器渲染响应页面Get和PostGet从服务器端获取资源或数据Post向服务器端提交数据Get和Post的区别1)Get请求一般用于向服务器请求获取一个资源没有副作用一般会在客户端做缓存。Post请求一般用于向服务器提交数据并让其去完成一件事所以这个操作是有副作用的不会在客户端做缓存2)Get请求发送数据的时候一般会将请求数据放在url字符串中发送给服务器端所以从安全性角度来看相对没有Post请求安全性搞所以get请求一般不会用于比较隐私数据的传输。而Post请求时将请求数据放在请求体body里面所以一般用于表单数据登录数据等数据的传输。6.接口自动化测试工具Jmeter见我另外一篇博文jmeter学习Apifox接口自动化测试比较好用的工具。见下文第5大点postman见我另外一篇博文接口自动化实战-postman7.tokencookie存在于客户端由服务器端通过set.cookie方法来进行设置。session存在于服务器端的内存中主要用于和cookie一起来验证客户端的登录状态。tokentoken是服务器端生成的一串字符串用作于客户端进行请求的一个令牌。token运行的原理1客户端第一次登录成功时由服务器端生成并保存于服务器端的数据库中服务器端再将token值返回给客户端。2客户端拿到token值之后会进行保存保存位置由服务器端指定。3后面客户端发送请求时会将token值附带在请求参数中发送给服务器进行验证。4服务器端收到客户端的请求之后会取出token值与保存在本地数据库中的token值进行比较。5如果两个token是一致的说明用户已登录成功当前用户处于登录状态。6如果没有这个token值说明用户没有登录过。7如果token值已经发生改变说明原登录信息已经失效需要重新登录。二、抓包工具1.chrom抓包右键-》检查-》找到网络需要关注的字段响应内容2.Fiddler抓包PC端手机端1.原理Fiddler是通过改写HTTP代理让数据从它那通过来监控并且截取到数据。在打开它的那一瞬间它就已经设置好了浏览器的代理了。当你关闭的时候它又帮你把代理还原了。2.下载安装官网下载https://www.telerik.com/fiddler按照指示填写下载然后傻瓜式安装一直点击是就可以安装成功。3.抓取数据信息说明名称含义#抓取HTTP Request的顺序图标表示请求状态和响应状态ResultHTTP状态码 重点关注Protocol请求使用的协议常用HTTPHTTPSHost请求地址的主机名URL请求资源的位置Body请求的大小Caching请求的缓存过期时间或者缓存控制值Content-Type请求响应的类型Process发送此请求的进程进程IDComments允许用户为此回话添加备注Custom允许用户设置自定义值要访问HTTPS协议需要设置一下Tools – Fiddler Options 选择HTTPS勾选Decrypt HTTPS TrafficDecrypt然后后面弹出的窗口都点击yes/是点击Actions最后点击OK4.数据详细字段说明名称含义Statistics请求的性能数据分析Inspectors查看数据内容常用AutoResponder允许拦截指定规则的请求Composer自定义请求发送服务器Filters请求过滤规则常用Timeline请求响应时间5.过滤过滤最常用过滤掉不需要的抓包数据只显示自己需要的这样看起来会方便很多。Filddler过滤2命令过滤?字符串host状态码6.断言断言目的是为了验证服务端功能。全局断言Rules - Automatic BreakpointsBefore Request断言Before Response断言命令断言Before Request断言bpu 域名或IP取消断言bpuBefore Response断言bpafter 域名或IP取消断言bpafter三、Request库发送请求安装Requests库pip install requests1.利用requests发送get请求import requestsdef test1():resp requests.get(http://www.taobao.com)print(resp.status_code) # 响应的状态码信息print(resp.text) # 获取响应对象的文本信息print(resp.url) # 获取响应对象所对应的请求地址if __name__ __main__:test1()2.利用requests发送get请求参数import requests# 直接在url上添加请求参数def test1():resp requests.get(https://baidu.com/s?wdpython) # 自动在url后面添加参数print(resp.text)# get请求参数def test2():data {wd: python} # 请求参数resp requests.get(https://baidu.com/s, paramsdata) # 自动在url后面添加参数print(resp.text)if __name__ __main__:test2()3.利用requests发送post请求import requestsdef test1():resp requests.post(https://ynuf.aliapp.org/service/um.json?_bx-v2.0.31)print(resp.status_code) # 响应的状态码信息print(resp.text) # 获取响应对象的文本信息print(resp.url) # 获取响应对象所对应的请求地址if __name__ __main__:test1()4.在post请求中以json方式传递参数import requests# 以json格式传def test1():data {username: test, password: 123, age: 18, phone: 1588888888} # 字典格式是jsonresp requests.post(, jsondata)print(resp.text)if __name__ __main__:test1()5.添加或者修改headers信息如果浏览器访问响应正常如果不是浏览器来访问是爬虫或代码访问则响应不正常。这个需要用到headers信息。import requests# 含有header访问才能跟浏览器访问显示一样的def test1():headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36}resp requests.get(, headersheaders)print(resp.text)if __name__ __main__:test1()6.在请求头中添加cookie信息import requests# 绕过登录想要获取登录之后的信息需要带上Cookiedef test1():headers {Cookie: # 每次都要更新}resp requests.get(, headersheaders)print(resp.text)if __name__ __main__:test1()7.利用session对象保持会话状态需要登录才能访问的接口对于这种一定要使用session会话来帮助保存会话信息import requests# 利用session保持会话状态def test1():sess requests.Session() # 创建一个session会话对象帮助我们保存客户端的会话信息data {username: admin,password: admin123}sess.post(, datadata) # 操作登录resp2 sess.get() # 请求登录之后的接口print(resp2.text)if __name__ __main__:test1()8.利用requests上传和下载文件import requests# 上传文件不带参数def test1():files {file: open(test.txt, rb)}resp requests.post(, filesfiles)print(resp.text)# 上传文件带其他参数def test2():data {batchname: GB20210707 # 抓包的}files {batchfile: open(Test.xls, rb)}resp requests.post(, datadata, filesfiles)print(resp.text)if __name__ __main__:test1()9.加密接口测试询问开发用的什么加密方法import requests# 加密接口请求def test1():uid, name, password, salt 3, qcj, 123456, LZ7dYxCj5S68ucAhimport hashlib # 有MD5加密方法hl hashlib.md5()hl.update(({}-{}-{}-{}.format(uid, name, password, salt)).encode(utf-8))sign hl.hexdigest() # 对hl对象中保存的字段进行md5加密算法print(sign)data {uid: 3,sign: sign}resp requests.post(, jsondata)print(resp.text)if __name__ __main__:test1()10.接口参数关联import requests# 接口参数关联下一个请求的入参是上一请求的出参def test1():data {username: qcj,password: 123456}resp requests.post(, datadata) # 请求第一个接口resp_json resp.json() # 第一个接口响应的json内容auth_token resp_json[data] # 提取第一个接口的data出参headers {auth-token: auth_token}resp requests.get(, headersheaders) # 请求第二个接口print(resp.text)if __name__ __main__:test1()四、接口测试返回值的处理为什么我们需要关心接口返回的响应值原因我们需要对返回的响应内容进行断言对比实际结果与预期结果从而验证接口工作是否正常。接口响应内容的形式主要有三种形式JSON格式的字符串HTML源码程序员自定义的字符串。主要的处理方式处理方式1正则表达式来进行处理这种方法适合以上三种响应内容形式。处理方式2lxml库进行处理这种方式仅针对返回内容是HTML源码形式的。处理方式3直接使用requests库自带的json方法进行处理这种方式仅针对返回内容是json形式的。1.re库正则表达式获取指定内容最常用的一个正则表达式.*?的使用。正则表达式特殊字符组合练习import re # 正则表达式的库log now: 2020-04-15 23:44:34 id: ST0013 status: noknow: 2020-04-26 09:33:14 id: DAMX002 status: goodnow: 2020-04-17 22:27:39 id: SIMKOIF0 status: wellnow: 2020-04-18 16:45:30 id: 04 status: unknown# \s表示空格 \d{4}表示4个十进制数字开始 \s表示一个或多个空格dt re.findall(now:\s(\d{4}-\d{2}-\d{2})\s(\d{2}:\d{2}:\d{2}), log)# \s表示一个或多个空格 \w*表示任意个字母 \d表示一个或多个十进制数sid re.findall(id:\s(\w*\d), log)# \s表示一个或多个空格 \w表示一个或多个字母status re.findall(status:\s(\w), log)print(dt)print(sid)print(status)运行结果正则表达式.*?法取出文件里面的某个字段值import re # 正则表达式的库# 从文件中截取某个字段的值with open(zzlb.txt, r) as f:content f.read()result re.findall(SNAME:(.*?), content) # 截取文件中SNAME字段的值print(result)正则表达式.*?法取出HTML源码里面的某个字段值import re # 正则表达式的库# 正则表达式中换行符的处理content ullia href111.html\n/a/lilia href222.html\n/a/lilia href333.html\n/a/lilia href444.html\n/a/li/ulresult re.findall(href(.*?), content, re.S) # 处理html格式的有换行符的需要加re.Sprint([item.strip() for item in result]) # \n相当于空格可以用strip去掉运行结果2.lxml库处理响应内容是HTML源码lxml库进行处理这种方式仅针对返回内容是HTML源码形式的。例子登录进去的页面会有注销或者退出登录的字段验证登录是否成功可以提取登录进去页面的HTML源码中的注销字段来验证。# 解析HTML文档格式响应from lxml import etreeimport requestsdef verifylogin():headers {cookie: # 登录后的cookie}resp requests.get(, headersheaders) # 登录后的urlresp.encoding utf-8 # 防止中文乱码html etree.HTML(resp.text) # 获取登录后页面的HTMLresult html.xpath(//a[hrefjavascript:logoff()]/text()) # 获取指定a元素上显示的文本信息print(result)if __name__ __main__:verifylogin()3.requests库处理响应内容是json形式查看json格式的网站bejson要先清楚响应内容的json结构层级字典里面的层级。响应内容import requestsdef verifylogin():headers {cookie: # 登录后的cookie}data {page: 1,rows: 5} # 参数resp requests.post(, headersheaders, datadata) # 登录后的urlresp_json resp.json() # 通过json方法将resp对象转换为一个json对象print(resp_json[people][1][lastName])if __name__ __main__:verifylogin()运行结果Hunter五、ApifoxApifox是接口管理开发测试全流程集成工具通过一套系统一份数据解决多个系统之间的数据同步问题。只要定义好接口文档接口调试数据Mock接口测试就可以直接使用无需再次定义。接口文档和接口开发调试使用同一个工具接口调试完成后即可保证和接口文档定义完全一致。高校及时准确。Postman Swagger Mock JMeter ApiFox下载安装官网https://www.apifox.cn/ 下载安装按照指示来很简单创建get请求创建Post请求接口关联上一个请求的响应内容有作为下个请求的入参第一个请求后置操作添加变量第二请求可将变量值作为headers值或参数值多条数据命令的方式运行接口自动化脚本1先安装apifox-cli库cmd中输入命令nmp install -g apifox-cli如果报错unable to verify the first cortificato则分别输入以下两个命令npm config set strict-ssl falsenmp install -g apifox-cli2然后将apifox中的测试用例导出来3将到处的自动化脚本和测试数据文件放在一一个目录在这个目录下打开cmd输入命令apifox run 测试用例文件名 -d 测试数据文件名 -n 2 -r html-d 测试用到的数据文件比如data.csv-n 循环次数-r 在当前路径生成测试报告并指定报告格式例如apifox run 回归测试 -d 测试数据文件名 -n 2 -r html例如apifox run 回归测试.apifox-cli.json -d data.csv -n 2 -r html导出接口文档相比其他接口测试工具的优点(1可以创建系统邀请多个系统人员参与。(2)进行接口设计然后添加数据变成接口测试用例如果修改接口设计同时测试用例也会被修改。(3) 执行接口测试用例响应是JSON格式会自动录入接口设计文档。(4)多个测试用例组成集合可以一键运行生成测试报告。(5)可以连接数据库执行sql脚本能生成接口代码。(6)可以多条测试数据导入进行测试总结感谢每一个认真阅读我文章的人作为一位过来人也是希望大家少走一些弯路如果你不想再体验一次学习时找不到资料没人解答问题坚持几天便放弃的感受的话在这里我给大家分享一些自动化测试的学习资源希望能给你前进的路上带来帮助。软件测试面试文档我们学习必然是为了找到高薪的工作下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料并且有字节大佬给出了权威的解答刷完这一套面试资料相信大家都能找到满意的工作。视频文档获取方式这份文档和视频资料对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库这个仓库也陪伴我走过了最艰难的路程希望也能帮助到你以上均可以分享点下方小卡片即可自行领取。