最新接口自动化测试面试题

前言

前面总结了一篇关于接口测试的常规面试题,现在接口自动化测试用的比较多,也是被很多公司看好。那么想做接口自动化测试需要具备哪些能力呢?

也就是面试的过程中,面试官会考哪些问题,知道你是不是真的做过接口自动化测试?总的来说问的比较多的就是以下几个问题:

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持续集成相关


              【下面是我整理的2023年最全的软件测试工程师学习知识架构体系图】


一、Python编程入门到精通

二、接口自动化项目实战 

三、Web自动化项目实战


四、App自动化项目实战 

五、一线大厂简历


六、测试开发DevOps体系 

七、常用自动化测试工具

八、JMeter性能测试 

九、总结(尾部小惊喜)

生命不息,奋斗不止。每一份努力都不会被辜负,只要坚持不懈,终究会有回报。珍惜时间,追求梦想。不忘初心,砥砺前行。你的未来,由你掌握!

生命短暂,时间宝贵,我们无法预知未来会发生什么,但我们可以掌握当下。珍惜每一天,努力奋斗,让自己变得更加强大和优秀。坚定信念,执着追求,成功终将属于你!

只有不断地挑战自己,才能不断地超越自己。坚持追求梦想,勇敢前行,你就会发现奋斗的过程是如此美好而值得。相信自己,你一定可以做到! 

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你! 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【K8S in Action】服务:让客户端发现pod 并与之通信(1)

服务是一种为一组功能相同的 pod 提供单一不变的接入点的资源。当服务存在时&#xff0c;它的 IP 地址和端口不会改变。 客户端通过 IP 地址和端口号建立连接&#xff0c; 这些连接会被路由到提供该服务的任意一个 pod 上。 pod 是短暂&#xff0c;会删除增加&#xff0c;调度…

从零开发短视频电商 在AWS SageMaker已创建的模型列表中进行部署

1.导航到 SageMaker 控制台。 2.在 SageMaker 控制台的左侧导航栏中&#xff0c;选择 “模型” 选项。 3.在模型列表中&#xff0c;找到您要部署的模型。选择该模型。 4.点击 “创建端点” 选项或者点击 “创建端点配置” 选项都可以进行部署。 选择创建端点进去后还是会进行…

[MySQL--进阶篇]存储引擎的体系结构、简介、特点、选择

前言 ⭐Hello!这里是欧_aita的博客。 ⭐今日语录&#xff1a;不要在乎别人怎么看你&#xff0c;因为他们根本就没有时间&#xff0c;他们只关心他们自己。 ⭐个人主页&#xff1a;欧_aita ψ(._. )>⭐个人专栏&#xff1a; 数据结构与算法 MySQL数据库 存储引擎 前言MySQL体…

Java-JDBC-连接数据库

数据库 数据库是一种数据存储结构&#xff0c;它允许使用各种格式输入、处理和检索数据——不必在每次需要数据时重新输入它们。数据库具有以下主要特点&#xff1a; 实现数据共享。减少数据的冗余度。数据的独立性。数据实现集中控制。数据的一致性和可维护性&#xff0c;以确…

nginx多ip部署

1.修改网卡信息自定义多个IP 进入/etc/sysconfig/network-scripts&#xff0c;编辑ifcfg-ens33网卡文件。将dhcp动态分配修改成static&#xff0c;同时添加ip地址子网掩码、网关和DNS。 修改完成后重启网卡&#xff0c;systemctl restart network 2.修改nginx配置文件 有几个…

科技改变旅游,道观漫游可视化:智能化管理助力道观游览

道观漫游可视化是一种通过技术手段实现道观游览的可视化展示方式&#xff0c;让游客能够更加直观地了解道观的历史、文化和建筑特色。 随着旅游业的不断发展&#xff0c;道观漫游可视化已经成为了旅游行业中的一个重要方向&#xff0c;吸引了越来越多的游客前来体验。 道观漫游…

基于SSM的高校共享单车管理系统的设计与实现论文

摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对于信息的宣传和管理就很关键。因此高校单车租赁信…

产品创新受赞誉,怿星荣获2023未来汽车(电子和软件)创新创业大赛一等奖

2023未来汽车&#xff08;电子和软件&#xff09;创新创业大赛 11月29日&#xff0c;上海临港&#xff0c;由中国汽车工程学会和中国&#xff08;上海&#xff09;自由贸易试验区临港新片区管理委员会联合举办的“2023未来汽车&#xff08;电子和软件&#xff09;创新创业大赛…

散列卡片悬停变为整齐列表

效果展示 CSS 知识点 transform 属性运用 页面整体布局 <ul><li><div class"box"><img src"./user1.jpg" /><div class"content"><h4>Hamidah</h4><p>commented on your photo.<br />…

vue使用echarts显示中国地图

项目引入echarts以后&#xff0c;在页面创建canvas标签 引入一个公共js文件&#xff08;下面这段代码就是china.js文件&#xff09; (function (root, factory) {if (typeof define function && define.amd) {// AMD. Register as an anonymous module.define([ex…

2023-12-05 Qt学习总结4

点击 <C 语言编程核心突破> 快速C语言入门 Qt学习总结 前言十二 QLabel文本框十三 QPushButton按钮十四 QLineEdit单行输入框总结 前言 要解决问题: 学习qt最核心知识, 多一个都不学. 十二 QLabel文本框 Qt的QLabel文本框是一个用于显示文本或图像的控件。它是Qt中常用…

C++学习笔记:继承

继承 什么是继承?继承的写法基类和派生类的赋值转换继承中的作用域派生类的默认成员函数单继承,多继承,虚拟继承is-a 和 has-a 什么是继承? 继承是C语言面向对象的三大特性之一&#xff0c;是面向对象程序设计使代码可以复用的最重要的手段,基本都是在一个类的基础上为了增加…