关于面试自动化测试可能问到的内容

关于面试自动化测试可能问到的内容

1.selenium

介绍:web自动化测试框架,支持多平台、多浏览器、多语言去实现自动化测试,兼容很多平台(windows、linux、mac)以及浏览器(火狐、ie、谷歌)等;

原理:selenium2将浏览器原生的api封装成webDriver API,可以直接操作浏览器页面里的元素。

           webdriver是按照server-client的经典设计模式设计;

           server端是remote server,当脚本启动浏览器后,该浏览器就是remote server,他的职责就是等待client发送请求并作出回应;

           client端就是我们自己的测试代码,代码中的一些行为,比如打开浏览器、跳转到特定的url等操作是以http请求的方式发送给serer端,server接受请求并执行相关操作,并在reponse中发返回执行状态、返回值等信息。

缺点:不兼容桌面软件自动化测试;

2.等待的三种方式

  1)强制等待:sleep(),不管浏览器是否加载完,程序都会等待;

  2)显示等待:webDriverWait,配合该类的until()或until_not()方法,根据条件进行灵活的等待,当条件成立,则执行下一步,否则继续等待,知道超过设置的最长时间,然后抛出TimeoutException;

  3)隐式等待:implicitly_wait(),整个driver周期有效,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止;

3.pytest

优点:1)简单灵活、容易上手、文档丰富

           2)支持参数化,可以细粒度地控制要测试的测试用例;

           3)支持简单的单元测试和功能测试,还可以用来做selenium/appium等自动化测试、接口自动化测试(pytest+request);

           4)支持很多第三方插件。比如pytest-selenium、pytest-html\pytest-rerunfailures(失败case重复执行)、pytest-xdist(多cpu分发)等;

           5)测试用例的skip和xfail处理;

           6)可以很好的和ci工具结合,例如jenkins;

编写规则:

           1)测试文件以test_开头或结尾;

           2)测试类以Test开头,并且不能带有init方法;

           3)测试函数以test开头

           4)断言使用assert

fixture的scope参数(function、module、class、session,默认function)           

  •           function:每个test都运行;
  •           class:每个class的所有test只运行一次;
  •           module:每个module的所有test只运行一次;
  •           session:每个session只运行一次;

setup和teardown操作

  •  setup:在测试函数或类之前执行,完成准备工作,例如数据库链接、测试数据、打开文件等
  • teardown,在测试函数或类之后执行,完成收尾工作,例如断开数据库链接、回收内存资源等
  • 备注:也可以通过在fixture函数中通过yield实现setup和teardown功能

4.unittest

   unittest不仅适用单元测试,还支持web自动化和接口自动化,该框架提供了丰富的断言方法,判断用例是否通过;

unittest.TestCase:所有的用例类都需要继承该基本类;

unittest.main():将一个单元测试模块变为可直接运行的测试脚本,main()方法适用TestLoader类来搜索所有包含在该模块中以“test”命名开头的测试方法并自动执行他们;

unittest.TestSuite():该类用来创建测试套件;

unittest.TestTextRunner():通过该类下面的run()方法来运行suite所组装的测试用例;

unittest.defaultTestLoader():通过该类下面的discover()方法可自动根据测试目录start_dir匹配朝招测试用例文件,并将查找到的测试用例组装到测试套件,如:discover=unittest.defaultTestLoader.discover(test_dir, pattern='test_*.py')

unittest.skip():装饰器,当运行用例时,有些用例可能不想执行等,可用装饰器暂时屏蔽该条测试用例。一种常见的用法就是比如说想调试某一个测试用例,想先屏蔽其他用例就可以用装饰器屏蔽;

setup和teardown同pytest一样;

5.unittest和pytest有什么区别?

   pytest比unittest更加简洁、灵活方便,主要在用例编写规则、用例前置、后置、参数化、断言、用例执行、失败重运行和报告这几个方面。

   1.用例编写规则

   unittest:提供test_case\test_suites\test fixtures\test runner相关类;

                  测试文件必须先import unittest

                  测试类必须继承unittest.TestCase

                  测试方法要以test_开头

                  测试类必须要用unittest.main()方法执行

   pytest:基于unittest的扩展框架,比unittest更简洁、搞笑

                测试文件必须test_开头

                测试类命名必须以test_开头

                测试方法必须以test_开头

  2.用例的前置和后置

          unittest:只提供了setup和tearDown,只能针对所有用例。

     pytest:pytest提供了模块级、函数级、类级、方法级的setup和teardown,比unittest更灵活。

                  模块级:setup_model/teardown_module开始于模块始末,全局;

                  函数级:setup_function/teardown_function只对函数用例生效;

                  类级:setup_class/teardown_class只在类中前后运行一次;

                  方法级:setup_method/teardown_method 开始于方法始末;

                  类里面的setup/teardown:运行在调用方法的前后;

