面试问题python-接口自动化

1.能够大致讲一下你们接口自动化框架是怎么搭建的吗?

好的,我们采用unittest和ddt数据驱动思想搭建测试框架,(对数据excel读取、yaml配置、Requests接口请求、Re参数化、Pymysql数据库效验、日志等模块实现封装),其中,用

1.Openpyxl来处理excel,存储测试数据(用例数据)

2.pyyaml来配置文件(configparse,pyyaml)

  1. Pymysql来连接mysql数据库,执行sql数据,进行数据效验

4.Requests请求库,来向接口发起请求

5.使用logging模块来创建日志器,记录项目中的日志信息

6.使用HttpTestRunner来生成HTML测试报告

7.使用re模块来实现参数化(正则匹配)

8.使用动态创建属性(类属性)的机制来实现接口之间的依赖 (setattr getattr)

比如:我们项目中客服指派订单的时候,需要上一个接口订单ID,首先要对上一个接口发送请求,获取订单id,通过实例化对象,创建属性名,获取属性值,从而实现指派订单接口的成功请求。

分层设计

为了提升接口自动化测试框架的拓展性、稳定性、完整性,进而提升测试效率,往往会将测试框架工程化,

整个流程会分为不同的层级,每个层级之间保持相对独立

cases

测试执行逻辑层,用于存放所有的测试用例类

configs

配置层,用于存放当前框架中的所有配置信息(使用不频繁,修改不频繁的数据)

datas

测试数据层,用于存放所有的测试数据,测试参数(可以使用excel,json,yaml,数据库来存储)

libs

自定义库文件层,用于存放自定义或者二次开发的库文件

logs

日志层,用于保存运行框架过程中产生的所有有效日志信息

reports

报告层,用于保存所有的测试报告文件(一般为html报告)

scripts

脚本封装层,用于保存所有的操作封装模块(yaml,excel,log.mysql,requests,参数化等)

run.py

用例启动文件,使用套件加载用例,批量执行并生成报告

2.你做接口自动化测试时,测试数据放哪里?

  1. 对于一些基础配置比如环境地址、手机号码、一些不怎么变的数据配置可以放到conf文件
  2. 接口测试需要用到的数据可以放数据库表,也可以放到excel中,一般excle中放的是单口测试用例
    3)

3.如何设置高质量的测试框架

面试问题python-接口自动化_第1张图片

4.什么是数据驱动?

数据驱动就是通过excel,yaml或者xml,数据库等数据结构来维护测试数据,通过相应的技术去处理,拿到测试数据用于测试,从而实现测试数据与代码的解耦,数据驱动测试的本质是高级的参数化。常用的ddt数据驱动

5.excel中如何设计你的用例?

1 一个模块对应一个Excel表
2 一条接口对应一张sheet表
3 表中一行对应一条测试用例
4 在开始要注明测试时需要的sql
5.多参数传递可以用json解决
面试问题python-接口自动化_第2张图片

6.excel中的数据怎么拿出来?

通过第三方库openpyxl来完成,项目只需要引入openpyxl库,通过它提供的api即可完成对于excel的操作,甚至于我们自己也可以做一些二次封装,使得操作更方便。一行数据就是一个用例。
一.Excel中的三大对象
WorkBook:工作簿对象
Sheet:表单对象
Cell:表格对象
二、openpyxl对Excel的操作
创建一个工作薄:wb = openpyxl.Workbook()
新增一个sheet表单:wb.create_sheet(‘test_case’)
保存case.xlsx文件:wb.save(‘cases.xlsx’)
打开工作簿:wb = openpyxl.load_workbook(‘cases.xlsx’)
选取表单:sh = wb[‘Sheet1’
读取第一行、第一列的数据:ce = sh.cell(row = 1,column = 1)
按行读取数据:row_data = list(sh.rows)
关闭工作薄:wb.close()
按列读取数据:columns_data = list(sh.columns)

https://www.cnblogs.com/wanglle/p/11455758.html

7.exce如果有些接口做了鉴权(需要鉴定权限),怎么实现这些接口的自动化测试?

首先需要明确接口是通过什么机制来实现的鉴权

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

8.某个接口请求,参数依赖上个接口的返回数据,怎么处理(接口关联)?

场景:b接口在调用的时候参数依赖于a接口的返回数据。
处理方案:
a接口调用完–》从响应中取出b依赖的这个参数–》保存起来–》b调用的时候,取出这个信息–》当做参数传过去即可。
保存方案:
参考问题5中的数据保存方式

9.接口测试的垃圾数据如何清理?

可以自己准备单独的环境(独立的数据库),这样接口调用产生的数据可以在整个套件执行完后(@AfterSuite)通过执行sql脚本来完成数据删除。

10.你做接口自动化,项目用的是什么数据库,用什么来操作的这个数据库

Mysql,可以通过jdbc来实现数据库的增删查改等操作。
https://blog.csdn.net/kongsuhongbaby/article/details/84948205

11.你做接口自动化时怎么做的数据验证

数据验证主要包括两个方面:

  1. 接口响应报文的验证
    利用jsonpath取出响应数据(大多数情况是json)中的关键字段的值,通过Assert断言这些关键字段的值是否符合预期。预期值和jsonpath取值表达式可以配置在excel中。

  2. 数据库表数据的验证
    做表数据验证要先明白两点:
    a. 表数据验证首先得明白这个接口的基本业务,会影响到哪些表,哪些字段的数据,然后才能准备查询sql去有针对性的查数据。
    b. 并不是所有用例的执行都会操作数据库,影响到表数据,因此只有影响到了表数据的用例,才准备查询脚本。
    具体做法:
    Excel用例准备aa,bb,cc三列,aa传脚本,bb,cc两列分别用来回写用例执行前的sql查询结果和用例执行后的sql查询结果,两个数据对比即可知道数据变化是否满足预期。

12.你做如何提升测试套件的执行效率

1.减少excel读写,减少不必要的io操作
2.excel数据读取测试数据,全部存储到静态变量中)。
3.excel数据回写,尽量通过批量方式去写。

