2022年6月29日面试题(一)
英文自我介绍(略)
英文介绍项目(略)
说下接口自动化框架怎么实现的
接口自动化的实现
x项目上线周期较短,任务较重,从立项到上线只有半年的时间,因此希望能够提前介入到接口测试,尽早发现项目底层的一些bug,保障功能测试能够平稳进行,以及做好迭代阶段的回归测试,因此公司安排我做项目的接口自动化测试
1、为了便于代码的可维护性,采用数据和用例分离的设计思想。数据存储在excel中,通过openpyxl读取数据,封装成一个字典列表的形式,列表中的每一个字典都对应着一条case,通过ddt.data进行拆包,将每个元素分别传给封装好的request方法去做请求,拿到响应之后,将结果提取出来和期望结果做断言,最后通过unittest,先生成一个TestSuite对象,然后生成一个TestLoader对象,通过TestLoader对象的discover方法发现测试用例,将最终发现的测试用例通过TestSuite对象的addTests方法放在测试套件下,再过runner对象的run方法运行测试套件对象
2、对于参数替换,在excel中使用${}标记随机数的变量,使用{{}}标记关联接口的变量,在公共目录下定义随机数类存放生成随机数的方法,定义Context类作为反射类,同时还会定义一个变量替换方法,这个方法通过判断是excel数据否包含${}或者{{}}来决定如何替换,如果数据是${}的形式,则通过eval(随机数方法)来替换,如果数据是{{}}这样的形式,则会通过eval(反射类.属性值)来替换。在测试用例类中,发送请求之前,先会调用变量替换方法,将请求数据中需要替换的数据做个替换,然后通过封装好的requests方法来做接口请求,拿到响应结果后,先判断excel数据中是否有response_extract字段,如果有就通过分割字符串的方法,将{{key}}=$..jsonpath表达式,分割开来,=前面的是key,=后面的是value,再通过反射方法将key和value赋予Context类的类属性和属性值。
对于接口里数据库的断言,通过flask将数据库的查询语句封装成接口,然后和业务接口放在一起,最终将数据库的查询结果取出来再去和业务接口的响应结果做断言
3、此外,还可以介绍一下日志、发送邮件、环境配置以及jenkins持续集成
app自动化的实现
x项目已经平稳运行三四年了,该项目迭代周期较长,版本间的界面变化不太大,因此在初入公司的时候,公司安排我做项目的APP自动化
1、首先我在阅读需求文档的基础上,通过和业务测试同学、开发、产品沟通,花了一两周的时间熟悉了项目的需求
2、然后开始编写测试用例,测试用例根据是否是主流程将用例划分为P0,P1,P2三个等级,P0是重要的、正向的、首先要实现的,P1和P2是后面逐步要完善的
3、接着是开展测试用例评审,召集测试、开发、产品三方进行积极沟通,逐步完善自动化测试用例
4、接下来是搭建自动化测试环境,需要安装nodejs、appium-server、appium-python库、adt、模拟器和真机
5、然后编写测试用例,主要采用的是PO模式,将测试方法、页面对象和测试数据分离,在page_objects目录下定义公用的base_page模块,这个模块有一个BasePage类,这个类初始化需要传入driver对象作为实例属性,然后定义实例方法,比如等待元素可见、等待元素存在、查找并返回一个元素、查找并返回多个元素、滑屏、获取toast等等
6、各个页面对象继承这个BasePage类,就获得了父类的属性和方法,在各个页面上定义自己的属性,也就是元素定位表达式,定义自己的方法,也就是由父类方法组合而成的页面方法
7、在yaml配置文件中配置实例化driver需要的platformName、appPackage、appActivity、server_port等信息
8、定义公共的实例化driver的base_driver模块,base_driver模块下定义BaseDriver类,这个类通过读取yaml配置文件,返回driver实例对象
9、在conftest模块中定义公共的fixture,fixture通过调用BaseDriver类中base_driver方法,使用yield返回driver实例对象,在测试用例结束后,使用driver.close_app()和driver.quit()做环境的清理
10、在测试方法中,将fixture的函数名作为方法入参传递给页面对象,这样拿到的就是实例化driver对象,然后通过实例化页面对象再依次调用页面对象的方法,排列组合形成测试用例
11、在入口函数中,可以通过pytest.main中加一些参数,比如"--reruns","-m","--html"分别实现失败重试,冒烟标记测试,结果报告的生成
用过哪些接口测试工具
可以说说postman、jmeter
注意jmeter传参分为两种:
1、线程组内的传参,有两种方式:
第一种是使用json提取器,正则表达式提取器等
第二种是在后置处理器中使用vars.put设置值,使用vars.get获取值
2、跨线程组的传参,要先通过json提取器或正则表达式提取器将前一个线程组的参数提取出来,然后设置一个后置处理器,在后置处理器中也有两种方式:
第一种是使用_setProperty设置值和使用_P获取值
第二种是使用props,使用props.put设置值,使用props.get获取值
自动化测试过程中有哪些难点
可以说说app自动化中是怎么优化的:
1、如何处理toast提示
2、如何处理webview: 前两者都可以参考这篇:appium自动化测试(四)
3、如何处理图形验证码: 使用Tesseract OCR 或者云打码平台
4、重点来了,执行速度过慢,怎么优化。参考这篇:使用pytest-xdist实现分布式APP自动化测试:基于SSH
有没有接触过java
有就有,没有就没有,如实说
接口自动化做了多长时间,接口手工测试做了多长时间
按照项目中的时间统计
有没有做过web方面的测试
有就有,没有就没有,如实说
给你一个登录的页面,设计测试用例
功能测试
正常场景
1、输入正确的账号和密码,点击提交按钮,验证是否能正确登录,登录成功后能否跳转到正确的页面。(正常输入)
异常场景
1、输入错误的账号或者密码, 验证登录会失败,并且提示相应的错误信息。(错误校验)
2、账号和密码,如果太短或者太长,应该怎么处理(安全性,密码太短时是否有提示)
3、账号和密码,中有特殊字符(比如空格),和其他非英文的情况(是否做了过滤)
4、记住账号的功能
6、登录失败后,不能记录密码的功能
7、账号和密码前后有空格的处理
8、密码是否加密显示(星号圆点等)
9、牵扯到验证码的,还要考虑文字是否扭曲过度导致辨认难度大,考虑颜色(色盲使用者),刷新或换一个按钮是否好用
10、什么都不输入,点击提交按钮,看提示信息。(非空检查)
11、用户未注册能否登录
12、用户已注销能否登录
13、用户修改密码之后能否登录
14、有快捷登录的话,能否使用快捷登录,如QQ、微信等
15、断网情况下是否有正常提示
16、弱网情况下能否正常登录
17、token或者session过期之后,能否退回到登录态
界面测试
1、布局是否合理,2 个 Testbox 和一个按钮是否对齐
2、Testbox 和按钮的长度,高度是否符合要求
3、界面的设计风格是否与 UI 的设计风格统一
4、界面中的文字简洁易懂,没有错别字
5、对于app,来电提示能否影响登录功能
6、对于app,旋转屏幕,登录页面是否正常显示
7、对于app从后台切换回来,对于web窗口最小化再最大化后,界面能否正常显示
性能测试
1、打开登录页面,需要几秒
2、输入正确的账号和密码后,登录成功跳转到新页面,不超过 几秒
3、登录接口、获取验证码接口的响应时间、TPS
4、打开app或者web的时候系统资源的占用情况(cpu、硬盘io、网络等)
5、如果是app,还有耗电量测试
安全性测试
1、登录成功后生成的 Cookie 是否有 HttpOnly(降低脚本盗取风险)
2、账号和密码是否通过加密的方式,发送给 Web 服务器
3、账号和密码的验证,应该是用服务器端验证,而不能单单是在客户端用 javaScript 验证
4、账号和密码的输入框,应该屏蔽 SQL 注入攻击
5、账号和密码的输入框,应该禁止输入脚本(防止 XSS 攻击)
6、错误登录的次数限制(防止暴力破解)
7、获取验证码的次数限制
8、考虑是否支持多用户在同一机器上登录
9、考虑同一用户在多台机器上登录
可用性测试
1、是否可以全用键盘操作,是否可切换键盘
2、输入账号,密码后按回车,是否可以登录
3、输入框是否可以以 Tab 键切换
兼容性测试
1、主流的浏览器下能否显示正常已经功能正常(IE6~11, FireFox, Chrome, Safari 等 )
2、不同的平台是否能正常工作,比如 Windows, Mac, Linux
3、移动设备上是否正常工作,比如 iPhone, Android
4、不同的分辨率
本地化测试
1、不同语言环境下,页面的显示是否正确
软件辅助性测试
1、软件辅助功能测试是指测试软件是否向残疾用户提供足够的辅助功能
如果你是测试leader,怎么设计测试策略保障产品质量
这篇文章非常全:《如何才能制定好测试策略_全》