测试自动化面试题



打开这个网站 http://www.python3.vip

学习好 Python基础 和进阶部分知识,回答下面问题



Python:

  • 下面代码的运行结果是什么
    a = 1
    b = a
    b = 2
    print a
    


    答: 1



  • 这行代码 ‘1234’[3:] 的运行结果是什么
    答: ‘4’



  • 执行import语句的时候,解释器是如何 查找模块文件的?
    答:最终是通过 sys.path决定的。通常我们可以通过修改环境变量 PYTHONPATH 来添加自己的模块搜索路径



  • 怎么把一个 字符串 转换为整型
    答:可以使用 int函数

  • tuple 和list 的区别主要是什么?
    答: tuple是不可变的,list是可变的 mutable



  • 怎么把一个数字格式化输出为 10位宽度, 不足前面补零?
    答:可以用’%010d’ % 56 或者 ‘‘.format(56)



  • 打开文件的时候 用with open … as … 这种方式有什么好处?
    答:这种方式不需要调用 close方法关闭文件句柄, 如果用直接用 fh = open(….)这种方式,如果忘掉关闭文件句柄,会造成文件一直打开的后果。



  • read,readline和readlines 的区别是什么
    答: read 读取整个文件 readline 读取下一行, readlines 读取整个文件,返回一个列表,列表中每个元素就是文件汇总的每行内容



  • 类的静态属性和实例属性的区别是什么?
    答:静态属性时属于类的, 所有实例公有的属性,只有一份。 而实例属性是每个实例各自独有的属性。



  • 类的静态方法和实例方法的区别是什么?
    答:实例方法的调用离不开实例,我们需要把实例自己传给函数,而静态方法可以通过类名进行访问。静态方法里面不能访问实例属性



  • 面向对象中 组合和 继承的区别
    答: 比如 一个 汽车 对象 拥有一个 发动机 对象 和 4个 轮胎 对象 可以说汽车对象由 发动机 对象和轮胎对象组成 ,这就是对象的组合 而一个 东北虎可以继承自老虎对象, 这就是继承 组合是 “有一个”的关系,而继承是“是一个”的关系



  • 什么是多态?
    答:多态是面向对象设计的一种机制、一种能力。它主要指 对某个类的子类和父类的实例对象, 调用同样的方法,其执行的效果多种多样。 这样的一个特点。 参考 https://www.zhihu.com/question/30082151



  • 一个目录要成为python的package 需要有什么?
    答:需要在目录下面加上 init.py 文件



  • Python中调用外部程序有哪些方法?
    答:可以使用 os.system 或者 subprocess模块里面的函数(比如check_output)或者Popen类



  • Python 怎样非阻塞(也就是python程序不需要等待被调用程序结束就可以继续运行下面的代码)启动一个外部程序的方法?
    答: 可以用subprocess 的 Popen类,比如
    from subprocess import Popen
    process = Popen(args='mspaint', shell=True)
    print 'done'
    



  • python 函数参数定义里面 * , ** 分别是什么意思
    答: 可变参数 和 关键字可变参数 函数参数的概念可以复习一下下面的例子 ```python def func(a, b, c=0, *args, **kw): print ‘a =’, a, ‘b =’, b, ‘c =’, c, print ‘args =’, args, ‘kw =’, kw

其中 a,b 是 必填参数、c是缺省参数、args是可变参数, kw 关键字可变参数



<br><br>
- 如果我想直接存储一个python dict 对象到文件里面,该怎么做?
<br>答 :可以使用pickle 或者json 将对象进行序列化

<br><br>
- range(10000) 和 xrange(10000) 的区别
<br>答: 前者会立刻产生出一个list对象包含0到9999所有数字, 而后者并不立刻产生 包含所有数字的list 对象。
一般比较大的循环,建议使用xrange,这样会更快一些

<br><br>
- 在什么情况下,python对象会被解释器清除?
<br>答: 当该对象没有任何 指向它的引用(引用计数为0)

<br><br>
- 两个线程更新一个dict 里面的内容,该怎么设计
<br>答:  在访问共享对象的代码前,要调用Lock对象的acquire方法,进行上锁操作。当多个线程同时执行lock.acquire()时,只有一个线程能成功地获取锁,然后继续执行代码,其他线程就继续等待直到获得锁为止。
访问结束后,一定要调用Lock对象的release方法,进行解锁操作。否则其它等待锁的线程将永远等待下去,成为死线程


<br><br>
- 什么是 GIL , GIL 带来的问题是什么? 
<br>答: GIL 是全局解释器锁, Python中每个线程执行的时候要获取这个锁 才能 执行代码。 所以Python中的多线程不能真正做到并行执行代码。不能发挥CPU多核的优势。

<br><br>
- 装饰器 是什么回事? 
<br>答:
Python中装饰器通常用来装饰函数、或者类的方法。
被装饰后的函数, 原有的函数基础上,会多出增加一点功能,或者功能有一些变化。
一般来说装饰器本身也是一个函数,我们可以把装饰器 想象成包含了 被装饰的函数。

<br><br>
- python 的代码中如果有中文,代码文件应该做如何处理
<br>答: 在顶部注释中 加入 类似  # coding=utf8 这样的声明 , 但是要注意代码文件是什么中文编码,是gbk还是utf8 , 声明的编码格式匹配就可以了。




<br><br>
- 怎么把unicode字符串的编码为utf8的字符串
<br>答: 比如  'abcd'.encode('utf8')

<br><br>
- 进程间通信有哪些方法?
<br>答: 共享内存,socket 通信 都可以

<br><br>
- 多线程如何同步和互斥?
<br>答: python 中可以用 threading.Lock 或者条件变量等 方法

<br><br>
- Python中如何捕获所有的异常?
<br>答:如下
```python
try:
   ...
