1、unitTest的原理:
一个TestCase的实例就是一个测试用例。什么是测试用例呢?就是一个完整的测试流程,包括测试前准备环境的搭建(setUp),执行测试代码(run),以及测试后环境的还原(tearDown)。元测试(unit test)的本质也就在这里,一个测试用例是一个完整的测试单元,通过运行这个测试单元,可以对某一个问题进行验证。
而多个测试用例集合在一起,就是TestSuite,而且TestSuite也可以嵌套TestSuite。
TestLoader是用来加载TestCase到TestSuite中的,其中有几个loadTestsFrom__()方法,就是从各个地方寻找TestCase,创建它们的实例,然后add到TestSuite中,再返回一个TestSuite实例。
TextTestRunner是来执行测试用例的,其中的run(test)会执行TestSuite/TestCase中的run(result)方法。
测试的结果会保存到TextTestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息。
而对一个测试用例环境的搭建和销毁,是一个fixture。
unitest的工作原理
通过unittest类调用分析,可将框架的工作流程概况如下:
编写TestCase,由TestLoader加载TestCase到TestSuite,然后由TextTestRunner来运行TestSuite,最后将运行的结果保存在TextTestResult中。
2、Python是如何进行内存管理的?
Python引用了一个内存池(memory pool)机制,即Pymalloc机制(malloc:n.分配内存),用于管理对小块内存的申请和释放
内存池(memory pool)的概念:
当 创建大量消耗小内存的对象时,频繁调用new/malloc会导致大量的内存碎片,致使效率降低。内存池的概念就是预先在内存中申请一定数量的,大小相等 的内存块留作备用,当有新的内存需求时,就先从内存池中分配内存给这个需求,不够了之后再申请新的内存。这样做最显著的优势就是能够减少内存碎片,提升效率。
内存池的实现方式有很多,性能和适用范围也不一样。
python中的内存管理机制——Pymalloc:
python中的内存管理机制都有两套实现,一套是针对小对象,就是大小小于256bits时,pymalloc会在内存池中申请内存空间;当大于256bits,则会直接执行new/malloc的行为来申请内存空间。
关于释放内存方面,当一个对象的引用计数变为0时,python就会调用它的析构函数。在析构时,也采用了内存池机制,从内存池来的内存会被归还到内存池中,以避免频繁地释放动作。
3、如何结束一个进程?
答:
(1)调用 terminate 方法。
(2)使用 subProcess 模块的 Popen 方法。使用简单,具体用法,这里不展开。
4、说说接口测试的流程,介绍一下request有哪些内容。
答:
(1)流程:获取接口文档,依据文档设计接口参数,获取响应,解析响应,校验结果,判断测试是否通过。
(2)request 内容:
① 封装了各种请求类型,get、post 等;
② 以关键字参数的方式,封装了各种请求参数,params、data、headers、token 等;
③ 封装了响应内容,status_code、json()、cookies、url 等;
④ session 会话对象,可以跨请求。
5、UI 自动化,如何做集群?
答: Selenium Grid。
6、介绍一下你在这个项目中是如何使用 Jenkins 的
答:比如定时构建执行代码
7、python列表和字典有什么区别?
答: 一般都是问列表和元组有什么不同。
(1)获取元素的方式不同。列表通过索引值获取,字典通过键获取。
(2)数据结构和算法不同。字典是hash算法,搜索的速度特别快。
(3)占用的内存不同。
8、事件处理:
*下拉菜单中如何去选择一个菜单项?
答:如果下拉菜单是select标签,使用方法:
*如何处理alert弹窗?
答:处理alert弹窗首先需要先跳转到alert上,然后在点击确定或者取消按钮,
Alert alet=driver.switchTo().alert();//切换到alert
*如何用webdriver进行鼠标右键点击操作?
答:使用Actions类
9、Bug 定位、分析、类型。
10、Selenium的核心Selenium Core基于JsUnit,完全由JavaScript编写,因此可以用于任何支持JavaScript的浏览器上。
selenium可以模拟真实浏览器,自动化测试工具,支持多种浏览器,爬虫中主要用来解决JavaScript渲染问题。
11、Selenium查找元素:通过2种不同的方式去获取响应的元素,第一种是通过id的方式,第二个中是CSS选择器,结果都是相同的。
Selenium查找定位元素:
---WebDriver提供了多种多样的find_element_by方法在一个网页里面查找元素。
---ID、class name等
---XPath进行查找
XPath是一种在XML文档中搜索和定位节点node的一种查询语言。所有的主流Web浏览器都支持XPath。Selenium2可以用强大的XPath在页面中查找元素。
常用的XPath的方法有starts-with(),contains()和ends-with()等
----CSS选择器进行查找
CSS是一种设计师用来描绘HTML文档的视觉的层叠样式表。
12、4、如何提高selenium脚本的执行速度?
- Selenium脚本的执行速度受多方面因素的影响,如网速,操作步骤的繁琐程度,页面加载的速度,以及我们在脚本中设置的等待时间,运行脚本的线程数等。所以不能单方面追求运行速度的,要确保稳定性,能稳定地实现回归测试才是关键。
我们可以从以下几个方面来提高速度:
一,减少操作步骤,如经过三四步才能打开我们要测试的页面的话,我们就可以直接通过网址来打开,减少不必要的操作。
二,中断页面加载,如果页面加载的内容过多,我们可以查看一下加载慢的原因,如果加载的内容不影响我们测试,就设置超时时间,中断页面加载。
三,在设置等待时间的时候,可以sleep固定的时间,也可以检测某个元素出现后中断等待也可以提高速度。
四,配置testNG实现多线程。在编写测试用例的时候,一定要实现松耦合,然后在服务器允许的情况下,尽量设置多线程运行,提高执行速度。
13、什么是断言?
-断言的英文是assertion,断言检查的英文是assertion checking。
-断言是指定一个程序必须已经存在的状态的一个逻辑表达式,或者一组程序变量在程序执行期间的某个点上必须满足的条件。
14、python安装 Selenium 工具包
安装好的 Python 默认有 pip Python 包管理工具,可以通过 pip 非常方便的安装Selenium。
启动命令行工具:Win+R | 输入 cmd | 回车
输入命令:
pip install selenium
15、Selenium WebDriver API 的使用
16、Selenium控制浏览器也是自动化测试的一个基本组成部分,我们可以将浏览器最大化,设置浏览器的高度和宽度以及对浏览器进行导航操作等。
17、使用unittest需要以下简单的三步:
引入unittest模组
继承unittest.TestCase基类
测试方法以test开头
18、Page Object模式是Selenium中的一种测试设计模式,主要是将每一个页面设计为一个Class,其中包含页面中需要测试的元素(按钮,输入框,标题等),这样在Selenium测试页面中可以通过调用页面类来获取页面元素,这样巧妙的避免了当页面元素id或者位置变化时,需要改测试页面代码的情况。当页面元素id变化时,只需要更改测试页Class中页面的属性即可。
*它的好处如下:
集中管理元素对象,便于应对元素的变化
集中管理一个page内的公共方法,便于测试用例的编写
后期维护方便,不需要重复的复制和修改代码
*具体的做法如下:
创建一个页面的类
在类的构造方法中,传递 WebDriver 参数。
在测试用例的类中,实例化页面的类,并且传递在测试用例中已经实例化的WebDriver对象。
在页面的类中,编写该页面的所有操作的方法
在测试用例的类中,调用这些方法
19、什么是数据驱动测试:
通过 CSV 文件 或者 MySQL 数据库,是主流的数据驱动方式。
主要的数据驱动方式有两种:
a、通过 文本文件或者 Excel 文件存储数据,并通过程序读取数据,遍历所有的行
b、通过数据库存储数据,并通过程序和 SQL 脚本读取数据,遍历所有的行
*具体的步骤:
1、python的字典类型 dict 类型
2、python的读写文件
3、python的读写数据库
4、for循环
5、注意资源的释放
6、关闭数据库游标和连接
7、关闭文件
*测试方案的编码实现
main.py 测试入口
runner.py 测试运行器
cases 测试用例
pages 测试页面
base 底层封装与驱动
*测试报告:HTML 测试报告的生成
HTML测试报告需要引入HTMLTestRunner
20、jenkins你都用了哪些插件?
比如:
ssh remote hosts 这个可以在远程服务器上面执行脚本。
Role Strategy Plugin 用来精细化管理权限。
SCM: 除CVS和Subversion外需要实现与源代码控制系统支持的插件。 3 L1 O# q2 R& _+ U3 B
Triggers: 事件监听并触发构建的插件。例如,URL改变触发器将监控一个URL;当地址内容发生改变,这个触发器就将执行一次作业。
Build tools: 实现额外构建工具的插件,如MSBuild和Rake。如果您想在Hudson中构建非Java的软件时这些就特别有用。
Build wrappers: 通常涉及时执行在受控制的构建过程本身之前和之后事件的插件。例如, VMware插件将在构建之前启动一个客户虚拟机,建立和然后在构建完成后关闭它。这在您可能需要访问VM以执行单元测试的情况下是非常有用的。
21、Jmeter:Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域。 它可以用于测试静态和动态资源,例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库、FTP 服务器, 等等。JMeter 可以用于对服务器、网络或对象模拟巨大的负载,来自不同压力类别下测试它们的强度和分析整体性能。另外,JMeter能够对应用程序做功能/回归测试,通过创建带有断言的脚本来验证你的程序返回了你期望的结果。为了最大限度的灵活性,JMeter允许使用正则表达式创建断言。
22、 如何使用Jmeter进行并发测试
步骤概述:
编写脚本;使用 JMeter 进行本地测试;
BlazeMeter 沙箱测试;
使用一个控制台和一个引擎,设置每个引擎的用户数量;
设置和测试集群(一个控制台和 10 到 14 个引擎);
使用主从功能达到最大并发量目标。
23、unintest创建一个suite集合
def suite():
#创建一个suite集合;
suite = unittest.TestSuite()
# 该方法是添加该类下的一个测试用例
suite.addTest(TestUnit("test_case2"))
# 该方法添加该类下的所有测试用例;
suite.addTest(unittest.makeSuite(TestUnit2))
return suite
24、加载测试模块
'''加载测试模块来执行(TestLoader)'''
if name == 'main':
suite=unittest.TestLoader().loadTestsFromModule(BaiduLink)
# suite=unittest.TestLoader().loadTestsFromModule("f2.py")
unittest.TextTestRunner(verbosity=2).run(suite)