经常被问到的接口测试高频面试题(下) | 当前位置: 首页> 学习中心> 测试知识> 详情 |
12、你做接口自动化,项目用的是什么数据库,用什么来操作的这个数据库
Mysql,可以通过jdbc来实现数据库的增删查改等操作。
13、你做接口自动化时怎么做的数据验证
数据验证主要包括两个方面:
「接口响应报文的验证」
利用jsonpath取出响应数据(大多数情况是json)中的关键字段的值,通过Assert断言这些关键字段的值是否符合预期。预期值和jsonpath取值表达式可以配置在excel中。
「数据库表数据的验证」
做表数据验证要先明白两点:
a. 表数据验证首先得明白这个接口的基本业务,会影响到哪些表,哪些字段的数据,然后才能准备查询sql去有针对性的查数据。
b. 并不是所有用例的执行都会操作数据库,影响到表数据,因此只有影响到了表数据的用例,才准备查询脚本。
「具体做法:」
Excel用例准备aa,bb,cc三列,aa传脚本,bb,cc两列分别用来回写用例执行前的sql查询结果和用例执行后的sql查询结果,两个数据对比即可知道数据变化是否满足预期。
14、如何提升测试套件的执行效率
○ 减少excel读写,减少不必要的io操作
○ excel数据读取测试数据,全部存储到静态变量中)。
○ excel数据回写,尽量通过批量方式去写。
我的作答:测试套件就是将测试用例集合在一个套件中执行。那么测试用例的数量和每一个测试用例代码中的数量决定着测试套件的执行效率。那么优化代码,提高代码的可复用性就能够显著的提高测试套件的执行效率。
15、你用过单元测试框架吗,是什么框架,有哪些常用操作?
用过,unittest,pytest(不熟可以不说),这些测试框架都支持我们去定义测试套件,达到管理我们测试用例代码的作用,同时这些测试框架提供的一些丰富注解不仅能很方便的控制测试用例的执行顺序来控制整个测试流程,还能为各种测试场景的实现提供支撑。
常用操作:
seutp,teardown,适合单个测试用例的初始化、环境清理。
seutpClass,teardownClass:适合测试类的全局初始化、环境清理。
assertXXXX: 各种断言方式
testLoader的discover: 用来发现测试用例
testSuite的addTests: 用来装载测试用例
@ddt 数据驱动 htmlTestRunner:用来生成html测试报告
16、说说你对接口的理解
接口是服务,是功能点实现,是数据传递的通道,也是服务器端的一个实现了某种协议(比如http协议…)和映射机制(当访问一个url时就会通过服务器端的映射处理机制解析后,落到对应的处理函数)的函数,接口参数就是函数的参数,接口的响应数据就是函数的返回值。
17、做过接口测试吗,有哪些熟悉的工具。
熟悉的工具:可视化工具比如:jmeter,postman,soapui等(用过哪些说哪些)代码:requests发包技术来实现接口测试。
18、接口常见的请求方法有哪些?
接口使用http协议,常见的请求方法有get、post。另外还有Patch,Put,delete。get:发送请求获取服务器上的资源。
post:向服务器提交数据
patch:局部更新数据
put:整体更新数据
delete:删除数据
19、请简单说一说get、post这两种请求方法的区别?
功能上的区别:get用于向服务器请求资源,post用来提交资源给服务器。
格式上的区别:get发送的参数显式的放在了url之后。post请求参数放在了请求体中。
安全性:由于get请求格式的特性,能够被轻易的查看到参数中的相应数据,所以不安全,一般用于能够展示给用户的数据请求。post则因为参数在请求体中,安全性稍胜一筹,但是对于重要数据仍然需要加密传输。
执行效率:get的执行效率要快于post
传递的数据量:get可以传递的参数数据量是有限的(因为一般参数是拼接在url上,而浏览器对于url的长度是有限制的。);但是post的参数因为放在请求体中,所以可以提交的数据量不受限制。
参考答案:
「Get:」
a. 一般对于从服务器取数据的请求可以设置为get方式
b. Get方式在传递参数的时候,一般都会把参数直接拼接在url上(例如:http://xxx?id=1&type=2)
c. Get请求方法可以传递的参数数据量是有限的(因为一般参数是拼接在url上,而浏览器对于url的长度是有限制的)
d. Get请求因为是直接将数据拼接在url上,所以安全性不如post强(相对),但是get的执行效率要快于post
「Post:」
a. 一般往服务器提交数据的请求会设置为post方式
b. Post方式传递参数一般都会把参数放在请求体,而不会拼接在url
c. Post请求方法可以提交的数据量不受限制
d. Post请求传参相对于get要安全(相对不是绝对),但是post的执行效率不如get。
20、在浏览器中输入URL,回车之后发生了什么?
○ URL 解析
○ DNS 查询
○ TCP 连接
○ 处理请求
○ 接受响应
○ 渲染页面
21、将列表a = ["h","e","l","l","o"]拼接成字符串,请用多种方法实现
方式一 字符串函数调用
print("".join(a))
方式二 for循环
s = ""
for item in a:
s += item
print(s)
22、编程题
存在一个名称为data.log的文件,data.log中的内容是以逗号作为分隔符的,依次存储了一次测试
TestID,TestTime,Success(0成功;1失败)。文件 中数据均为非负整数。请写一段程序(不限语言),对所有成功(Success=0)的测试,输出:
1)打印最大、最小TestTime;
2)打印平均TestTime,保留小数点2位数。
data.log的内容格式如下:
TestID,TestTime,Success
0,149,0
1,69,0
2,45,0
3,18,1
4,18,1
"""
打开data.log文件 。除了第一行,剩下的第一行都是数据。
只需要按行解析数据,将success对应的值为0的提取出来,将TestTime放在一个新的列表当中。取这个列表当中,最大的值,和最小的值。
同时,对这个列表的所有数据进行取平均值即可。
import os
def anaysis_data():
test_times = []
# 打开data.log文件
with open(os.getcwd() + "/data.log") as fs:
for line in fs.readlines(): # 按行读取
temp = line.strip("\n").split(",") # 去掉换行符之后,再按,分割
print("temp",temp)
if temp[-1] == str(0): # 筛选success字段为0的TestTime
test_times.append(int(temp[-2]))
if len(test_times) > 0:
avg_time = sum(test_times) / len(test_times) # 平均值
max_time = max(test_times)
min_time = min(test_times)
print("最大的TestTime: ",max_time,",最小的TestTime: ",min_time,",平均TestTime: ",avg_time)
if __name__ == '__main__':
anaysis_data()
"""
输出结果为:
temp ['TestID', 'TestTime', 'Success']
temp ['0', '149', '0']
temp ['1', '69', '0']
temp ['2', '45', '0']
temp ['3', '18', '1']
temp ['4', '18', '1']
最大的TestTime: 149 ,最小的TestTime: 45 ,平均TestTime: 87.67
更多软件测试相关推荐:
文章来源:网络 版权归原作者所有
上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8103),我们将立即处理