接口自动化测试面试题
前言
前面总结了一篇关于接口测试的常规面试题,现在接口自动化测试用的比较多,也是被很多公司看好。那么想做接口自动化测试需要具备哪些能力呢?
也就是面试的过程中,面试官会考哪些问题,知道你是不是真的做过接口自动化测试?总的来说问的比较多的就是以下几个问题:
1.json和字典的区别? -对基础数据类型的考察
2.测试的数据你放在哪? -数据与脚本分离
3.参数化 - 数据驱动模式
4.下个接口请求参数依赖上个接口的返回数据 - 参数关联
5.依赖于登录的接口如何处理 -token和session的管理
6.依赖第三方的接口如何处理 -mock模拟数据返回
7.不可逆的操作,如何处理,比如删除一个订单这种接口如何测试 -造数据
8.接口产生的垃圾数据如何清理 - 数据清理
9.一个订单的几种状态如何全部测到,如:未处理,处理中,处理失败,处理成功 - 造数据,改数据库订单状态
10.python如何连接数据库操作?
11.其它的就是运行出报告、代码管理(git)、运行策略和持续集成jenkins相关了
1.json和字典dict的区别?
现在自动化培训烂大街,是个人都能说的上几个框架,面试如果问框架相关问题,求职者只需一瓶82年的雪碧,会吹的让你怀疑人生!
所以面试官为了更清楚的知道你是停留在表面上的花拳绣腿还是有扎实的基础,就不会问框架这种东西了。基本上问几个数据类型的基础就知道有没货了。
那么json和字典到底有什么区别呢?初学者连python的基础数据类型都没搞清楚,直接撸框架,有的人学了几个月可能都迷迷糊糊的,以为json就是字典。这个是肯定不对的。
首先python里面的基础数据类型有:int、str、 float、list、bool、tuple、dict、set这几种类型,里面没json这种数据类型。
JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
由于你的代码是python写的(也有可能是php,java,c,ruby等语言),但是后端接口是java写的(也有可能是其它语言),不同的语言数据类型是不一样的(就好比中国的语言和美国的语言数据类型也不一样,中国的一般说一只羊,一头牛,美国都是 a /an这种单位),所以就导致你提交的数据,别的开发语言无法识别,这就需要规范传输的数据(传输的数据都是一个字符串),大家都遵循一个规范,按一个标准的格式去传输,于是就有就json这种国际化规范的数据类型。
json本质上还是字符串,只是按key:value这种键值对的格式来的字符串
import json# a是字典dict
a = {"a": 1, "b": 2, "c": True}# b是json
b = '{"a": 1, "b": 2, "c": true}'print(type(a))
print(json.dumps(a)) # a转json
运行结果
<class 'dict'>
{"a": 1, "b": 2, "c": true}
<class 'str'>
{'a': 1, 'b': 2, 'c': True}
2.测试的数据你放在哪?
测试数据到底该怎么放,这个是面试官最喜欢问的一个题了,似乎仁者见仁智者见智,没有标准的答案,有的人说放excel,也有的说放.py脚本,也有的说放ini配置文件,
还有放到json,yaml文件,txt文件,甚至有的放数据库,五花八门,一百个做自动化的小伙伴有100个放的地方。
这里总结下测试的数据到底该怎么放?
首先测试的数据是分很多种的,有登录的账户数据,也有注册的账户数据,还有接口的参数,还有邮箱配置的数据等等等等,所以这个题不能一概而论给答死了。要不然就是给自己挖坑。
以下两个大忌不能回答:
测试的数据是不能写死到代码里面的,这个是原则问题,也是写代码的大忌(你要是回答写在代码里面,估计就是回去等通知了)
测试数据放到.py的开头,这种其实很方便,对于少量的,固定不变的数据其实是可以放的,但是面试时候,千万不能这样说,面试官喜欢装逼的方法
测试数据存放总结:
1.对于账号密码,这种管全局的参数,可以用命令行参数,单独抽出来,写的配置文件里(如ini)
2.对于一些一次性消耗的数据,比如注册,每次注册不一样的数,可以用随机函数生成
3.对于一个接口有多组测试的参数,可以参数化,数据放yaml,text,json,excel都可以
4.对于可以反复使用的数据,比如订单的各种状态需要造数据的情况,可以放到数据库,每次数据初始化,用完后再清理
5.对于邮箱配置的一些参数,可以用ini配置文件
6.对于全部是独立的接口项目,可以用数据驱动方式,用excel/csv管理测试的接口数据
7.对于少量的静态数据,比如一个接口的测试数据,也就2-3组,可以写到py脚本的开头,十年八年都不会变更的
总之不同的测试数据,可以用不同的文件管理
3.什么是数据驱动,如何参数化?
参数化和数据驱动的概念这个肯定要知道的,参数化的思想是代码用例写好了后,不需要改代码,只需维护测试数据就可以了,并且根据不同的测试数据生成多个用例
python里面用unittest框架
import unittest
import ddt# 测试数据
datas = [ {"user": "admin", "psw": "123", "result": "true"},{"user": "admin1", "psw": "1234", "result": "true"},{"user": "admin2", "psw": "1234", "result": "true"},{"user": "admin3", "psw": "1234", "result": "true"},{"user": "admin4", "psw": "1234", "result": "true"},{"user": "admin5", "psw": "1234", "result": "true"},{"user": "admin6", "psw": "1234", "result": "true"},{"user": "admin7", "psw": "1234", "result": "true"},{"user": "admin8", "psw": "1234", "result": "true"},{"user": "admin9", "psw": "1234", "result": "true"},{"user": "admin10", "psw": "1234", "result": "true"},{"user": "admin11", "psw": "1234", "result": "true"}]@ddt.ddt
class Test(unittest.TestCase):@ddt.data(*datas)def test_(self, d):"""上海-悠悠:{0}"""print("测试数据:%s" % d)if __name__ == "__main__":unittest.main()
unittest框架还有一个paramunittest也可以实现
import unittest
import paramunittest
import time
# python3.6
# 作者:上海-鱼鱼@paramunittest.parametrized({"user": "admin", "psw": "123", "result": "true"},{"user": "admin1", "psw": "1234", "result": "true"},{"user": "admin2", "psw": "1234", "result": "true"},{"user": "admin3", "psw": "1234", "result": "true"},{"user": "admin4", "psw": "1234", "result": "true"},{"user": "admin5", "psw": "1234", "result": "true"},{"user": "admin6", "psw": "1234", "result": "true"},{"user": "admin7", "psw": "1234", "result": "true"},{"user": "admin8", "psw": "1234", "result": "true"},{"user": "admin9", "psw": "1234", "result": "true"},{"user": "admin10", "psw": "1234", "result": "true"},{"user": "admin11", "psw": "1234", "result": "true"},
)class TestDemo(unittest.TestCase):def setParameters(self, user, psw, result):'''这里注意了,user, psw, result三个参数和前面定义的字典一一对应'''self.user = userself.user = pswself.result = resultdef testcase(self):print("开始执行用例:--------------")time.sleep(0.5)print("输入用户名:%s" % self.user)print("输入密码:%s" % self.user)print("期望结果:%s " % self.result)time.sleep(0.5)self.assertTrue(self.result == "true")if __name__ == "__main__":unittest.main(verbosity=2)
如果用的是pytest框架,也能实现参数化
# content of test_canshu1.py# coding:utf-8import pytest
@pytest.mark.parametrize("test_input,expected",[ ("3+5", 8),("2+4", 6),("6 * 9", 42),])
def test_eval(test_input, expected):assert eval(test_input) == expectedif __name__ == "__main__":pytest.main(["-s", "test_canshu1.py"])
pytest里面还有一个更加强大的功能,获得多个参数化参数的所有组合,可以堆叠参数化装饰器
import pytest
@pytest.mark.parametrize("x", [0, 1])
@pytest.mark.parametrize("y", [2, 3])
def test_foo(x, y):print("测试数据组合:x->%s, y->%s" % (x, y))if __name__ == "__main__":pytest.main(["-s", "test_canshu1.py"])
4.下个接口请求参数依赖上个接口的返回数据
这个很容易,不同的接口封装成不同的函数或方法,需要的数据return出来,用一个中间变量a去接受,后面的接口传a就可以了
5.依赖于登录的接口如何处理
登录接口依赖token的,可以先登录后,token存到一个yaml或者json,或者ini的配置文件里面,后面所有的请求去拿这个数据就可以全局使用了
如果是cookies的参数,可以用session自动关联
s=requests.session()
后面请求用s.get()和s.post()就可以自动关联cookies了
6.依赖第三方的接口如何处理
这个需要自己去搭建一个mock服务,模拟接口返回数据
moco是一个开源的框架,在github上可以下载到https://github.com/dreamhead/moco
moco服务搭建需要自己能够熟练掌握,面试会问你具体如何搭建 ,如何模拟返回的数据,是用的什么格式,如何请求的
7.不可逆的操作,如何处理,比如删除一个订单这种接口如何测试
此题考的是造数据的能力,接口的请求数据,很多都是需要依赖前面一个状态的
比如工作流这种,流向不同的人状态不一样,操作权限不一样,测试的时候,每种状态都要测到,就需要自己会造数据了。
平常手工测试造数据,直接在数据库改字段状态。那么自动化也是一样,造数据可以用python连数据库了,做增删改查的操作
测试用例前置操作,setUp做数据准备
后置操作,tearDown做数据清理
8.接口产生的垃圾数据如何清理
跟上面一样,造数据和数据清理,需用python连数据库了,做增删改查的操作
测试用例前置操作,setUp做数据准备
后置操作,tearDown做数据清理
9.一个订单的几种状态如何全部测到,如:未处理,处理中,处理失败,处理成功
跟上面一样,也是考察造数据,修改数据的状态
10.python如何连接数据库操作?
这个就是详细的考察你是如何用python连数据库的,并且最好能现场写代码那种(有的笔试题就是python连数据库)
具体问你用到哪个模块,查询的数据是什么类型?如何删除数据?如何新增数据?如何修改数据?
PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb。
详情参考教程http://www.runoob.com/python3/python3-mysql.html
#!/usr/bin/python3
# 查询EMPLOYEE表中salary(工资)字段大于1000的所有数据:
import pymysql# 打开数据库连接
db = pymysql.connect("localhost","testuser","test123","TESTDB" )# 使用cursor()方法获取操作游标
cursor = db.cursor()# SQL 查询语句
sql = "SELECT * FROM EMPLOYEE \WHERE INCOME > %s" % (1000)
try:# 执行SQL语句cursor.execute(sql)# 获取所有记录列表results = cursor.fetchall()for row in results:fname = row[0]lname = row[1]age = row[2]sex = row[3]income = row[4]# 打印结果print ("fname=%s,lname=%s,age=%s,sex=%s,income=%s" % \(fname, lname, age, sex, income ))
except:print ("Error: unable to fetch data")# 关闭数据库连接
db.close()
其它的就是运行出报告、代码管理(git)、运行策略和持续集成jenkins相关了,这个所以的自动化但是一样的,后面会单独讲一篇jenkins持续集成相关
相关文章:

