接口/UI自动化面试题
一、UI自动化
1.1、接口和UI自动化有多少用例?
-
回答策略:根据接口设定用例,100个接口,自动化case在1500-2000左右。结合自身的项目,回答覆盖的主功能流程。
-
示例:
-
接口自动化的测试case一般需要根据接口数量来确定,我当时将主功能流程接口实现了自动化,大概将近有80个的接口,case数量将近1000个;主要涵盖了账户体系管理、合约簿记、出入金管理、流水录入、资金清算、生成报表等核心业务流。通过数据驱动(YAML文件)实现参数化。
-
UI自动化一般根据业务功能进行设计,实现近200个用例自动化,涵盖主回归流程测试。主要需要考虑其底层的稳定以及后续维护成本,通常是30%的自动化覆盖率。
-
1.2、什么是POM模式
-
概述:POM全称叫page object model,页面对象模型。意思是把一个页面当成一个对象,页面的元素就是对象的属性,页面的操作就是对象的行为(方法)。一般情况分三层:基础封装层BasePage、PO页面对象层、TestCase测试用例层。
我这里是采用PO的设计模式,大致分成了基础驱动层用于元素的定位和浏览器的操控; 第二层是页面对象层,将整个页面的元素和功能进行封装; 第三个是业务逻辑层,是通过组合不同页面中的功能实现用例中的业务流程; 第四个数据管理层管理测试数据; 用例执行层,用于用例的执行、断言、日志和报告生成等。
-
优点:
-
使得用例更简单、更清晰,把很多业务操作封装到PO页面对象层,用例只需要调用即可。
-
如果页面有变动,只需要修改PO页面对象层的属性即,增加代码的可维护性。
-
1.3、如何提高UI自动化的稳定性
-
尽量使用相对路径定位元素
-
定位元素使用封装显示等待,增加条件
-
用例和用例之间尽量避免依赖
-
加入用例失败重跑机制
-
自动化测试的环境区分其他环境
1.4、谈谈印象最深的bug
1.4.1、脚本定位问题
在编写自动化脚本时,遇到过像浏览器更新后,自动化测试用例会出现误报的问题。
解决方式:
1. 针对这个问题,我首先是思考影响范围,比如其它浏览器是否有类似的情况存在,并对比不同浏览器原因是否都一致;
2. 当我将一些影响因素排除之后,自己就通过网上查阅官方的文档,学习和借鉴其他人的一些更改方法;尝试去调整代码的定位策略,如元素属性和层
级关系,尽可能用相对路径进行定位;以及更改了等待方式,通过在显示等待中加了一些判定条件;增加用例失败重跑机制等多种方式去规避这类问题,最终
问题得到了解决,并且我在后续会定期的去更新测试代码,保证稳定性。
1.4.2、对比工具性能问题
在开发报表对比工具时,遇到了数据量大导致处理慢和数据格式不一致的问题。
解决方式:
1. 首先,通过使用Pandas库中的chunksize分块读取数据,避免内存过载,同时利用Pandas的向量化操作和分组聚合功能,提高处理能力;并行计算:
利用Dask加速计算;数据库优化:添加索引的方式,减少查询时间。
2. 另外,针对格式问题,读取数据后 统一设置相关列的数据格式。通过这些方法,解决了上述的问题。
1.5、遇到的挑战
发现整体版本流程自动化覆盖率很低,开发提测质量差,严重影响版本交付进度。
解决方法:
1. 首先,我通过优先整理主功能流程,将回归用例实现自动化全覆盖,在开发脚本的过程中,我也在思考后续的用例如何便于维护,因此我通过引入PO
设计模式,并结合产品业务,大致分成了元素定位层、页面操作层、业务逻辑层、数据管理层和用例执行层;此外,针对开发提测质量差的问题,我通过
Jenkins集成了自动化打包与用例执行自动化,在开发代码提测后,会自动进行打包,并执行主功能用例,如果执行不通过,则代码打回,将报错的截图和日志发送给开发。
2. 需要将相关的依赖包批量移动和替换到指定的位置。
3. 正则表达式+递归搜索的方式,筛选指定的路径以及文件名称解决了这个问题。
二、接口自动化
2.1、接口关联是如何处理的
通过一个yaml文件独立保存所有接口提取的变量,并且这个变量在执行用例之前清空;(truncat())
-
在测试用例的yaml文件里通过一个关键字extract提取标量:json或者正则表达式提取
-
在下一个接口通过{{}}或${}的(热加载)方式进行获取。
热加载:代码执行过程中,动态调用Python中的方法达到或得到动态参数的目的。
2.2、requests中的Session会话管理的作用是什么
-
首先,因为很多接口都需要cookie和session来记录登录状态,并且必须要有这个登录状态才可以请求成功;
-
Requests中的Session会话管理的作用就是自动记录cookie和Session的登录状态,不需要再手动去记录。
2.3、接口自动化测试中的断言是如何实现的
-
首先,把断言封装成一个方法,这个方法会读取yaml文件里的validate字段,包括断言的方式和数据;
-
然后,在后台实现了断言,并体现在报告中,不需要再写任何的Python代码。
2.4、数据驱动和关键字驱动的理解
-
数据驱动概念:从数据文件(Excel、CSV、数据库)读取输入、输出数据,然后通过变量传入自动化用例中,测试数据都是在数据文件中,通过修改数据达到自动化用例执行的方式叫做数据驱动;
-
关键字驱动:是从面向对像的思维出发,将同样的业务逻辑封装成一个函数,不同关键字实现不同的业务逻辑,这样业务逻辑就可以通过调用关键字来实现业务功能。
2.5、接口测试过程中遇到过哪些bug
常规Bug:接口没有实现、没有按照接口文档返回结果、接口报错。
如:我在测试资金账户接口时,其中当前名义本金参数,我改成了负值也能创建成功。
2.6、怎么校验结果是否正确
-
状态码校验:验证返回的状态码为200。
-
业务校验:
-
错误码为0。
-
当接口响应报文比较短,比较固定情况下,校验完全一致。
-
响应报文比较长,校验核心最核心的业务信息。
-
响应报文比较复杂,多层级XML或JSON格式,通过Xpath、正则表达式的匹配方式获取关键字的业务节点进行校验。
-
查询数据库校验或者通过其它接口进行校验。
-
2.7、碰见过哪些异常,用到了哪些Python库
-
异常
-
NoSuchElementException 没有该元素
-
NoSuchAttributeException 没有该属性
-
NoSuchElementException 没有如此框架
-
ElementNotVisibleException 元素不可见异常
-
ElementNotSelectException 元素不可选
-
-
python库
- webdriver、os、time、json、request、pytest、pymysql
2.8、报表对比工具实现逻辑
-
数据接入:
-
通过使用pandas解析报表(Excel/CSV)内容;
-
通过pyodbc连接数据库,并查询相关的数据库表字段;
-
-
校验规则设计:
-
静态校验:字段是否为空、数据类型(浮点、保留位数);
-
业务逻辑校验:将报表的字段与数据库查询的字段根据业务逻辑进行比较校验
-
-
结果通知:
- 通过发送邮件的方式告知相关的执行结果。
-
遇到的问题:性能处理
-
分块处理:chunksize读取报表数据,避免内存溢出
-
并行计算:利用Dask加速计算
-
数据库优化:添加索引的方式,减少查询时间
-
2.9、如何开展接口自动化测试(思维)
-
目的:为什么要做接口测试?
- 提效。人工、持续集成、交付
-
首先,我需要自动化的可行性分析,自动化率可以实现到什么样的程度。
-
其次就是需要选择合适的测试工具,做一个小的demo进行演示。
-
第三就是制定详细的测试计划,包含测试环境、测试范围、测试用例设计,相对应的时间节点等;
-
第四就是用例的设计,我需要从新建波形到最后生成可执行文件,详细测试相关的文件是否符合标准规范。
-
第五根据业务对自动化框架进行分层便于后续的脚本更新和维护。
-
我这里是采用PO的设计模式,大致分成了基础驱动层用于元素的定位和浏览器的操控;
-
第二层是页面对象层,将整个页面的元素和功能进行封装;
-
第三个是业务逻辑层,是通过组合不同页面中的功能实现用例中的业务流程;
-
第四个数据管理层管理测试数据;
-
用例执行层,用于用例的执行、断言、日志和报告生成等。
-
-
再考虑引入Jenkins的方式持续集成和定时运行。
-
将自动化流程化,出具相关的使用说明文档和规范文档。
-
后续持续不断完善框架功能。
-
比如在军工通信项目中,我对波形建模流程测试时,首先是确保页面元素没有问题,通过使用边界值、因果图法的测试方法测试输入值是否有异常;其次再对实际的接口进行调用测试,确保后台功能接口能够正常传参返参;之后再根据需求,设复杂的测试业务场景,通过mysql后台查询相关数据,确保实际结果与预期结果统一;
-
如果出现问题时,通过截图的方式,将报错页面以及后台报错日志通过加上时间戳的方式保存在本地,当时我也通过jenkins将截图和日志归档在构建完的产物中,便于后续的历史回溯。
2.10、对于加密接口、签名接口如何进行测试
- 加密接口:在调用接口时,需要清楚接口的方式是什么。如:
- 对称式的加密方式(私钥加密):Base64。
- 非对称的加密方式(双钥加密):RSA加密方式。
- 只加密不解密:MD5、SHA1。
- 自定义加密规则:混合加密方式。
- 清楚加密规则后,在请求接口之前,先对参数做对应的加密之后再发送请求。单一加密方式,postman和Jmeter有些支持。Poatman使用JavaScript脚本实现,Jmeter使用beanshell中的java代码实现。
2.11、依赖于第三方数据的接口如何进行测试
可以通过Postman搭建Mock服务,但是Postman的Mock服务由访问次数限制,一天只能访问1000次。