接口测试练习步骤
在接触接口测试过程中补了很多课,
终于有点领悟接口测试的根本;
偶是个实用派~,那么现实中没有用的东西,基本上我都不会有很大的概念;
下面给的是接口测试的统一大步骤,其实就是让我们对接口测试有一个整体的概念,我们要做或学习接口测试,应该从那些地方着手,也就是告诉你,百度搜索了半天接口测试之后,我还是没有概念,那怎么办呢,那么下面这些步骤就是,你需要把接口测试拆开来了解的步骤;
如第一步,百度之后,要研究什么是resful,怎么个增删改查;
这些步骤都可以拆开来,反复实践,等把这些步骤都拆开来,实践完了,你的接口测试也就通透了,通杀所有接口测试
接口测试:Http类,webservice类 其实大同小异
找一个你自己的项目,没人做过接口测试的也可以,这样你可以自己想明白 怎么测,而不是用别人的思想,思想。。。最重要,可是没有思路到有思路的路程并不长,只是你要开始做这个事情,相信我,会很快,你发现自己确实很聪明~~~~~~
声明:我的这些东西之所以能入门,主要归功于乙醇大神的接口测试概念和冯xx朋友的不吝赐教以及网络上的各种散碎思想;
第一步: 先要明白你要测什么? 本质就是增,删,改,查。(学名叫 resful);
第二步:先用网上推荐的工具来感觉一下(比如:postman, 比如:SoapUI)
第三步:get, post, put, delete 大概怎么个用法,比如传参(比如 json串),怎么看结果(这些确实需要你有些技术基础的,比如 端口,返回值,编码类型)
第四步:那么,那么,我们学了语言,那就来用用吧(一定要拿写好的接口例子来看看,要不然,你不知道用这个语言的什么包或什么函数来帮我们获取到URl的数据等...)
第五步:那么我们加入框架吧(Unittest),这样和前面你的老版本,自创的那一版对比一下,会感触~~,然后明白为什么用框架, 实践确实是个有意思的事情;
第六步:把你的那些参数放入数据库,或者excel等等 实现数据驱动;倒腾吧
第七步:优化你的代码,反复反复倒腾 重构,你应该在通往 python高手的路上了
第八步:当然如果你会Java但是并不会用它写接口测试,那么把这些用例变成Java吧
第九步:那么你还能干嘛,还多着呢,思考:你现在这个接口是否只测试了A接口,那么B接口能测试吗? 比如C调用A接口,那么C是一个接口呢? 是吗~~ 你能分辨出来吗,把它弄清楚,如果不是接口,或者它是什么,能测试吗,怎么测试?
第十步:自己做一个假的接口(Moco):最好和你现在的项目结合的,比如开发正在开发的(和开发沟通);自己测试
第十一步:自己写一个接口(可以先按照之前开发开发好的接口,照葫芦画瓢一个,那也要画,必须画,谁叫你是做测试的,知己知彼呀~),先简单,后复杂,主要倒腾清楚原理就行,反正你也不做开发(当然如果你想做开发,那去做开发吧,别在这浪费时间);自己测试
第十二步: 开始倒腾 测试第二个接口,这次你直接从第六步开始就行(代码优美可不是一天炼成的)
如果你倒腾的很细的话,本人认为倒腾三个接口应该很够了,最后一定记得拿你这个知识到市场去卖钱哟;科技是第一生产力~~
其实,其实 有了这个基础 应该倒腾自动化的其他就不难了
第一版 unittest 框架源码
1 # Lawsuit_interface_unittest.py2 # coding:utf-83 4 import json5 import unittest6 from suds.client import Client7 8 9 class Lawsuit_interface_testing(unittest.TestCase):
10
11 def setUp(self):
12 self.url = "http://.....:8080/sys/webservice/sysNotifyTodoWebService?wsdl"
13 self.client = Client(self.url) #
14
15 def tearDown(self):
16 pass
17
18 def test_getTodo(self):
19
20 notify_TodoGetContext = self.client.factory.create(
21 'notifyTodoGetContext')
22 notify_TodoGetContext.otherCond = ""
23 notify_TodoGetContext.pageNo = 1
24 notify_TodoGetContext.rowSize = 3
25 notify_TodoGetContext.targets = json.dumps(
26 {"LoginName": "xiaoming"})
27 notify_TodoGetContext.type = 1
28 notify_TodoAppResult = self.client.service.getTodo(
29 notify_TodoGetContext)
30 returnState = notify_TodoAppResult.returnState
31 self.assertEqual(returnState, 2)
32
33 def test_sendTodo(self):
34
35 notify_TodoSendContext = self.client.factory.create(
36 'notifyTodoSendContext')
37 notify_TodoSendContext.appName = "Lawsuit"
38 notify_TodoSendContext.createTime = "2015-11-27 15:32:39"
39 notify_TodoSendContext.key = ''
40 notify_TodoSendContext.link = 'http://wwww.baidu.com'
41 notify_TodoSendContext.subject = 'Lawsuit_testing'
42 notify_TodoSendContext.modelId = '123456789'
43 notify_TodoSendContext.modelName = "Lawsuit"
44 notify_TodoSendContext.targets = json.dumps(
45 {"LoginName": "xiaoming"})
46 notify_TodoSendContext.type = 1
47 notify_TodoAppResult = self.client.service.sendTodo(
48 notify_TodoSendContext)
49 returnState = notify_TodoAppResult.returnState
50 self.assertEqual(returnState, 2)
51
52 def test_deleteTodo(self):
53
54 notify_TodoRemoveContext = self.client.factory.create(
55 'notifyTodoRemoveContext')
56 notify_TodoRemoveContext.appName = "Lawsuit"
57 notify_TodoRemoveContext.modelId = '123456789'
58 notify_TodoRemoveContext.key = ''
59 notify_TodoRemoveContext.modelName = "Lawsuit"
60 notify_TodoRemoveContext.optType = 1
61 notify_TodoRemoveContext.targets = json.dumps(
62 {"LoginName": "xiaoming"})
63 notify_TodoAppResult = self.client.service.deleteTodo(
64 notify_TodoRemoveContext)
65 returnState = notify_TodoAppResult.returnState
66 self.assertEqual(returnState, 2)
67
68 def test_setTodoDone(self):
69
70 notify_TodoRemoveContext = self.client.factory.create(
71 'notifyTodoRemoveContext')
72 notify_TodoRemoveContext.appName = "Lawsuit"
73 notify_TodoRemoveContext.modelId = '123456789'
74 notify_TodoRemoveContext.key = ''
75 notify_TodoRemoveContext.modelName = "Lawsuit_testing"
76 notify_TodoRemoveContext.optType = 1
77 notify_TodoRemoveContext.targets = json.dumps(
78 {"LoginName": "xiaoming"})
79 notify_TodoAppResult = self.client.service.setTodoDone(
80 notify_TodoRemoveContext)
81 returnState = notify_TodoAppResult.returnState
82 self.assertEqual(returnState, 2)
83
84
85 if __name__ == '__main__':
86 unittest.main()
第二版 使用excel 数据驱动
1 # Lawsuit_interface_unittest_excel_v1.1.py2 # coding:utf-83 4 import unittest5 import json6 import xlrd7 from suds.client import Client8 import time9 import sys10 11 12 class Lawsuit_interface_testing(unittest.TestCase):13 14 def setUp(self):15 self.url ='http:// xx?wsdl'16 self.client = Client(self.url)17 self.xlsfile = r'lawsuit_casedata.xlsx'18 self.excel_data(self.xlsfile)19 20 def tearDown(self):21 pass22 23 def test_getToDO(self):24 25 self.Cannot_find_file(self.xlsfile)26 27 notify_TodoGetContext = self.client.factory.create(28 'notifyTodoGetContext')29 notify_TodoGetContext.pageNo = self.pageNo_value30 notify_TodoGetContext.rowSize = self.rowSize_value31 # another way to json32 # notify_TodoGetContext.targets = "{ \"LoginName\": \"xiaoming\" }"33 notify_TodoGetContext.targets = self.targets_value34 notify_TodoGetContext.type = self.ptype_value35 36 notify_TodoAppResult = self.client.service.getTodo(37 notify_TodoGetContext)38 returnState = notify_TodoAppResult.returnState39 40 print returnState41 self.assertEqual(returnState, 2)42 43 def test_sendTodo(self):44 self.Cannot_find_file(self.xlsfile)45 46 notify_TodoSendContext = self.client.factory.create(47 'notifyTodoSendContext')48 notify_TodoSendContext.appName = self.appName_value49 notify_TodoSendContext.createTime = self.creatime_value50 # notify_TodoSendContext.key = ''51 notify_TodoSendContext.link = self.link_value52 notify_TodoSendContext.subject = self.subject_value53 notify_TodoSendContext.modelId = self.modelId_value54 notify_TodoSendContext.modelName = self.modelName_value55 notify_TodoSendContext.targets = self.targets_value56 notify_TodoSendContext.type = self.ptype_value57 notify_TodoAppResult = self.client.service.sendTodo(58 notify_TodoSendContext)59 returnState = notify_TodoAppResult.returnState60 self.assertEqual(returnState, 2)61 62 def test_deleteTodo(self):63 self.Cannot_find_file(self.xlsfile)64 65 notify_TodoRemoveContext = self.client.factory.create(66 'notifyTodoRemoveContext')67 notify_TodoRemoveContext.appName = self.appName_value68 notify_TodoRemoveContext.modelId = self.modelId_value69 # notify_TodoRemoveContext.key = ''70 notify_TodoRemoveContext.modelName = self.modelName_value71 notify_TodoRemoveContext.optType = self.optType_value72 notify_TodoRemoveContext.targets = self.targets_value73 notify_TodoAppResult = self.client.service.deleteTodo(74 notify_TodoRemoveContext)75 returnState = notify_TodoAppResult.returnState76 self.assertEqual(returnState, 2)77 78 def test_setTodoDone(self):79 self.Cannot_find_file(self.xlsfile)80 81 notify_TodoRemoveContext = self.client.factory.create(82 'notifyTodoRemoveContext')83 notify_TodoRemoveContext.appName = self.appName_value84 notify_TodoRemoveContext.modelId = self.modelId_value85 # notify_TodoRemoveContext.key = ''86 notify_TodoRemoveContext.modelName = self.modelName_value87 notify_TodoRemoveContext.optType = self.optType_value88 notify_TodoRemoveContext.targets = self.targets_value89 notify_TodoAppResult = self.client.service.setTodoDone(90 notify_TodoRemoveContext)91 returnState = notify_TodoAppResult.returnState92 self.assertEqual(returnState, 2)93 94 def excel_data(self, xlsfile):95 96 self.Cannot_find_file(self.xlsfile)97 book = xlrd.open_workbook(xlsfile)98 api_sheet = book.sheet_by_index(0)99 nrows = api_sheet.nrows
100 for i in range(1, nrows):
101 caseID = api_sheet.cell(i, 0)
102 appName = api_sheet.cell(i, 1)
103 creatime = time.strftime(
104 time.strftime('%Y-%m-%d %X', time.localtime(time.time())))
105 link = api_sheet.cell(i, 3)
106 subject = api_sheet.cell(i, 4)
107 modelId = api_sheet.cell(i, 5)
108 modelName = api_sheet.cell(i, 6)
109 targets = api_sheet.cell(i, 7)
110 ptype = api_sheet.cell(i, 8)
111 pageNo = api_sheet.cell(i, 9)
112 rowSize = api_sheet.cell(i, 10)
113 optType = api_sheet.cell(i, 11)
114 # returnstatue = api_sheet.cell(i, 12)
115 # message = api_sheet.cell(i, 13)
116 if api_sheet.cell(i, 0).ctype != 0:
117 # caseID_value=str(int(caseID.value))
118 self.appName_value = appName.value
119 self.creatime_value=creatime
120 self.link_value = link.value
121 self.subject_value = subject.value
122 self.modelId_value = modelId.value
123 self.modelName_value = modelName.value
124 # print type(targets)
125 self.targets_value = targets.value
126 # print type(targets.value)
127 self.ptype_value = int(ptype.value)
128 self.pageNo_value = int(pageNo.value)
129 self.rowSize_value = int(rowSize.value)
130 self.optType_value = int(optType.value)
131
132 # returnstatue_value=returnstatue.value
133 # message_value=message.value
134 else:
135 return 0
136 # data1=
137
138 # return data1
139
140 # exception
141
142 def Cannot_find_file(self, xlsfile):
143 try:
144 foo = open(self.xlsfile)
145 except EnvironmentError as err:
146 print "Unable to open file:{}".format(err)
147 sys.exit(1)
148
149
150 if __name__ == '__main__':
151 unittest.main()
2023最新Jmeter接口测试从入门到精通(全套项目实战教程)
相关文章:

接口测试练习步骤
在接触接口测试过程中补了很多课, 终于有点领悟接口测试的根本; 偶是个实用派~,那么现实中没有用的东西,基本上我都不会有很大的概念; 下面给的是接口测试的统一大步骤,其实就是让我们对接口…...

Qt/C++音视频开发56-udp推流和拉流/组播和单播推流
一、前言 之前已经实现了rtsp/rtmp推流,rtsp/rtmp/hls/flv/ws-flv/webrtc等拉流,这种一般都需要依赖一个独立的流媒体服务程序,有没有一种更便捷的方式不需要这种依赖,然后又能实现推拉流呢,当然有的那就是udpp推流&a…...

人工智能轨道交通行业周刊-第61期(2023.9.18-9.24)
本期关键词:焊线机器人、智能综合运维管理系统、信号平面图、铁路部门架构、书生浦语大模型 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通…...
for...in 和 for...of 的区别
for...in 和 for...of 都是 JavaScript 中的循环语句,但它们的作用和使用方式略有不同。 1、for..in 循环 for..in 循环用于遍历对象的可枚举属性,它会将对象的每个属性名称(或键名)作为迭代变量来遍历。 以下是 for...in 的基本语法 for (variable …...
高并发系统 - 接口幂等技术方案,高可用系统架构与技术选型
幂等概念来自于数学,在计算机科学中,幂等表示一次后、或多次请求某一资源,应该有同样的影响效果。 在业务表现上一般是同样的数据效果,下面就常用的业务场景,来聊聊幂等的技术方案。 ----------------- 数据层 ----------------- 索引与事务 根据业务需要,给表添加唯一索…...

简单的手机电脑无线传输方案@固定android生成ftp的IP地址(android@windows)
文章目录 abstractwindows浏览android文件环境准备客户端软件无线网络链接步骤其他方法 手机浏览电脑文件公网局域网everythingpython http.server 高级:固定android设备IP准备检查模块是否生效 windows 访问ftp服务器快捷方式命令行方式双击启动方式普通快捷方式映射新的网络位…...

Unity3D 检测鼠标位置的Sprite像素颜色
思路 获取鼠标所在屏幕坐标(Vector2)通过相机ScreenToWorldPoint(Vector3)转为世界坐标 (注意Vector3的z是距离相机的距离,相机需要正交)通过SpriteRenderer访问边界Bounds通过Bounds.Contain检测世界坐标是否在SpriteBounds内通过比例计算来确定在Sprite内的UV坐标…...
layui input 监听事件
//监听表单单选框复选框选择 form.on(radio, function (data) { console.log(data.value); //得到被选中的值 }); //监听表单下拉菜单选择 form.on(select, function (data) { console.log(data.value); //得到被选中的值 }); //监听表单复选框选择 …...

一致性思维链(SELF-CONSISTENCY IMPROVES CHAIN OF THOUGHT REASONING IN LANGUAGE MODELS)
概要 思维链已经在很多任务上取得了非常显著的效果,这篇论文中提出了一种 self-consistency 的算法,来代替 贪婪解码 算法。本方法通过 采样多个思维链集合,然后LLM模型生成后,选择一个最一致的答案作为最后的结果。一致性思维链…...

腾讯云16核服务器配置大全_16核CPU型号性能测评
腾讯云16核CPU服务器有哪些配置可以选择?可以选择标准型S6、标准型SA3、计算型C6或标准型S5等,目前标准型S5云服务器有优惠活动,性价比高,计算型C6云服务器16核性能更高,轻量16核32G28M带宽优惠价3468元15个月…...
HTML中Input elements should have autocomplete attributes的解决方案
kwfwservice.php:1 [DOM] Input elements should have autocomplete attributes (suggested: “current-password”): (More info: https://goo.gl/9p2vKq) <input name"password" id"password" lay-verify"required" placeholder"密码&…...

2808. 使循环数组所有元素相等的最少秒数;1015. 可被 K 整除的最小整数;1001. 网格照明
2808. 使循环数组所有元素相等的最少秒数 核心思想:枚举每个元素作为相等元素最多需要多少秒,然后维护它的最小值。最多需要多少秒是怎么计算的,我们可以把相等值的下标拿出来,然后你会发现两个相邻下标(相邻下标只的…...

Python爬虫在Web应用自动化测试中的应用
在Web应用开发过程中,自动化测试是确保应用质量和稳定性的重要环节。本文将介绍如何使用Python爬虫与自动化测试技术相结合,实现对Web应用进行自动化测试的方法和步骤。通过这种结合,我们可以提高测试效率、减少人力成本,并确保应…...

苹果手机短信删除了怎么恢复?3种有效方法介绍
手机短信是一种即时通信方式,人们可以使用短信来达到快速传递信息的目的。在没有网络或者网络不稳定的时候,短信仍然可以做到发送和接收,这弥补了其他网络通信软件的缺点。 所以说,手机短信仍然是我们生活中不可缺少的一部分。当…...

前端JavaScript中的 == 和 ===区别,以及他们的应用场景,快来看看吧,积累一点知识。
🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 一、等于操作符 二、全等操作符 三、区别 小结 一、等于操作符 等于操作符用两个等于号( &am…...

文献阅读:LIMA: Less Is More for Alignment
文献阅读:LIMA: Less Is More for Alignment 1. 内容简介2. 实验设计 1. 整体实验设计2. 数据准备3. 模型准备4. metrics设计 3. 实验结果 1. 基础实验2. 消解实验3. 多轮对话 4. 结论 & 思考 文献链接:https://arxiv.org/abs/2305.11206 1. 内容简…...

机器学习第十四课--神经网络
总结起来,对于深度学习的发展跟以下几点是离不开的: 大量的数据(大数据)计算资源(如GPU)训练方法(如预训练) 很多时候,我们也可以认为真正让深度学习爆发起来的是数据和算力,这并不是没道理的。 由于神经网络是深度学习的基础,学…...

React(react18)中组件通信04——redux入门
React(react18)中组件通信04——redux入门 1. 前言1.1 React中组件通信的其他方式1.2 介绍redux1.2.1 参考官网1.2.2 redux原理图1.2.3 redux基础介绍1.2.3.1 action1.2.3.2 store1.2.3.3 reducer 1.3 安装redux 2. redux入门例子3. redux入门例子——优…...

最新AI创作系统+ChatGPT网站源码+支持GPT4.0+支持ai绘画+支持国内全AI模型
一、AI创作系统 SparkAi系统是基于很火的GPT提问进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT系统?小编这里写一个详细图文教程吧&#x…...
react+umi项目中引入antd组件报错:“Button”不能用作 JSX 组件解决方案
具体报错信息 “Button”不能用作 JSX 组件。 Its type ‘(props: IProps) > React.ReactElement’ is not a valid JSX element type. 不能将类型“(props: IProps) > React.ReactElement”分配给类型“(props: any, deprecatedLegacyContext?: any) > ReactNode”。…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...

基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...