练习接口测试第一步骤

最近一段时间学了Python语言,重新学了 Java,js,html语言,CSS,linux,一堆测试工具;唉~

在接触接口测试过程中补了很多课,

终于有点领悟接口测试的根本;

偶是个实用派~,那么现实中没有用的东西,基本上我都不会有很大的概念;

下面给的是接口测试的统一大步骤,其实就是让我们对接口测试有一个整体的概念,我们要做或学习接口测试,应该从那些地方着手,也就是告诉你,百度搜索了半天接口测试之后,我还是没有概念,那怎么办呢,那么下面这些步骤就是,你需要把接口测试拆开来了解的步骤;

如第一步,百度之后,要研究什么是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. 1 # Lawsuit_interface_unittest.py

  2. 2 # coding:utf-8

  3. 3

  4. 4 import json

  5. 5 import unittest

  6. 6 from suds.client import Client

  7. 7

  8. 8

  9. 9 class Lawsuit_interface_testing(unittest.TestCase):

  10. 10

  11. 11 def setUp(self):

  12. 12 self.url = "http://.....:8080/sys/webservice/sysNotifyTodoWebService?wsdl"

  13. 13 self.client = Client(self.url) #

  14. 14

  15. 15 def tearDown(self):

  16. 16 pass

  17. 17

  18. 18 def test_getTodo(self):

  19. 19

  20. 20 notify_TodoGetContext = self.client.factory.create(

  21. 21 'notifyTodoGetContext')

  22. 22 notify_TodoGetContext.otherCond = ""

  23. 23 notify_TodoGetContext.pageNo = 1

  24. 24 notify_TodoGetContext.rowSize = 3

  25. 25 notify_TodoGetContext.targets = json.dumps(

  26. 26 {"LoginName": "xiaoming"})

  27. 27 notify_TodoGetContext.type = 1

  28. 28 notify_TodoAppResult = self.client.service.getTodo(

  29. 29 notify_TodoGetContext)

  30. 30 returnState = notify_TodoAppResult.returnState

  31. 31 self.assertEqual(returnState, 2)

  32. 32

  33. 33 def test_sendTodo(self):

  34. 34

  35. 35 notify_TodoSendContext = self.client.factory.create(

  36. 36 'notifyTodoSendContext')

  37. 37 notify_TodoSendContext.appName = "Lawsuit"

  38. 38 notify_TodoSendContext.createTime = "2015-11-27 15:32:39"

  39. 39 notify_TodoSendContext.key = ''

  40. 40 notify_TodoSendContext.link = 'http://wwww.baidu.com'

  41. 41 notify_TodoSendContext.subject = 'Lawsuit_testing'

  42. 42 notify_TodoSendContext.modelId = '123456789'

  43. 43 notify_TodoSendContext.modelName = "Lawsuit"

  44. 44 notify_TodoSendContext.targets = json.dumps(

  45. 45 {"LoginName": "xiaoming"})

  46. 46 notify_TodoSendContext.type = 1

  47. 47 notify_TodoAppResult = self.client.service.sendTodo(

  48. 48 notify_TodoSendContext)

  49. 49 returnState = notify_TodoAppResult.returnState

  50. 50 self.assertEqual(returnState, 2)

  51. 51

  52. 52 def test_deleteTodo(self):

  53. 53

  54. 54 notify_TodoRemoveContext = self.client.factory.create(

  55. 55 'notifyTodoRemoveContext')

  56. 56 notify_TodoRemoveContext.appName = "Lawsuit"

  57. 57 notify_TodoRemoveContext.modelId = '123456789'

  58. 58 notify_TodoRemoveContext.key = ''

  59. 59 notify_TodoRemoveContext.modelName = "Lawsuit"

  60. 60 notify_TodoRemoveContext.optType = 1

  61. 61 notify_TodoRemoveContext.targets = json.dumps(

  62. 62 {"LoginName": "xiaoming"})

  63. 63 notify_TodoAppResult = self.client.service.deleteTodo(

  64. 64 notify_TodoRemoveContext)

  65. 65 returnState = notify_TodoAppResult.returnState

  66. 66 self.assertEqual(returnState, 2)

  67. 67

  68. 68 def test_setTodoDone(self):

  69. 69

  70. 70 notify_TodoRemoveContext = self.client.factory.create(

  71. 71 'notifyTodoRemoveContext')

  72. 72 notify_TodoRemoveContext.appName = "Lawsuit"

  73. 73 notify_TodoRemoveContext.modelId = '123456789'

  74. 74 notify_TodoRemoveContext.key = ''

  75. 75 notify_TodoRemoveContext.modelName = "Lawsuit_testing"

  76. 76 notify_TodoRemoveContext.optType = 1

  77. 77 notify_TodoRemoveContext.targets = json.dumps(

  78. 78 {"LoginName": "xiaoming"})

  79. 79 notify_TodoAppResult = self.client.service.setTodoDone(

  80. 80 notify_TodoRemoveContext)

  81. 81 returnState = notify_TodoAppResult.returnState

  82. 82 self.assertEqual(returnState, 2)

  83. 83

  84. 84

  85. 85 if __name__ == '__main__':

  86. 86 unittest.main()

 第二版 使用excel 数据驱动

  1. 1 # Lawsuit_interface_unittest_excel_v1.1.py

  2. 2 # coding:utf-8

  3. 3

  4. 4 import unittest

  5. 5 import json

  6. 6 import xlrd

  7. 7 from suds.client import Client

  8. 8 import time

  9. 9 import sys

  10. 10

  11. 11

  12. 12 class Lawsuit_interface_testing(unittest.TestCase):

  13. 13

  14. 14 def setUp(self):

  15. 15 self.url ='http:// xx?wsdl'

  16. 16 self.client = Client(self.url)

  17. 17 self.xlsfile = r'lawsuit_casedata.xlsx'

  18. 18 self.excel_data(self.xlsfile)

  19. 19

  20. 20 def tearDown(self):

  21. 21 pass

  22. 22

  23. 23 def test_getToDO(self):

  24. 24

  25. 25 self.Cannot_find_file(self.xlsfile)

  26. 26

  27. 27 notify_TodoGetContext = self.client.factory.create(

  28. 28 'notifyTodoGetContext')

  29. 29 notify_TodoGetContext.pageNo = self.pageNo_value

  30. 30 notify_TodoGetContext.rowSize = self.rowSize_value

  31. 31 # another way to json

  32. 32 # notify_TodoGetContext.targets = "{ \"LoginName\": \"xiaoming\" }"

  33. 33 notify_TodoGetContext.targets = self.targets_value

  34. 34 notify_TodoGetContext.type = self.ptype_value

  35. 35

  36. 36 notify_TodoAppResult = self.client.service.getTodo(

  37. 37 notify_TodoGetContext)

  38. 38 returnState = notify_TodoAppResult.returnState

  39. 39

  40. 40 print returnState

  41. 41 self.assertEqual(returnState, 2)

  42. 42

  43. 43 def test_sendTodo(self):

  44. 44 self.Cannot_find_file(self.xlsfile)

  45. 45

  46. 46 notify_TodoSendContext = self.client.factory.create(

  47. 47 'notifyTodoSendContext')

  48. 48 notify_TodoSendContext.appName = self.appName_value

  49. 49 notify_TodoSendContext.createTime = self.creatime_value

  50. 50 # notify_TodoSendContext.key = ''

  51. 51 notify_TodoSendContext.link = self.link_value

  52. 52 notify_TodoSendContext.subject = self.subject_value

  53. 53 notify_TodoSendContext.modelId = self.modelId_value

  54. 54 notify_TodoSendContext.modelName = self.modelName_value

  55. 55 notify_TodoSendContext.targets = self.targets_value

  56. 56 notify_TodoSendContext.type = self.ptype_value

  57. 57 notify_TodoAppResult = self.client.service.sendTodo(

  58. 58 notify_TodoSendContext)

  59. 59 returnState = notify_TodoAppResult.returnState

  60. 60 self.assertEqual(returnState, 2)

  61. 61

  62. 62 def test_deleteTodo(self):

  63. 63 self.Cannot_find_file(self.xlsfile)

  64. 64

  65. 65 notify_TodoRemoveContext = self.client.factory.create(

  66. 66 'notifyTodoRemoveContext')

  67. 67 notify_TodoRemoveContext.appName = self.appName_value

  68. 68 notify_TodoRemoveContext.modelId = self.modelId_value

  69. 69 # notify_TodoRemoveContext.key = ''

  70. 70 notify_TodoRemoveContext.modelName = self.modelName_value

  71. 71 notify_TodoRemoveContext.optType = self.optType_value

  72. 72 notify_TodoRemoveContext.targets = self.targets_value

  73. 73 notify_TodoAppResult = self.client.service.deleteTodo(

  74. 74 notify_TodoRemoveContext)

  75. 75 returnState = notify_TodoAppResult.returnState

  76. 76 self.assertEqual(returnState, 2)

  77. 77

  78. 78 def test_setTodoDone(self):

  79. 79 self.Cannot_find_file(self.xlsfile)

  80. 80

  81. 81 notify_TodoRemoveContext = self.client.factory.create(

  82. 82 'notifyTodoRemoveContext')

  83. 83 notify_TodoRemoveContext.appName = self.appName_value

  84. 84 notify_TodoRemoveContext.modelId = self.modelId_value

  85. 85 # notify_TodoRemoveContext.key = ''

  86. 86 notify_TodoRemoveContext.modelName = self.modelName_value

  87. 87 notify_TodoRemoveContext.optType = self.optType_value

  88. 88 notify_TodoRemoveContext.targets = self.targets_value

  89. 89 notify_TodoAppResult = self.client.service.setTodoDone(

  90. 90 notify_TodoRemoveContext)

  91. 91 returnState = notify_TodoAppResult.returnState

  92. 92 self.assertEqual(returnState, 2)

  93. 93

  94. 94 def excel_data(self, xlsfile):

  95. 95

  96. 96 self.Cannot_find_file(self.xlsfile)

  97. 97 book = xlrd.open_workbook(xlsfile)

  98. 98 api_sheet = book.sheet_by_index(0)

  99. 99 nrows = api_sheet.nrows

  100. 100 for i in range(1, nrows):

  101. 101 caseID = api_sheet.cell(i, 0)

  102. 102 appName = api_sheet.cell(i, 1)

  103. 103 creatime = time.strftime(

  104. 104 time.strftime('%Y-%m-%d %X', time.localtime(time.time())))

  105. 105 link = api_sheet.cell(i, 3)

  106. 106 subject = api_sheet.cell(i, 4)

  107. 107 modelId = api_sheet.cell(i, 5)

  108. 108 modelName = api_sheet.cell(i, 6)

  109. 109 targets = api_sheet.cell(i, 7)

  110. 110 ptype = api_sheet.cell(i, 8)

  111. 111 pageNo = api_sheet.cell(i, 9)

  112. 112 rowSize = api_sheet.cell(i, 10)

  113. 113 optType = api_sheet.cell(i, 11)

  114. 114 # returnstatue = api_sheet.cell(i, 12)

  115. 115 # message = api_sheet.cell(i, 13)

  116. 116 if api_sheet.cell(i, 0).ctype != 0:

  117. 117 # caseID_value=str(int(caseID.value))

  118. 118 self.appName_value = appName.value

  119. 119 self.creatime_value=creatime

  120. 120 self.link_value = link.value

  121. 121 self.subject_value = subject.value

  122. 122 self.modelId_value = modelId.value

  123. 123 self.modelName_value = modelName.value

  124. 124 # print type(targets)

  125. 125 self.targets_value = targets.value

  126. 126 # print type(targets.value)

  127. 127 self.ptype_value = int(ptype.value)

  128. 128 self.pageNo_value = int(pageNo.value)

  129. 129 self.rowSize_value = int(rowSize.value)

  130. 130 self.optType_value = int(optType.value)

  131. 131

  132. 132 # returnstatue_value=returnstatue.value

  133. 133 # message_value=message.value

  134. 134 else:

  135. 135 return 0

  136. 136 # data1=

  137. 137

  138. 138 # return data1

  139. 139

  140. 140 # exception

  141. 141

  142. 142 def Cannot_find_file(self, xlsfile):

  143. 143 try:

  144. 144 foo = open(self.xlsfile)

  145. 145 except EnvironmentError as err:

  146. 146 print "Unable to open file:{}".format(err)

  147. 147 sys.exit(1)

  148. 148

  149. 149

  150. 150 if __name__ == '__main__':

  151. 151 unittest.main()

 

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

  视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/393072.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