except :
   ...



  • Python中如何指定一段代码,不管是否有异常发生都执行的?
    答:可以用finally 语句,如下
    try:
     ...
    except :
     ...
    finally: 
     ...
    



  • 进程和线程的区别
    答:进程是运行着的程序,而线程是进程中指令的执行单元。 代码指令必须在操作系统分配的线程中执行。 一个进程至少包含一个线程。



  • python怎么实现一个单例模式的类
    答:参考 http://www.cnblogs.com/dyllove98/archive/2013/07/20/3202955.html



  • 请用一种算法将一个包含了n个整数的列表 按从小到大的顺序进行排序
    答:可以使用下面的冒泡排序法
    def bubbleSort(alist):
      # j 是最后一个元素 到 第二个元素
      for j in range(len(alist)-1,0,-1):
          for i in range(0, j):
              if alist[i] > alist[i+1]:
                  alist[i], alist[i+1] = alist[i+1], alist[i]
      return alist
    




Selenium



  • 请画出Selenium 的架构示意图
    答:
[[https://github.com/jcyrss/songqin-testdev/blob/master/pictures/selenium1.png alt=selenium]]



  • Selenium 有哪些选择元素的方法
    答:可以根据 id ,name 属性, class 属性等, 最灵活的是css选择器 和xpath 选择器 (自行复习一下css选择器,xpath的语法)




Django



  • Django中一个http请求由那个函数处理是怎么决定的?
    答:根据url路由配置



  • django 通常要和那些wsgi server 一起使用?
    答: Gunicorn 或者 uwsgi , 也可以使用 cherrypy等



  • django 开发的web应用,性能瓶颈通常会有哪些?
    答: 一般性能瓶颈通常在数据库操作上面,特别是数据表很大的时候,访问操作又特别复杂(比如 多个表的联合查询)



  • 提高数据库查询性能的方法通常有哪些?
    答: 合理的加索引




Robotframework



  • RF作为测试框架, 提供了哪些功能?


答: 为测试用例的开发提供 清晰明了 的 关键字定义用例的模式 为自动化项目 的套件、用例目录结构 提供 比较灵活的初始化、清除的 机制 为自动化项目的执行提供 灵活的用例、套件选择机制 为测试结果提供 清晰、细致 的日志和报表



  • RF 怎么定义一个变量?
    答:
    可以在用例中定义 : ${var1}= Set Variable hello 可以在Settings 表中声明 ${var1} hello



  • RF 循环的写法
    答: 如下
      ${list}=     create list    1  2  3  4 
      :FOR    ${index}    IN   @{list}
      \    Log To Console    ${index}
    



  • RF 条件判断的写法
    答: 如下
      Run Keyword If    '2016' in $html and 'UTC' in $html
      ...               log to console   \n2016年的,UTC时间
      ...   ELSE IF    '2016' in $html   log to console   \n2016年的
      ...   ELSE IF    'UTC' in $html    log to console   \nUTC时间
      ...   ELSE                         log to console   \n以上都不是
    



  • RF 的Setup 、Teardown 是如何设置的
    答:可以在 测试套件目录的初始化脚本文件 init.robot中, 可以在 测试套件文件的 Settings表中,可以在测试用的 [Setup][Teardown] 配置项中。



  • RF 执行的时候怎么过滤选择 用例和套件
    答: 可以通过 –test –suite 参数根据 名称过滤, 也可以用参数 –include 根据 用例标签 过滤




Appium



  • 请画出Appium的架构示意图
    答: appium-arch



  • 开发移动应用自动化的大体步骤有哪些
    答:主要就是根据要操作的元素的属性特征,选择到这些元素,然后调用Appium 库的方法操作这些元素,获取元素的信息(主要是文本内容)。 分析元素信息是否正确



  • 怎样查看移动应用的界面元素的属性
    答:可以通过 UIAutomate Viewer 工具



  • Appium 选择元素的方法有哪些
    答:通过 resource id, class name, accessibility id, xpath, UIAutomator API 的java代码



  • Appium 怎样滑动屏幕
    答:可以通过 WebDriver的swipe 方法




其它



  • 负载测试和压力测试的区别
    答:根据 国外Wiki上的解释
    负载测试 主要是 根据需求规格上说明的应该能承受系统负荷,模拟相应的负荷量,看看系统是否能满足需求规格
    而压力测试 则是 模拟超出需求规格上说明的更大的负载情况下, 系统的健壮性如何(是否会崩溃等)