接口自动化测试面试题
前言 前面总结了一篇关于接口测试的常规面试题,现在接口自动化测试用的比较多,也是被很多公司看好。那么想做接口自动化测试需要具备哪些能力呢? 也就是面试的过程中,面试官会考哪些问题,知道你是不是真的做过接口自动…...
Tampermonkey油猴插件-各大网盘批量分享,解放双手-上
Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列...

【DB2】installSAM执行后会重启这件事
碎碎念 在使用自动化工具安装TSAMP的过程中,机器会自动重启这件事。 TSAMP真的挺折磨的,一个月居然因为这件事情debug两次了。 在测试自动化脚本的时候,第一遍安装都是好好的,从第二遍开始(因为要测试脚本的幂等性&…...

RTSP网络视频协议
一.RTSP网络视频协议介绍 RTSP是类似HTTP的应用层协议,一个典型的流媒体框架网络体系可参考下图,其中rtsp主要用于控制命令,rtcp主要用于视频质量的反馈,rtp用于视频、音频流从传输。 1、RTSP(Real Time Streaming P…...

Python 网络数据采集(四):Selenium 自动化
Python 网络数据采集(四):Selenium 自动化 前言一、背景知识Selenium 4Selenium WebDriver 二、Selenium WebDriver 的安装与配置2.1 下载 Chrome 浏览器的驱动程序2.2 配置环境变量三、Python 安装 Selenium四、页面元素定位4.1 选择浏览器开…...

实现秒杀功能设计
页面 登录页面 登录成功后,跳转商品列表 商品列表页 加载商品信息 商品详情页 根据商品id查出商品信息返回VO(包括rmiaoshaStatus、emainSeconds)前端根据数据展示秒杀按钮,点击开始秒杀 订单详情页 秒杀页面设置 后端返回秒杀…...

每天刷两道题——第十四天
1.1矩阵置零 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用原地算法。 输入:matrix [[0,1,2,0],[3,4,5,2],[1,3,1,5]] 输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]] 原地算法(…...

快速掌握Postman实现接口测试
快速掌握Postman实现接口测试 Postman简介 Postman是谷歌开发的一款网页调试和接口测试工具,能够发送任何类型的http请求,支持GET/PUT/POST/DELETE等方法。Postman非常简单易用,可以直接填写URL,header,body等就可以发…...

jmeter--3.使用提取器进行接口关联
目录 1. 正则表达式提取器 1.1 提取单个数据 1.2 名词解释 1.3 提取多个数据 2. 边界值提取器 2.2 名词解释 3. JSON提取器 3.1 Json语法 3.2 名词解释 3.3 如果有多组数据,同正则方式引用数据 1. 正则表达式提取器 示例数据:{"access_to…...

移动通信系统关键技术多址接入MIMO学习(8)
1.Multiple-antenna Techniques多天线技术MIMO,从SISO到SIMO到MISO到如今的MIMO; 2.SIMO单发多收,分为选择合并、增益合并;SIMO,基站通过两路路径将信号发送到终端,因为终端接收到的两路信号都是来自同一天…...

WorkPlus AI助理为企业提供智能客服的机器人解决方案
在数字化时代,企业面临着客户服务的重要挑战。AI客服机器人成为了提升客户体验和提高工作效率的关键工具。作为一款优秀的AI助理,WorkPlus AI助理以其智能化的特点和卓越的功能,为企业提供了全新的客服机器人解决方案。 为什么选择WorkPlus A…...
python类装饰器编写单体类
1 python类装饰器编写单体类 类装饰器用于装饰类,用于管理类自身,或用于管理实例创建调用。 单体类,不管创建多少次实例,都只有一个实例的类。可以通过类装饰器管理装饰类的全部实例,实现单体类。 1.1 字典存放单体…...
Java并发Condition 详解
1.引言 在Java并发编程中,线程间的协作是一个核心话题。为了实现线程间的协作,Java提供了多种机制,其中等待/通知机制是最常见的一种。在早期版本中,我们通过Object类提供的wait、notify和notifyAll方法来实现这种机制。然而&…...

如何使用CentOS系统中的Apache服务器提供静态HTTP服务
在CentOS系统中,Apache服务器是一个常用的Web服务器软件,它可以高效地提供静态HTTP服务。以下是在CentOS中使用Apache提供静态HTTP服务的步骤: 1. 安装Apache服务器 首先,您需要确保已安装Apache服务器。可以使用以下命令安装Ap…...

Python入门0基础学习笔记
1.编程之前 在编写代码之前,还有两件事需要做: 安装 Python 解释器:计算机是没法直接读懂 Python 代码的,需要一个解释器作为中间的翻译,把代码转换成字节码之后再执行。 Python 是翻译一行执行一行。一般说的安装 …...

python绘制热力图-数据处理-VOC数据类别标签分布及数量统计(附代码)
前言 当你需要统计训练数据中每个类别标签有多少,并且想知道坐标中心分布在图像的位置信息时,你可以利用一下脚本进行计算! 步骤 要绘制热力图来分析VOC数据的分布统计,可以按照以下步骤进行: 数据处理࿱…...

【回顾2023,展望2024】砥砺前行
2023年总结 转眼间,迎来了新的一年2024年,回顾2023,对于我来说是一个充满平凡但又充实又幸运的一年。这一年经历了很多的事情,包括博客创作、技术学习、出书、买房等,基本上每件事情都是一个前所未有的挑战和机遇、使…...

Stable Diffusion初体验
体验了下 Stable Diffusion 2.0 的图片生成,效果还是挺惊艳的,没有细调prompt输入,直接输入了下面的内容: generate a Elimination Game image of burnning tree, Cyberpunk style 然后点击生成,经过了10多秒的等待就输…...
缓存解析:从架构设计到Redis应用及最佳实践
典型架构设计中缓存的存储位置 在现代软件架构中,缓存是优化数据检索、提高应用性能的关键组件。缓存的存储位置多种多样,每个位置针对特定的优化目标和需求。理解这些层级对于设计高效的系统至关重要。 浏览器缓存:这是最接近用户端的缓存层…...

【C#】使用 LINQ 中的 Skip() 和 Take()进行分页,为什么要分页,分页作用是什么
欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是是《C#》序列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
git: early EOF
macOS报错: Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...

yaml读取写入常见错误 (‘cannot represent an object‘, 117)
错误一:yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因,后面把yaml.safe_dump直接替换成yaml.dump,确实能保存,但出现乱码: 放弃yaml.dump,又切…...

Qt的学习(一)
1.什么是Qt Qt特指用来进行桌面应用开发(电脑上写的程序)涉及到的一套技术Qt无法开发网页前端,也不能开发移动应用。 客户端开发的重要任务:编写和用户交互的界面。一般来说和用户交互的界面,有两种典型风格&…...