软件测试面试中常见必问(二)自动化问题 内附答案
1.你们自动化怎么做的
在需求分析阶段,跟前端沟通好,规范前端代码,避免造成后期自动化工作无法开展的问题。
在用例设计阶段,挑选出适合做自动化的用例,单独整理到一个文件保存。
在项目中后期,趋于稳定之后,就可以开始设计自动化脚本了。
语言python+自动化测试工具selenium+单元测试框架unittest(这里可以挑自己熟悉的说,比如pytest等)+分层模型PO+测试报告HTMLTestRunner
2.selenium是什么,测试所需要包括的工具
selenium是基于UI的模拟用户操作行为的一种web自动化测试工具包,常用于web自动化测试。
需要的工具:webdriver,即浏览器驱动(不同的浏览器驱动不同,与浏览器的版本也相关)。
代码库,python 中的selenium库。
3.说一下元素定位的基本方式
name id classname tagname
link_text partial_link_next(模糊的文本定位) css xpath
4.自动化的测试用例写了多少条
这里回答之后很可能会问总的用例写了多少条,建议回到自动化测试用例占全部用例的15%左右(不超过20%)。
5.自动化的测试脚本你在编写的时候有遇到什么问题吗
1. 检查自己定位方式是否有误?
2. 程序加载过快,页面来不及反应? -- 元素等待
3. 有些输入框必须先点击,再输入
4. 需要操作的元素在新窗口? -- 切换到新窗口(句柄)
5. 需要操作的元素在frame/iframe标签内? -- 切换表单
6. 需要操作的元素被其他元素遮挡了? -- 修改display的值为none
7. 需要操作的元素是个只读元素? -- 修改value的值.或者删掉readonly属性.
8. 需要操作的元素在页面靠下位置?-- 操作滚动条
6.怎么样提高自动化的运行速度和效率
· 少用sleep,多用元素等待.
· 在case层,把连接数据库的代码写到setUpClass里面.
· 如果涉及到多个elif,把最有可能出现的条件写到前面.
· 如果不是大量的测试数据,尽量减少文件IO(input/output)操作.
· 对于一些页面.必须全部加载完成后才会继续执行,可以使用显示等待,这一个元素找到后就继续执行,不必等所有元素加载成功.
· 提高脚本的稳定性,避免因为脚本不稳定影响效率.
7.python的装饰器是什么?有哪些?
在不改变代码的前提下,让代码实现更多的功能
@classmethod @staticmethod @ddt @data @unittest.skip
8.怎么样提高自动化脚本的稳定性
1. 不使用xpath的绝对路径.相对路径,找父标签不要跳太多的层级.
2. 因为网络的原因造成不稳定. 使用隐式等待.
3. 因为一些随机出现的元素导致不稳定. 使用try
4. 因为测试数据造成不稳定. 在teardown里面删掉.
9.什么样的项目适合做自动化(你之前xx项目为什么做的自动化测试)
项目比较稳定周期长,需求变化少,UI界面变化少
重复测试或者回归测试多
10.说一下元素等待
隐式等待:
隐式等待是全局性的,一旦设置,它将对测试脚本中的所有元素生效。
它告诉WebDriver在抛出找不到元素的异常之前,应该等待多长时间。
隐式等待适用于页面上所有元素的查找操作。
如果在设置的时间内找到了元素,WebDriver将继续执行;如果超时,则抛出NoSuchElementException。
隐式等待通常在测试脚本开始时设置一次。
显示等待:
显式等待是局部性的,它只对特定的元素查找操作有效。
它允许你等待某个特定条件成立,例如等待某个元素出现。
显式等待更加灵活,可以等待特定的元素或条件,而不是盲目等待固定的时间。
显式等待通常使用WebDriverWait和ExpectedConditions类来实现。
显式等待不会使测试脚本暂停执行,它会周期性地检查条件是否满足。
11.常用的库
标准库:os、csv、sys....等
第三方库:pandas、PyYAML、Pytest.....等
12.元素定位不到有哪些可能
1.网速问题,元素没加载出来
2.代码书写错误
3.嵌套在frame/iframe标签中
4.新的元素在新的窗口中,切换窗口switch_to代码
5.在页面下方,需要操作滚动条
6.元素只读readonly
13.深拷贝和浅拷贝的区别
a = [1,3,[4,5]]
# 浅拷贝: 拷贝的内存空间的地址.等于都是指向的同一个对象.如果源数据修改,拷贝后的内容也会修改.
b = a.copy() # 浅拷贝
print(b)
a[2][0] = 99 # 把a的嵌套列表里面的4的值改成99
print(a)
print(b) # b也随之更改.
# 深拷贝: 在内存空间里面另外开辟一块空间,用来保存值.源数据修改不会影响到修改后的数据.
from copy import deepcopy
a = [1, 3, [4, 5]]
b = deepcopy(a)
print(b)
a[2][0] = 99
print(a)
print(b)
14.冒泡排序
第一个数和第二个数比较,小的在前面,以此类推
a = [6,4,2,65,1,7]
# a.sort()
# print(a)
for i in range(len(a)): # range(0,6) 外层循环,控制循环次数.
for j in range(0,len(a)-1): # 内层循环, 把所有的数都拿出来比较一次.,
if a[j] > a[j+1]:
a[j],a[j+1] = a[j+1],a[j] # 就互相换位置.
print(a)