接口阶段总结(下)

mock是模拟一下接口的返回

mock应用场景:
1.测试当中,你要请求的接口,你得不到响应数据。
2.没有得到响应数据的原因可能是:
1.接口可能没实现
2.可能暂时坏了
3.是第三方的

mock服务:
fastmock - https://www.fastmock.site/
rap2 - http://rap2.taobao.org/account/login
mock - unittest.mock

 

 

接口自动化测试面试题:
1.json和字典的区别? -对基础数据类型的考察
json是:
1.是接口之间传递的数据格式,它是一种数据表达,
2.json本质上还是字符串,只是按key:value这种键值对的格式来的字符串
3.json不是python语言

字典是:python语言的一种数据类型,属于语言的一种类型。

2.测试的数据你放在哪? -数据与脚本分离
回答:在我自己的框架里面,主要是用到了ini配置文件,excel里的写的用例的数据,脚本生成的数据(随机生成手机号),大概就三个地方。
1.如果问到比较细的excel里面有哪些列,你使用了数据驱动思想,列名大概有哪些:
列名大概有:有id,title,url,method,data,status_code,expected(预期结果),extract_data(提取表达式),check_sql(数据库的sql语句)
2.还有就是你的ini配置文件里你都配置了些什么:
主要配置了:数据库连接配置(主要是MySQL),全局变量url配置,日志配置,全局共用数据配置
3.还有可能会问你extract_data(提取表达式)是怎么实现的:
我是专门定义了一个函数,把key设置为全局变量,然后在接口需要之前去做一个替换操作

3.参数化 - 数据驱动模式
1.数据驱动是使用ddt模块来实现读取excel文件的或者xml,数据库等数据结构来维护测试数据,首先是我们把title读取出来,有多少列就是有多少title,是动态的读取标题,
在我们读取到标题后,我们会在读取读取每一行的数据, 会使用zip函数将已经读取出来的title和每一行的数据进行打包成一个字典,
放到列表,最后读取出一个完整的一条数据。
2.我们会将id,title,url,method,data,status_code,expected(预期结果),extract_data(提取表达式),check_sql(数据库的sql语句)
都是写在excel当中,一行就代表一个测试用例,我通过ddt模块和结合unittest去读取他的每一行,并去执行的。


4.excel中如何设计你的用例?
1.所有的接口信息维护在一个表单
2.关于接口的用例数据维护在一个表单
3.接口传参一列来传,通过构造json格式的字符串即可解决传多个参数的问题,同时提升了用例的可维护性

5.excel中的数据怎么拿出来?
1.是通过第三方库openpyxl来完成,项目只需要引入openpyxl库。
2.通过它提供的接口即可完成对于excel的操作,甚至于我们自己也可以做一些二次封装,使得操作更方便
3.在读取数据时,首先是我们把title读取出来,有多少列就是有多少title,是动态的读取标题,
在我们读取到标题后,我们会在读取读取每一行的数据, 会使用zip函数将已经读取出来的title和每一行的数据进行打包成一个字典,
放到列表,最后读取出一个完整的一条数据。一行数据就是一个用例。

6.下个接口请求参数依赖上个接口的返回数据 - 参数关联
回答:实现思维:提取上一个接口的返回值,然后设置为全局变量,下一个接口调用这个全局变量就好了
1.在我的框架中,我专门设置了一个Read_handle_data的py文件,专门来处理这个接口请求
2.具体实现细节:首先我们使用jsonpath的提取技术,在excel里把全局变量名和提取表达式写好,
在我们执行用例过程中,根据提取表达式得到结果并且设置为全局变量
3.全局变量的实现机制是:定义一个全局变量类Ena_data,通过setattr函数将提取到的结果,动态的设置为Ena_data的类属性,
4.如何调用返回值:在下一个接口发送之前,将请求数据从excel里读取出来之后,使用正则表达式来替换请求数据当中特定的变量名,
正则表达式具体替换那些呢:在excel里使用#变量名#来表示这还是要被替换的