笔记 记录

前言 个人记录 官网模版 基于 vue2 示例图

C++初阶:容器适配器介绍、stack和queue常用接口详解及模拟实现

介绍完了list类的相关内容后:C初阶:适合新手的手撕list(模拟实现list) 接下来进入新的篇章,stack和queue的介绍以及模拟: 文章目录 1.stack的初步介绍2.stack的使用3.queue的初步介绍4.queue的使用5.容器适…

gspread,一个超强的 Python 库!

更多Python学习内容:ipengtao.com 大家好,今天为大家分享一个超强的 Python 库 - gspread。 Github地址:https://github.com/burnash/gspread Google Sheets是一款强大的在线电子表格工具,而gspread是一个Python库,可以…

Sentinel从入门到“精通”,从源码层面学习Sentinel

B站视频讲解 文章目录 一、安装1、原生使用2、dashboard整合2-1、非starter整合2-1-1、公共2-1-2、Filter2-1-3、AOP2-2、starter 整合 3、总结 二、常见的策略1、限流1-1、基于QPS 限流1-2、基于线程数限流 2、降级2-1、慢调用比例2-2、异常数(限流异常不算&#x…

C++ 蛇形矩阵的制作

#include <stdio.h>int arr[101][101]; int n; int i,j; int m; int tmp; void Print(){for(i1;i<n;i){for(j1;j<n-i1;j)printf("%d ",arr[i][j]);puts("");} }void fun(){//i j 初值为1i1,j1;//保底用 tmp 1;//计数从1开始m 1;while(1)…

异常—JAVA

文章目录 异常的概念异常的体系结构异常的分类运行时异常 异常的处理防御式编程异常的抛出异常的捕获异常声明throwstry—catch捕获并处理finally 异常的处理流程自定义异常类 异常的概念 首先在学习之前我们要先知道什么是异常&#xff0c;异常简单来说就是不对的地方我们说一…

MySQL DQL 基本查询

一.概念 数据查询不应只是简单返回数据库中存储的数据&#xff0c;还应该根据需要对数据进行筛选以及确定数据以什么样的格式显示。 二.语法格式 select 列名 from 表 where 条件 1.查询所有的商品 select * from product; 2.查询商品名和商品价格 select pname,price from…

Python实现时间序列分析简单指数平滑模型(SimpleExpSmoothing算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 时间序列分析中的简单指数平滑&#xff08;Simple Exponential Smoothing, SES&#xff09;模型是一种…

哈希表——位图

哈希表——位图 基本概念一道面试题位图实现设置存在或不存在检查存在 解决一开始的问题 之前我们已经了解了哈希表的底层实现&#xff0c;今天我们来了解一下哈希表思想的衍生产物——位图。 基本概念 在了解位图之前&#xff0c;我们先来了解一些简单的概念。 我们都知道&a…

控制程序执行流程

资源 资源下载 【免费】突破密码认证程序&#xff08;修改函数返回地址&#xff09;资源-CSDN文库 资源内容 源码 在上一篇文章里 修改函数返回地址-CSDN博客 流程 对程序进行编译 思路 了解栈的情况&#xff08;函数地址、缓冲区偏移量&#xff09;程序中密码认证的地…

力扣 第 385 场周赛 解题报告 | 珂学家 | 字典树专场

前言 整体评价 这是一场字典树专场&#xff0c;除了t3这个小模拟之外&#xff0c;1&#xff0c;2&#xff0c;4皆可用字典树搞定。 T4感觉做法挺多的&#xff0c;其实&#xff0c;但是字典树应该效率最高的。 T1. 统计前后缀下标对 I 思路: 模拟 O ( n 2 ) O(n^2) O(n2)全遍…

D3842——三极管驱动,专为脱线和Dc-Dc开关电源应用设计的,起动电流小

D3842/43/44是专为脱线和Dc-Dc开关电源应用设计的恒频电流型Pwd控制器内部包含温度补偿精密基准、供精密占空比调节用的可调振荡器、高增益混放大器、电流传感比较器和适合作功率MOST驱动用的大电流推挽输出颇以及单周期徊滞式限流欠压锁定、死区可调、单脉冲计数拴锁等保护电路…

【RL】Monte Carlo Learning(蒙特卡洛学习)

Lecture 5: Monte Carlo Learning The simplest MC-based RL algorithm: MC Basic 理解MC basic算法的关键是理解如何将policy iteration算法迁移到model-free的条件下。 Policy iteration算法在每次迭代过程中有两步&#xff1a; { Policy evaluation: v π k r π k γ…

山西电力市场日前价格预测【2024-02-16】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-02-16&#xff09;山西电力市场全天平均日前电价为55.97元/MWh。其中&#xff0c;最高日前电价为314.75元/MWh&#xff0c;预计出现在18:45。最低日前电价为0.00元/MWh&#xff0c;预计出现…

Conda管理Python不同版本教程

Conda管理Python不同版本教程 目录 0.前提 1.conda常用命令 2.conda管理python库 不太推荐 pyenv管理Python不同版本教程&#xff08;本人另一篇博客&#xff0c;姊妹篇&#xff09; 0.前提 ①anaconda、miniconda&#xff08;2个的下载仓库&#xff09;在win上推荐前者&a…

为什么将二维码分解成文字? 二维码在线转文字的方法

将二维码分解成文字的主要目的是为了方便人们获取二维码中的信息便于使用。二维码是一种由黑白方块组成的图案&#xff0c;可以存储大量的数据&#xff0c;如网址、联系方式、产品信息等。然而&#xff0c;对于一些特定的场景或个人需求&#xff0c;无法直接扫描二维码。因此&a…

ubuntu22.04@laptop OpenCV Get Started: 013_contour_detection

ubuntu22.04laptop OpenCV Get Started: 013_contour_detection 1. 源由2. 应用Demo2.1 C应用Demo2.2 Python应用Demo 3. contour_approx应用3.1 读取图像并将其转换为灰度格式3.2 应用二进制阈值过滤算法3.3 查找对象轮廓3.4 绘制对象轮廓3.5 效果3.6 CHAIN_APPROX_SIMPLE v.s…

vue的生命周期图解

vue的生命周期图解 添加链接描述 vue的生命周期函数及过程的简述&#xff1a; vue的生命周期函数&#xff0c;其实就是vm的生命周期&#xff1b; 创建&#xff1a;beforeCreate、created 挂载&#xff1a;beforeMount、mounted 更新&#xff1a;beforeUpdate、updated [ˌʌpˈ…

数字化转型导师坚鹏:数字化思维创新与BLM政府数字化转型战略

数字化思维创新与BLM政府数字化转型战略 ——以BLM模型为核心&#xff0c;践行知行合一思想&#xff0c;实现知行果合一 课程背景&#xff1a; 很多政府存在以下问题&#xff1a; 不知道如何系统地开展数字化转型工作&#xff1f; 不清楚如何高效地执行数字化转型战略&a…

解读OpenAI视频生成模型Sora背后的原理:Diffusion Transformer

Diffusion Models视频生成-博客汇总 前言&#xff1a;OpenAI最近推出的视频生成模型Sora在效果上实现了真正的遥遥领先&#xff0c;很多博主都介绍过Sora&#xff0c;但是深入解读背后原理的博客却非常少。Sora的原理最主要的是核心模型主干《Scalable Diffusion Models with T…