软件测试面试中常见必问(二)自动化问题 内附答案

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)
posted @ 2024-10-23 17:20  圆满测试  阅读(43)  评论(0编辑  收藏  举报