7.你做接口自动化时怎么做的数据验证(断言上处理的问题):
当返回的结果比较多的情况,只想比对一部分你是怎么做的?
1.我会提取一部分进行去比对,
数据上的比对:
1.是利用jsonpath取出响应数据(大多数情况是json)中的关键字段的值
2.由于开发规定了每个接口返回的code和msg,这两个字段是必然需要比对的
3.还有其他的需要比对那些字段就写什么,有几个层级就写几个层级,把我想要的数据写在预期结果里面
4.把期望结果转换成字典,实际结果也转换成字典,通过字典当中比对key这种方式,用字典的形式来比对
5.通过Assert断言这些关键字段的值是否符合预期
6.预期值和jsonpath取值表达式可以配置在excel中
7.也可以用提取表达式的方式来比对:期望结果=提取表达式

数据库表数据的验证:
1.表数据验证首先得明白这个接口的基本业务,会影响到哪些表,哪些字段的数据,然后才能准备查询sql去有针对性的查数据。
2.并不是所有用例的执行都会操作数据库,影响到表数据,因此只有影响到了表数据的用例,才准备查询脚本。
3.具体做法:
a.如果有sql语句的比对,会加上我们的sql字段,去查询我们需要的条件,来做一个比对
b.需要有用例执行前的sql查询结果和用例执行后的sql查询结果
c.两个数据对比即可知道数据变化是否满足预期。

有哪几种断言的类型(postman断言)?
1.Response body:Contains string(校验返回结果中是否包含某个字符串)
2.Response body:Is equal to a string(校验整个返回结果是否等于该字符串)
3.Response body:JSON value check(校验返回结果中某一个字段是否等于某个值)
4.Response header:Content-type header check(校验响应头是否包含某个值)
5.Response time is less than 200ms(校验响应时间是否少于200ms)


8.如果有些接口做了鉴权(需要鉴定权限),怎么实现这些接口的自动化测试?
回答:首先需要明确接口是通过什么机制来实现的鉴权
1.如果是通过会话id(JSESSIONID)来实现鉴权的,那么先调用完登录接口--》拿到它返回的这个数据--》存储起来--》
后面再调用其他接口的时候直接带上这个数据过去就可以了。
2.如果是通过token来实现鉴权的,那么同样只需要在调用完登录接口--》拿到它返回的这个数据--》存储起来,后面操作同上。
先回答上面的一个基本实现步骤,然后再补充以下一些实现细节:
a. 怎么取到这个JSESSIONID或者token
这个信息怎么取首先得明白它是怎么返回来的,可能为以下两种方式:
1.登录接口的响应头
2.登录接口的响应报文
需要找开发确认,不同方式不同取法
b. 怎么存储这个JSESSIONID或者token
1. 文件中(excel、properties文件都可以)
2.数据库
3.代码里面自己定义的公共静态变量,作为一个共享的数据
c. 请求其他需要鉴权的接口时,怎么带过去这个数据
先找开发人员确认,再调用需要鉴权的这些接口怎么携带这个鉴权的信息(票)。一般不外乎这么几种:
1.拼接在url上传过去用于服务器验证
2.设置到请求体中
3.通过请求头带过去
弄明白怎么传过去以后,就设法从保存了这个鉴权信息的地方取出来--》传过去

9.依赖于登录的接口如何处理 -token和session的管理
token和session的区别在于:token需要去提取,session不需要

1.token的处理:
1.在我的框架中,我专门设置了一个Read_handle_data的py文件,专门来处理这个接口请求
2.具体实现细节:首先我们使用jsonpath的提取技术,在excel里把全局变量名和提取表达式写好,
在我们执行用例过程中,根据提取表达式得到结果并且设置为全局变量
3.全局变量的实现机制是:定义一个全局变量类Ena_data,通过setattr函数将提取到的结果,动态的设置为Ena_data的类属性,
4.如何调用token:在下一个接口发送之前,在专门封装了一个请求头部处理,判断是否有token值,有token值就在请求头里动态的添加token,
没有就不添加,返回一个完整的请求头,在下一个接口依赖于token的时候们就可以获取到。

