【前言:文章末尾给大家留下了大量的福利】
滴滴面试:
农餐对接系统分为了两大子系统,一个是个人订餐系统,二是餐馆、个人与农产品供应商进行农产品交易系统。我主要负责组织测试人员对该系统进行测试。
我们测试分为两个阶段:
一、功能测试阶段。主要负责编写测试计划、测试用例、部署禅道BUG管理系统,进行功能测试。
首先,我们将系统分为了订餐平台、采购平台、登录注册、消费者/餐馆/供应商后台等七个模块。
其次,使用等价类划分和边界值分析法相结合,针对每个模块设计测试用例。
二、 UI层自动化测试。使用PO设计模式,工具是Selenium+Unit test+Jenkins。
2.1 目的
这个阶段,是在我们项目需求已经明确,版本已经稳定的情况下开始的,主要考虑了几个方面:
1. UI层在多平台、多浏览器下运行结果存在不同。也就是需要我们在不同平台、浏览器下运行相同的测试案例,大量的重复劳作力
2. 其次,我们项目因为前期设计不够严谨、版本部署不够规范,会出现BUG重复出现的情况,也就是需要我们每日构建后进行回归测试。
3. 同时,自己希望能够锻炼编程能力。
2.2 内容
在设计UI层自动化测试用例的时候,使用的是PO设计模式,也就是把每一个页面所需要操作的元素和步骤都封装在一个页面类中。然后 Selenium+Unit test搭建四层框架——实现数据、脚本、业务逻辑分离(关键字驱动)
1)基础层(BasePage)
设计一个基本的Page类,所有页面皆继承该类。提供了一个页面需要实现的基本功能及公共方法。
2)业务逻辑层(Pages):
按照PO设计模式,将每个页面抽象为一个类,放在Pages包里面,每个页面继承Basepage,可调用Data层数据,内容包括:
3)数据层(Data)
该层存放相关数据,例如:用户数据和密码。在测试用例可通过调用数据层的数据来进行操作。
4)测试用例层(Testcases)
每一个测试用例testcase都对应Pages里面的一个页面,继承unnitest.TestCase类。通过调用对应页面类的方法,数据层的数据、增加断言(assert)来验证功能的正确性。
此外通过Jenkins自动执行测试、代码质量检测和部署到测试服务器、部署到生产服务器上
使用Jenkins持续集成工具来执行测试脚本和部署,主要设置了三个任务:
我们将测试分为三个阶段:
1. 开发新的需求时,创建分支devN。当在这个分支中,需求开发完成或者Bug修复,就配合测试人员利用JUNit框架进行单元测试以及功能测试。通过测试后,合并到master上。
2. 当master有变动,则触发tm_test任务,执行自动化测试脚本和代码质量检测。如果通过则自动触发tm_staging_deploy,部署到测试服务器,如果没有通过,自动化测试脚本会将Bug截图发送给测试人员。
3. 登陆生产服务器上,对网站进行功能测试。如果通过测试,则手动触发tm_deploy,部署到生产服务器。如果没有通过,在禅道管理系统上把bug指派给相应模块的开发人员。
http://blog.csdn.net/kufei123/article/details/47375065
误报通常是我们在使用selenium的最头疼的问题,这使得很难把selenium测试用例加入到自动构建中。有些构建是必须要成功的,如果失败将会阻塞整个发布流程。
解决方法——重试我们的解决方案是在测试步骤和测试集中都加入重试机制。
产生误报最大原因是selenium在页面加载完成之前就开始请求页面资源。
重试机制:
利用递归封装了一个等待元素的方法。其中,设置最大等待时间为1s,轮询时间为50ms,这个方法会不断轮询,直到方法执行成功或者超过设置的最大等待时间。在我们最好的一次实践中,我们把一个测试用例的误报率从10%降低到0,并且执行时间从原先的45秒降低到33秒。
@annotation.tailrecprivate def retry[A](maxWaitMillis: Long, pollIntervalMillis: Long)(callback: => A): A = {
val start = System.currentTimeMillis
Try {
callback
} match {
case Success(value) => value
case Failure(thrown) => {
val timeForTest = System.currentTimeMillis - start
val maxTimeToSleep = Math.min(maxWaitMillis - pollIntervalMillis, pollIntervalMillis)
val timeLeftToSleep = maxTimeToSleep - timeForTest
if (maxTimeToSleep <= 0) { throw thrown } else { if (timeLeftToSleep > 0) {
Thread.sleep(timeLeftToSleep)
}
retry(maxWaitMillis - pollIntervalMillis, pollIntervalMillis)(callback)
}
}
}
}
其余还有元素定位问题:
我们主要通过Selenium WebDriver进行元素定位。但是会遇到两大类定位不到元素的情况:
1. ElementNotVisible元素不可见
对于这种情况,这个元素display = none/hidden,通过JS更改display = block来解决
2. NoSuchElementException没有这种元素
1)最常见的:页面没有加载完全,我们就去定位这个元素。
2)动态ID无法定位元素——1)直接使用Xpath相对路径;2)根据部分元素定位
3)Iframe——switch_to_iframe
4) Alert——switch_to_alert
5)下拉框——Select标签下拉框、二次定位
他就是功能测试,使用WebDriver真实的模拟了用户的操作过程。
4.有无发现selenium的BUG
5. 与人工测试相比,Selenium测试的产出,相对的优势?
6. 有没有封装过Selenium方法?
有,在BasePage层,我们就对实现一个页面的基本功能进行了封装。
例如:
1. 设置重试机制。
2. 对webdriver各种方法进行封装。
Selenium是浏览器自动化工具,主要用来Web的自动化测试,以及基于Web的任务管理自动化。它支持的语言有:python、Java、ruby、JavaScript等,并且几乎能在主流的浏览器上运行。
Selenium2.0、Selenium3.0主要由三大部分组成:SeleniumIDE、Selenium WebDriver、Selenoium Grid。
VS Selenium RC(Selenium1.0):在浏览器中运行javaScript,使用浏览器内置的JavaScript来翻译和执行selense
1)RC原理
在Selenium1.0中,是通过Selenium RC服务器作为代理服务器去访问应用从而达到测试的目的。
Selenium RC分为三个部分,Launcher、HttpProxy、Core。
然而直接运行JavaScript会有极大的安全漏洞,所以会受到“同源限制”,在这个基础上,Selenium2.0引入了WebDriver。
2)Web Driver原理
webDriver是按照client/server模式设计的。client是我们的测试脚本,发送请求;server就是打开的浏览器,用来接收client的请求并作出响应。
具体的工作流程:
所以web Driver用到的协议:
其中:
1)优化测试用例。
2)使用Selenium grid,通过testNG实现并发执行。
说到这里,在编写测试用例的时候,一定要实现松耦合,然后再服务器允许的情况下,尽量设置多线程实现并发运行。
3)设置等待时间、中断页面加载。如果页面加载内容太多,我们可以查看一下加载缓慢的原因,在不影响测试的情况下,可以设置超时时间,中断页面加载。
首先我们要分析出不稳定的原因,然后有针对的去解决。
1)页面加载内容太多。如果页面加载内容太多,在不影响测试的情况下,我们可以设置超时时间,中断页面加载。
2)网络原因。设置等待时间,如果在响应时间内没有加载成功,则重新执行测试。
3)优化代码,减少容易冲突的函数。
4)多线程运行时,测试用例间相互影响。在并发操作时,如果用例之间的耦合性没有设计好,就会有影响。
综上所述,我们就可以用线程的方式来监控测试进程的WEB加载执行状态。
1. 一旦项目发生变化,测试用例就需要改进,工作量大。
2. 验证的范围有限,操作更加复杂,比如说简单的一个验证验证码,如果是人工识别很快就可以输入,但是自动化测试中会增添很多困难。那么这个时候速度也不如人工。
3. 不稳定
4. 可靠性不强
5. 成本与收益
然而直接在浏览器中运行JavaScript会有很大的安全漏洞,所以就会受到“同源策略”的限制。也就是,当你去要运行一个脚本的时候,会进行同源检查,只有和被操控网页同源的脚本才能被运行。
Selenium1.0是通过采用代理模式来解决这个问题的。
在这个基础上,Selenium2.0是通过webDriver来时先跨平台的。WebDriver是针对各个浏览器来开发,是一个远程控制界面,提供了一组接口来发现和操作Web文档中的DOM元素并控制用户代理的行为。
在前期,我们也配合了开发人员使用JUnit框架进行单元测试,测试覆盖率从0提升到50%。
但是随着版本的稳定,我们开始考虑UI层是与客户交互最多的界面,如果要提高用户体验,必须从UI层入手。其次,大量并且重复的劳动力都集中在UI层,所以我们考虑到进行UI层自动化测试解放劳动力。
我们从以下几个方面来回答:
1. 自动化测试的内容?
2. 自动化测试用例设计的原则
3. 使用的框架/设计模式
将一个页面内的操作对象(按钮框、输入框等)和操作的步骤封装在每个Page里面,也Page为单位进行管理。这样Selenium测试用例能够通过调用页面类来获取页面元素,从而巧妙的避开了当页面元素的ID等属性发生变化时,修改代码的情况。——>提高了代码的复用性、可读性及减少工作量。
1. 基础层(BasePage)
设计一个基本的Page类,所有页面皆继承该类。提供了一个类需要实现的基本功能及公共方法。
2. 业务逻辑层(Pages):
按照PO设计模式,将每个页面抽象为一个类,放在Pages包里面,每个页面继承Basepage,可调用Data层数据,内容包括:
3. 数据层(Data)
该层存放相关数据,例如:用户数据和密码。在业务逻辑层可通过调用数据层的数据来进行操作。
4. 测试层(Testcases)
每一个测试用例testcase都对应Pages里面的一个页面,继承unnitest.TestCase类。通过调用对应页面类的方法,增加断言(assert)来验证功能的正确性。其中每个测试用例都以test_开头。
此外通过Jenkins自动执行测试、代码质量检测和部署到测试服务器、部署到生产服务器上
自动化测试用例的执行主要是通过Jenkins来实现的。而执行的策略是根据测试用例的类别、目的来设计的。
在Jenkins中,我们设定了三个任务:
测试用例的目的分为三种情况:
1)用来监控。
在此目的下,我们就把自动化测试用例设置成定时执行的,如果每五分钟或是一个小时执行一次,在jenkins上创建一个定时任务即可。
2)必须回归的用例
当修复了新功能或者Bug以后,首先开发人员进行冒烟测试,如果通过了JUnit单元测试,交给测试人员进行功能测试。通过测试后,合并到master。
master一旦有变化,则触发tm_test任务,执行自动化测试脚本和代码质量检测。如果通过,则自动触发tm_staging_deploy,部署到staging服务器上,没有通过的话,自动化测试脚本会自动发送Bug截图给测试人员。
3)不需要经常执行的测试用例/生产服务器上的代码
有些非主要业务线的代码,或者生产服务器上的代码已经很稳定了,不需要时时回归,所以我们采用人工执行,在jenkins创建一个任务,需要执行的时候人工去构建即可。
Jenkins是持续集成的工具,能够自动执行测试和代码检测,以及部署到服务器上。
需要的先关注再私我关键字【000】免费获取哦 注意关键字是:000
疑惑:为什么要先关注呢? 回:因为没关注的话私信回了你看不到
app项目,银行项目,医药项目,电商,金融
听说关注我并三连的铁汁都已经升职加薪暴富了哦!!!!