13.你用过单元测试框架吗,是什么框架,有哪些常用操作?

用过,unittest,pytest,这些测试框架都支持我们去定义测试套件,达到管理我们测试用例代码的作用,同时这些测试框架提供的一些丰富注解不仅能很方便的控制测试用例的执行顺序来控制整个测试流程,还能为各种测试场景的实现提供支撑。
常用操作:
seutp,teardown,适合单个测试用例的初始化、环境清理。
seutpClass,teardownClass:适合测试类的全局初始化、环境清理。
assertXXXX: 各种断言方式
testLoader的discover: 用来发现测试用例
testSuite的addTests: 用来装载测试用例
@ddt 数据驱动
htmlTestRunner:用来生成html测试报告

14.unittest,pytest的区别

https://www.cnblogs.com/liudinglong/p/12846986.html
https://www.cnblogs.com/hp1991/p/11238559.html

一、用例编写规则
pytest可以执行unittest风格的测试用例,无须修改unittest用例的任何代码,有较好的兼容性。 pytest插件丰富,比如flask插件,可用于用例出错重跑;还有xdist插件,可用于设备并行执行。

二、用例前置和后置
1.unittest提供了setUp/tearDown,每个用例运行前、结束后运行一次。setUpClass和tearDownClass,用例执行前、结束后,只运行一次。
2.pytest提供了模块级、函数级、类级、方法级的setup/teardown,比unittest的setUp/tearDown更灵活。
pytest还可以在函数前加@pytest.fixture()装饰器,在测试用例中装在fixture函数。fixture的使用范围可以是function,module,class,session。

firture相对于setup和teardown来说有以下几点优势:
命名方式灵活,不局限于setup和teardown这几个命名
conftest.py 配置里可以实现数据共享,不需要import就能自动找到一些配置,可供多个py文件调用。
scope=“module” 可以实现多个.py跨文件共享前置
scope=“session” 以实现多个.py跨文件使用一个session来完成多个用例
用yield来唤醒teardown的执行

三、断言
1.unittest提供了assertEqual、assertIn、assertTrue、assertFalse。
 2.pytest直接使用assert 表达式。

四、报告
1.unittest使用HTMLTestRunnerNew库。
  2.pytest有pytest-HTML、allure插件。

五、失败重跑
  1、unittest无此功能。
  2、pytest支持用例执行失败重跑,pytest-rerunfailures插件。

六、参数化
  1、unittest需依赖ddt库,
  2、pytest直接使用@pytest.mark.parametrize装饰器。

结合实例说一下自动化怎么做的

比如说平台端上架课程的接口自动化实现吧,首先需要登陆,使用requests的post请求登录获取登陆接口的token,将token带入到课程上架的接口中,根据写好的用例将用例代码化实现

15.params和data区别

由于get请求无请求体,post请求有请求体

使用params参数时,默认会把参数附加到url后面,所以发送get请求时应使用params参数

使用data参数时,参数会存放到请求体中,所以发送post请求时不能使用params,应使用data,除非接口及支持get又支持post,同样get请求也不能使用data参数

你可能感兴趣的:(面试经历,python)