2.session(会话)的处理:
1.所谓会话就是session,而session是一种服务器的缓存技术,由服务器端创建。
2.session的管理直接就是:有一个session类,session代表一个会话,只要实例化他,通过这个session的对象去请求,
session的对象去发送登录接口,会把登录的信息保存到这个session对象中,然后把此会话对应的id(JSESSIONID)返回,
因此大部分系统都会用到session机制来实现鉴权。Session保存数据方式也是以key-value的形式。

10.依赖第三方的接口如何处理 -mock模拟数据返回
1.如果接口调用的是依赖于第三方的接口,但是需要调用的这个接口还未实现的话,那么我们可以使用mock模拟下接口的返回值。
2.首先通过使用fastmock在线接口平台,创建一个接口项目,在里面设置一个新的接口,包含名称,接口地址,请求的方法,
接口描述,写死一个固定的返回数据,在接口测试工具上进行测试,
3.接口返回时就是你所设置的返回结果,等接口可以调用时,在调用真时的接口来测试。


11.不可逆的操作,如何处理,比如删除一个订单这种接口如何测试 -造数据
扩展:把数据库的数据删了 就是不可逆 删除操作为软删除 数据库中只是更改状态 就是可逆的
1.首先是我们需要造一个这样的订单数据,那么需要自己去新增一个订单数据,然后再去调用删除接口去删除

12.接口产生的垃圾数据如何清理 - 数据清理
1.可以调用接口去定期清理,通过执行sql脚本来完成数据删除。
2.运维人员专门清理
3.可以自己准备单独的环境(独立的数据库)

13.一个订单的几种状态如何全部测到,如:未处理,处理中,处理失败,处理成功 - 造数据,改数据库订单状态

14.python如何连接数据库操作?
回答:我的项目里使用的是MySQL数据库,所以使用是PyMySQL模块来连接数据库的,我把他封装到了Read_mysql_db的一个py文件当中,
1.初始化的动作是连接数据库,创建游标
2.然后我定义了查询一条数据,所有数据,获取条数,数据同步,以及更新提交数据(对数据库进行增、删、改的操作)
3.还有就是关闭数据库连接,关闭游标

具体问你用到哪个模块,查询的数据是什么类型?
1.查询出来的数据类型是字典类型
2.如果查询的是一条数据:单条数据都是字典类型
3.如果查询的是多条数据:返回的是一个列表,列表里的每一项都是字典

如何删除数据?如何新增数据?如何修改数据?
1.都是使用excute函数去实现,每个sql语句不一样,
2.每次删除,新增,修改都是事务,需要最后commit提交一下

15.能不能举个你框架中通过面向对象思想封装的类,讲一讲什么功能通过类和对象实现的
1.封装日志类
2.环境变量类
3.读取配置文件类
4.读取数据库类
5.读取excel类

16.怎么保证不漏测
1.深刻理解需求/业务 - 覆盖更多用例
2.三方用例评审
3.多人交叉测试 - 交互测试
4.如果有用户场景没覆盖掉。 -- 不断加进去
5.有机会的话,与项目客户接触一下。

17.你们项目做了多少个接口的自动化,你如何回答?
1.一般回答至少要50+个接口,少于10个没必要做接口的自动化
2.假设平均每个接口5个用例,50个接口也有至少也有1000条用例
3.写用例(excel里)花了多长时间?需要注意回答
3.1 初期可能接口业务不熟悉,进度比较慢,一天1-2个接口左右
3.2 后期做熟练了,速度自然而然就提升了,基于业务的理解,可能一天5-6个左右
3.3 还需要看接口的复杂程度,简单比较快,难得可能一天一个都有可能
4. 你一天写多少个用例?
4.1 一个接口至少15+个用例,写完需要进行运行调试,修改,都需要时间
4.2 一天至少5个用例,这里的用例是包括 excel的用例和加代码 一起

18.如何提升测试套件的执行效率
1.减少excel读写,减少不必要的io操作
2.excel数据读取测试数据,全部存储到静态变量中
3.excel数据回写,尽量通过批量方式去写