pytest:函数前加@pytest.fixtures()装饰器,在测试用例中使用fixture函数,可使用于function\module\class\session

             命名方式灵活,不局限于setup/teardown;

             conftest.py配置可以实现数据共享,无需import就可自动找到配置,可供多个py文件调用;

             scope='module',可以实现多个.py跨文件共享前置;

             scope='session',可以实现多个.py跨文件使用一个session来完成用例;

             使用yeild来返回,相当于teardown的作用;

再附上个图~

3.参数化

   unittest:结合ddt实现参数化;

   pytest:直接使用@pytest.mark.parametrize装饰器

4.断言

   unittest:提供assertEqual、assertIn、assertTure、assertFalse

   pytest:直接使用assert表达式

5.用例分类执行

     unittest:默认执行全部用例,可以通过加载testsuite执行部分模块的用例;

     pytest:可以通过@pytest.mark来标记测试用例,执行命令前加上参数“-m”即可运行标记的用例;

6.失败重运行

     unittest:无

     pytest:支持用例执行失败重跑,pytest-rerunfailures插件

7.报告

     unittest:使用HTMLTestRunnerNew库

     pytest:使用pytest-TML、allure插件

6.其他问题

  1:通常自动化测试误报bug的原因是什么?

       元素定位不稳定或开发更新了页面,但是测试没有及时更新维护脚本;

  2:在执行脚本过程中,如何实现当前元素高亮显示?

        利用javaScript去修改当前元素的边框样式来达到高亮显示的效果;

  3:如果一个元素无法定位,你一般会考虑哪些因素?

       1)元素加载慢,添加等待时长;

       2)存在frame框架页,需先跳转进frame框架再定位;

       3)元素是动态元素,定位方式要优化;

       4)可能识别到了元素,但是不能操作,需先使用js把前置操作完成,或者先去除某种特性;

   4:元素定位方法有哪些?

        id、name、classname、text、xpath、css等

   5:xpath表达式

        contains,写法://标签名[contins(@属性名,‘部分属性值’)],举例://a[contains(text(),'python')],意思是找出该标签下对应text是python的元素;

        1)根据子节点,定位父节点(在元素后面加/..)

             例如:a为子节点,写法为:“//a[@id=='3']/..”

        2)模糊匹配加组元素(and

             例如://a[contains[@href,'lem']] and contains(@href,'ws')

        3)获取同等级的上一个元素 (preceding-sibling::

             例如:                  <div>

                         <a></a> <b></b>  <c></c>

                                         </div>

             根据b获取a,写法://b[@id=2/preceding-sibling::b[1]]

          4)获取同等级的下一个元素(following-slibling::

                例如:根据b获取c,写法://b[@id=2]/following-slibling::b[1]

          5)获取c标签前面的第n个标签

               例如://c[id=3]/preceding-sibling::*[n]

   6:遇到frame框架页面怎么处理?

         使用driver.switch_to.frame()跳转进去,再操作具体元素,操作完使用driver.swith_to.default_content()跳转出来。

  7:遇到alert怎么处理?

         使用driver.switch_to.alert跳转到alert弹框,然后再通过accept点击确定按钮,通过dismiss点击取消,通过text()获得弹出框口的文本;

 8:如何处理多窗口?

       在点击链接前使用driver.current_window_handle获得当前窗口句柄;再点击链接,点击后通过driver.window_handles获得所有窗口的句柄;然后再循环找到新窗口的句柄,通过driver.switch_to.window()方法跳转到新的窗口;

 9:怎么判断元素是enable、disabled、checked状态?

      通过isEnabled(),isSelected(),isDisplayed()三个方法进行判断;