19.你用过单元测试框架吗,是什么框架,有哪些常用操作?
回答:使用过单元测试框架,使用的是unittest和pytest框架,这些测试框架都支持我们去定义测试套件,
达到管理我们测试用例代码的作用,同时这些测试框架提供的一些丰富注解不仅能很方便的控制测试用例的执行顺序来控制整个测试流程,
还能为各种测试场景的实现提供支撑。
主要操作是:
1.TestCase(测试用例) :
a.在设计测试用例时使用了数据驱动思想(ddt),定义一个测试类是继承unittest.TestCase类,
在写每一条用例时定义为test开头的,表示就是一个测试用例,在进行测试用例收集时,就可以识别到,在执行测试用例。

2.TestSuite/TestLoader(测试套件/用例收集):
a.testSuite的addTests: 用来装载测试用例
b.主要是使用TestLoader的discover方法来发现测试用例,在目录当中他的搜索过滤标准是以文件名进行匹配的:test*.py的文件,
在文件当中是以继承了unittest.TestCase类的测试类,类当中以test_开头的测试函数来过滤用例的,
搜索到所有的符合的测试用例,然后加载在测试套件中

3.TextTestRunner(执行用例/呈现结果):
a.主要是使用BeautifulIReport模块,运行结果以html呈现,比较直白,明白,方便利与理解

4.Fixture(前置后置后置条件):
a.如果是每个测试用例需要执行的前置/后置条件,可以使用seutp,teardown,适合单个测试用例的初始化、环境清理。
b.如果是每个类需要执行的前置/后置条件,可以使用setupClass,teardownClass,需要加上@classmethod 是个装饰器,声明为类方法
适合测试类的全局初始化、环境清理。

5.assertXXXX: 各种断言方式

20.说说你对接口的理解
1.接口是服务,是功能点实现,是数据传递的通道
2.也是服务器端的一个实现了某种协议(比如http协议..)
3.映射机制(当访问一个url时就会通过服务器端的映射处理机制解析后,落到对应的处理函数)的函数
4.接口参数就是函数的参数,接口的响应数据就是函数的返回值

21.做过接口测试吗,有哪些熟悉的工具。
1.做过接口测试,主要是用postman来进行接口辅助测试,使用unittest框架来做的
2.requests发包技术来实现接口测试

22.在浏览器中输入URL,回车之后发生了什么?
在浏览器中输入url后回车,首先是浏览器需要进行以下步骤:
1.解析URL地址,包括使用的是那种传输协议,服务器
2.DNS解析和进行域名解析ip地址
3.浏览器与网站建立连接,建立TCP连接(三次握手,四次连接)
4.请求数据和传输数据:包括请求url,请求头,请求的方法,http版本,状态码,响应头
5.加载出我们需要看的页面

23.请简单说一说get、post这两种请求方法的区别?
get和post都是HTTP协议中的两种发送请求的方法,本质上GET/POST都是TCP链接,他们的区别在于:
GET:
1.一般对于从服务器取数据的请求可以设置为get方式
2.Get方式在传递参数的时候,一般都会把参数直接拼接在url上(例如:http://xxx?id=1&type=2)
3.Get请求方法可以传递的参数数据量是有限的(因为一般参数是拼接在url上,而浏览器对于url的长度是有限制的)
4.Get请求因为是直接将数据拼接在url上,所以安全性不如post强(相对),但是get的执行效率要快于post
5.GET产生一个TCP数据包:对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据)
POST:
1.一般往服务器提交数据的请求会设置为post方式
2.Post方式传递参数一般都会把参数放在请求体,而不会拼接在url
3.Post请求方法可以提交的数据量不受限制
4.Post请求传参相对于get要安全(相对不是绝对),但是post的执行效率不如get。
5.POST产生两个TCP数据包:POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)

24.接口常见的请求方法有哪些?
1.GET请求:用于获取资源(没有请求体)
2.POST请求:向指定的资源提交数据进行处理请求(例如提交表单或者上传文件), 数据被包含在请求体中,
post请求可能会导致新的资源建立/或已有的资源修改
3.PATCH请求:用于更新服务器的数据(局部更新)
4.DELETE请求:用于服务器删除指定的数据
5.PUT请求:用于更新服务器的数据(数据整体更新)

 

posted on 2020-09-01 15:25  wuzina  阅读(264)  评论(0编辑  收藏  举报