10:如何处理下拉菜单?

      selenium中的select类支持对操作下拉菜单;select().select_by_index(index);

11:日历怎么处理?

     先看看能不能通过元素定位,点击日期实现,如果不能,就需要借助javascript,还有些日志控件是一个文本输入框,可以直接sendkeys()方法来实现传入一个时间的数据。

12:常见异常有哪些?

    NoSuchElementException:没有该元素

    NoSuchAttributeException :没有这样属性

    NoSuchFrameException :没有该frame

    ElementNotVisibleException :元素不可见

    ElementNotSelectableException :元素不能选择

   TimeoutException : 超时异常

   Element not visible at this point :在当前点元素不可见

13:关闭浏览器quit和close的区别?

      closes是关闭当前聚焦的tab页面;quite是关闭全部浏览器tab页面,并退出浏览器session;因此quit一般用在结束测试之前,而close用来关闭某一个页面;

14:如何实现文件上传?

     定位元素后,使用send_keys()设置,传入文件路径;

15:写的脚本能在不同的浏览器上运行吗?

     可以。可以在配置文件中设置,传入chrome就使用chrome,但是使用的驱动不一样;

16:什么是po模式?

     PO是Page Object 模式的简称,它是一种设计思想,意思是,把一个页面,当做一个对象,页面的元素和元素之间操作方法就是页面对象的属性和行为,PO模式一般使用三层架构,分别为:基础封装层BasePage,PO页面对象层,TestCase测试用例层。

17:selenium中hidden或display=none的元素是否可以定位到?

    不可以,需先用js去掉display=none属性

18:如何提高selenium脚本的执行速度?

    1)优化测试用例,多用显式等待方法,少用sleep和implicitly_wait;

    2)减少不必要的操作,如经过好几步才能打开被测试网页,可以直接通过网址打开;

    3)中断页面加载,如果加载的内容不影响我们测试,就设置超时时间,中断页面加载;

    4)使用Selenium grid,通过testNG实现并发执行。 在编写测试用例的时候,实现松耦合,然后再服务器允许的情况下,尽量设置多线程实现并发运行。

19:自动化测试的时候是不是需要连接数据库做数据校验?

    UI自动化不需要,接口自动化需要;

20:webdriver的协议是什么?

    webdriver协议本身是http协议,数据传输使用json;

21:selenium是否有读取excel文件的库?

    没有,接口自动化可使用openpyxl读写;

22:selenium有什么限制或缺陷?

   除了基于web的软件和mobile的程序,selenium不支持桌面软件自动化。软件测试报告和用例管理只能依赖第三方插件;

23:什么是JavaScript Executor,你什么时候会用到这个?

   JavaScript Executor是一个接口,给driver对象提供一个执行javaScript并访问和修改前端元素属性和值。
   还是有比较多的场景,我们可能或者需要借助javaScript来实现:
  1.元素通过现有定位表达式不能够实现点击
  2.前端页面试用了ck-editor这个插件
  3.处理时间日期插件(可能)
  4.生成一个alert弹窗
  5.拖拽滚动条
  基本语法:
     JavascriptExecutor js =(JavascriptExecutor) driver;
     js.executeScript(Script,Arguments);

24:接口自动化中的关联怎么处理?

    把上一个请求返回的结果传入到下一个请求的参数中,将请求的结果反射到一个类属性(使用setattr()函数),下一个请求去调用这个类属性。

25:接口自动化使用的测试框架是什么?

unittest :定义一个测试用例类,具体的方法来维护测试用例的生命周期,测试场景行为,测试用例 前置场景,行为,期望结果,实际结果,断言方法,Setup teardown方法

requests:接口调用 ,支持http请求的库,API 简洁,提供不同的http请求方法,支持session,cookies,

ddt :数据驱动,ddt 类装饰器,data 测试方法装饰器 unpack解包可迭代的数据类型

普通用户,数据库,配置文件—(基础数据)

openpyxl:数据管理 excel管理数据,使用openpyxl模块来进行excel数据的读和写(excle,csv, json, yaml, txt都可以管理测试数据)

pymysql:数据库交互,数据校验

eval,json:数据格式的转换 Eval将python支持的格式转换成对应的格式

logging:日志处理, 统一日志输出格式,渠道,级别,执行结果的记录,便于定位问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值