qileilove

blog已经转移至github,大家请访问 http://qaseven.github.io/

Selenium webdriver的各种driver

selenium官方加上第三方宣布支持的驱动有很多种;除了PC端的浏览器之外,还支持iphoneandroid的driver;大概记录一下selenium支持的各种driver的用途与说明。
  selenium可支持的PC浏览器驱动包括:
  FF driver【包含在各自语言的客户端里】
  safari driver【包含在selenium server中】
  ie driver
  chrome driver 【第三方】
  opera driver【第三方】
  selenium可支持的伪浏览器驱动:
  PhantomJS Driver【第三方】
  HtmlUnit Driver【包含在selenium server中】
  selenium可支持的移动端驱动:
  Windows Phone driver 【第三方】
  Selendroid -Selenium for Android【第三方】
  ios-driver 【第三方】
  Appium  支持iphone、ipad、android、FirefoxOS【第三方】
  上述的所有驱动不仅可以直接通过各自语言客户端来调用,还是注册到selenium grid中进行分布式的远程调用。
  因为移动端的driver都没有尝试过,所以就不做说明。PC端的driver都是基于浏览器的,主要分为2种类型:
  一种是真实的浏览器driver
  比如:safari、ff都是以插件形式驱动浏览器本身的;ie、chrome都是通过二进制文件来驱动浏览器本身的;
  这些driver都是直接启动并通过调用浏览器的底层接口来驱动浏览器的,因此具有最真实的用户场景模拟,主要用于进行web的兼容性测试使用。
  一种是伪浏览器driver
  selenium支持的伪浏览器包括htmlunit、PhantomJS;他们都不是真正的在浏览器、都没有GUI,而是具有支持html、js等解析能力的类浏览器程序;这些程序不会渲染出网页的显示内容,但是支持页面元素的查找、JS的执行等;由于不进行css及GUI渲染,所以运行效率上会比真实浏览器要快很多,主要用在功能性测试上面。
  htmlunit是java实现的类浏览器程序,包含在selenium server中,无需驱动,直接实例化即可;其js的解析引擎是Rhino
  PhantomJS是第三方的一个独立类浏览器应用,可以支持html、js、css等执行;其驱动是Ghost driver在1.9.3版本之后已经打包进了主程序中,因此只要下载一个主程序即可;其js的解析引擎是chrome 的V8。
  driver类型优点缺点应用
  真实浏览器driver真实模拟用户行为效率、稳定性低兼容性测试
  HtmlUnit速度快js引擎不是主流的浏览器支持的包含少量js的页面测试
  PhantomJS速度中等、模拟行为接近真实不能模拟不同/特定浏览器的行为非GUI的功能性测试
  PS:除上述的几种真实浏览器driver中,也可以通过不同的手段来取消浏览器的css解析、界面渲染等目的;这样既可以保证浏览器的真实兼容性、也可以提高执行效率问题;使用的手段有:autoit、pyvirtualdisplay、浏览器设置等。
几种PC端driver的效率比较:
from selenium import webdriver
import time
drivers = ['HtmlUnit', 'PhantomJS', 'Chrome', 'FF', 'IE']
dervers_time = {
'HtmlUnit' : 0,
'PhantomJS' : 0,
'Chrome' : 0,
'FF' : 0,
'IE' : 0,
}
times = 50
def run_with_Chrome():
common_step(webdriver.Chrome())
def run_with_FF():
common_step(webdriver.Firefox())
def run_with_IE():
common_step(webdriver.Ie())
def run_with_PhantomJS():
common_step(webdriver.PhantomJS(executable_path=r'C:\Python27\Scripts\phantomjs.exe'))
def run_with_HtmlUnit():
driver = webdriver.Remote("http://localhost:4444/wd/hub",
desired_capabilities=webdriver.DesiredCapabilities.HTMLUNIT)
common_step(driver)
def common_step(driver):
driver.get('http://www.baidu.com')
ele = driver.find_element_by_id('su')
print ele.get_attribute('value')
driver.quit()
for i in range(times):
print '=============Times %s============' % i
for driver in drivers:
start = time.time()
print start
eval('run_with_%s()'%driver)
end = time.time()
print end
elapse_time = end-start
dervers_time[driver] += elapse_time
print 'elapse for %s:%s' % (driver, elapse_time)
for k,v in dervers_time.items():
print 'avg elapse for %s in %s times:%s' % (k, times, v/times)
  得出的结果:
  最快的依次是htmlunit、PhantomJS、chrome、ie、ff

posted @ 2014-02-18 11:29 顺其自然EVO 阅读(2102) | 评论 (0)编辑 收藏

JIRA+MySQL配置

1、JDK、JIRAMySQL安装完毕,停止JIRA服务
  创建数据库
  mysql
  create database jiradb character set ‘UTF8′;
  创建用户并赋与权限:
create user jirauser identified by ‘jira’;
grant all privileges on *.* to ‘jirauser’@'%’ identified by ‘jira’ with grant option;
grant all privileges on *.* to ‘jirauser’@'localhost’ identified by ‘jira’ with grant option;
flush privileges;
  2、修改JIRA端口
  JIRA是集成在Tomcat上面的,所以修改端口的方法和Tomcat修改端口的方法是一样的。
  3、JIRA默认使用的数据库是HSql,如果要迁移到MySQL,可以通过以下的配置改动。
  1)修改server.xml (路径:/jira/conf/server.xml)
  第13行:
username=”jirauser”
password=”780824″
driverClassName=”com.mysql.jdbc.Driver”
url=”jdbc:mysql://localhost:3306/jiradb?autoReconnect=true&useUnicode=true&characterEncoding=UTF8″
(删除minEvictableIdleTimeMillis and timeBetweenEvictionRunsMillis项 )
maxActive=”20″
validationQuery=”select 1″/>
  注:以上“localhost”可不该,也可改为主机名或设为”主机IP:端口“,mysql端口号为”3306“。
  b)修改entityengine.xml (路径:/jira/atlassian-jira/WEB-INF/classes/entityengine.xml)
  第100行修改为:
  <datasource name=”defaultDS” field-type-name=”mysql”
  删除schema-name=”PUBLIC”
  4、安装连接驱动包 Mysql JDBC Driver
  cp  mysql-connector-java-5.1.7-bin.jar   /jira/common/lib/
  5、启动JIRA服务 。
  现在JIRA的数据库已经是MySQL了。
  如果希望更进一步,将JIRA服务的依赖服务中加上MySQL服务,可以在注册表中更新
  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\JIRA240209102746
  JIRA240209102746由于是JIRA服务名太长而在注册表中随机生成的名字,在基中添加一个DependOnService多文本键值,把MySQL服务名添加进去就行了
  这样的结果是JIRA依赖于MySQL,JIRA会在MySQL启动后启动,如果MySQL停止,JIRA会先于MySQL停止

posted @ 2014-02-18 11:28 顺其自然EVO 阅读(299) | 评论 (0)编辑 收藏

Karma和Jasmine自动化单元测试

  前言
  在Java领域,Apache, Spring, JBoss 三大社区的开源库,包罗万象,但每个库都在其领域中都鹤立鸡群。而Nodejs中各种各样的开源库,却让人眼花缭乱,不知从何下手。
  Nodejs领域: Jasmine做单元测试,Karma自动化完成单元测试,Grunt启动Karma统一项目管理,Yeoman最后封装成一个项目原型模板,npm做nodejs的包依赖管理,bower做javascript的包依赖管理。Java领域:JUnit做单元测试, Maven自动化单元测试,统一项目管理,构建项目原型模板,包依赖管理。
  Nodejs让组合变得更丰富,却又在加重我们的学习门槛。我还说不清楚,也看不透!
  上面写的有点远了,回到文章的主题,Jasmine+Karma自动化单元测试。
  目录
  Karma的介绍
  Karma的安装
  Karma + Jasmine配置
  自动化单元测试
  Karma和istanbul代码覆盖率
  Karma第一次启动时出现的问题
  1. Karma的介绍
  Karma是Testacular的新名字,在2012年google开源了Testacular,2013年Testacular改名为Karma。Karma是一个让人感到非常神秘的名字,表示佛教中的缘分,因果报应,比Cassandra这种名字更让人猜不透!
  Karma是一个基于Node.js的JavaScript测试执行过程管理工具(Test Runner)。该工具可用于测试所有主流Web浏览器,也可集成到CI(Continuous integration)工具,也可和其他代码编辑器一起使用。这个测试工具的一个强大特性就是,它可以监控(Watch)文件的变化,然后自行执行,通过console.log显示测试结果。
  Jasmine是单元测试框架,本单将介绍用Karma让Jasmine测试自动化完成。Jasmine的介绍,请参考文章:jasmine行为驱动,测试先行
  istanbul是一个单元测试代码覆盖率检查工具,可以很直观地告诉我们,单元测试对代码的控制程度。
  2. Karma的安装
  系统环境:
  win7 64bit, node v0.10.5, npm 1.2.19
  安装Karma
~ D:\workspace\javascript>mkdir karma
~ D:\workspace\javascript>cd karma
~ D:\workspace\javascript\karma>npm install -g karma
# 测试是否安装成功
~ D:\workspace\javascript\karma>karma start
INFO [karma]: Karma v0.10.2 server started at http://localhost:9876/
INFO [Chrome 28.0.1500 (Windows 7)]: Connected on socket nIlM1yUy6ELMp5ZTN9Ek
  从浏览器看到karam界面。
  karma1
  下面我们要开始配置karam。

3. Karma + Jasmine配置
  初始化karma配置文件karma.conf.js
~ D:\workspace\javascript\karma>karma init
Which testing framework do you want to use ?
Press tab to list possible options. Enter to move to the next question.
> jasmine
Do you want to use Require.js ?
This will add Require.js plugin.
Press tab to list possible options. Enter to move to the next question.
> no
Do you want to capture a browser automatically ?
Press tab to list possible options. Enter empty string to move to the next question.
> Chrome
>
What is the location of your source and test files ?
You can use glob patterns, eg. "js/*.js" or "test/**/*Spec.js".
Enter empty string to move to the next question.
>
Should any of the files included by the previous patterns be excluded ?
You can use glob patterns, eg. "**/*.swp".
Enter empty string to move to the next question.
>
Do you want Karma to watch all the files and run the tests on change ?
Press tab to list possible options.
> yes
Config file generated at "D:\workspace\javascript\karma\karma.conf.js".
  安装集成包karma-jasmine
  ~ D:\workspace\javascript\karma>npm install karma-jasmine
  4. 自动化单元测试
  3步准备工作:
  1. 创建源文件:用于实现某种业务逻辑的文件,就是我们平时写的js脚本
  2. 创建测试文件:符合jasmineAPI的测试js脚本
  3. 修改karma.conf.js配置文件
  1). 创建源文件:用于实现某种业务逻辑的文件,就是我们平时写的js脚本
  有一个需求,要实现单词倒写的功能。如:”ABCD” ==> “DCBA”
~ vi src.js
function reverse(name){
return name.split("").reverse().join("");
}
  2). 创建测试文件:符合jasmineAPI的测试js脚本
describe("A suite of basic functions", function() {
it("reverse word",function(){
expect("DCBA").toEqual(reverse("ABCD"));
});
});
  3). 修改karma.conf.js配置文件
  我们这里需要修改:files和exclude变量
module.exports = function (config) {
config.set({
basePath: '',
frameworks: ['jasmine'],
files: ['*.js'],
exclude: ['karma.conf.js'],
reporters: ['progress'],
port: 9876,
colors: true,
logLevel: config.LOG_INFO,
autoWatch: true,
browsers: ['Chrome'],
captureTimeout: 60000,
singleRun: false
});
};
  启动karma
  单元测试全自动执行
~ D:\workspace\javascript\karma>karma start karma.conf.js
INFO [karma]: Karma v0.10.2 server started at http://localhost:9876/
INFO [launcher]: Starting browser Chrome
WARN [launcher]: The path should not be quoted.
Normalized the path to C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
INFO [Chrome 28.0.1500 (Windows 7)]: Connected on socket bVGffDWpc1c7QNdYye_6
INFO [Chrome 28.0.1500 (Windows 7)]: Connected on socket DtTdVbd4ZsgnMQrgye_7
Chrome 28.0.1500 (Windows 7): Executed 1 of 1 SUCCESS (3.473 secs / 0.431 secs)
Chrome 28.0.1500 (Windows 7): Executed 1 of 1 SUCCESS (0.068 secs / 0.021 secs)
TOTAL: 2 SUCCESS
  浏览器会自动打开



  karma2
  我们修改test.js
~ vi test.js
describe("A suite of basic functions", function() {
it("reverse word",function(){
expect("DCBA").toEqual(reverse("ABCD"));
expect("Conan").toEqual(reverse("nano"));
});
});
  由于karma.conf.js配置文件中autoWatch: true, 所以test.js文件保存后,会自动执行单元测试。
  执行日志如下:提示我们单元测试出错了。
INFO [watcher]: Changed file "D:/workspace/javascript/karma/test.js".
Chrome 28.0.1500 (Windows 7) A suite of basic functions reverse word FAILED
Expected 'Conan' to equal 'onan'.
Error: Expected 'Conan' to equal 'onan'.
at null. (D:/workspace/javascript/karma/test.js:4:25)
Chrome 28.0.1500 (Windows 7): Executed 1 of 1 (1 FAILED) ERROR (0.3 secs / 0.006 secs)
  5. Karma和istanbul代码覆盖率
  增加代码覆盖率检查和报告,增加istanbul依赖
  ~ D:\workspace\javascript\karma>npm install karma-coverage
  修改karma.conf.js配置文件
~ vi karma.conf.js
reporters: ['progress','coverage'],
preprocessors : {'src.js': 'coverage'},
coverageReporter: {
type : 'html',
dir : 'coverage/'
}
  启动karma start,在工程目录下面找到index.html文件,coverage/chrome/index.html
  打开后,我们看到代码测试覆盖绿报告
  karma3
  覆盖率是100%,说明我们完整了测试了src.js的功能。
  接下来,我们修改src.js,增加一个if分支
function reverse(name){
if(name=='AAA') return "BBB";
return name.split("").reverse().join("");
}
  再看覆盖率报告,
  karma4
  Statements:75%覆盖,Branches:50%覆盖。
  为了产品的质量我们要尽量达到更多的覆盖率,一般对于JAVA项目来说,能达到80%就是相当高的标准了。对于Javascript的代码测试及覆盖率研究,我还要做更多的验证。
  6. Karma第一次启动时出现的问题
  CHROME_BIN的环境变量问题
~ D:\workspace\javascript\karma>karma start karma.conf.js
INFO [karma]: Karma v0.10.2 server started at http://localhost:9876/
INFO [launcher]: Starting browser Chrome
ERROR [launcher]: Cannot start Chrome
Can not find the binary C:\Users\Administrator\AppData\Local\Google\Chrome\Application\chrome.exe
Please set env variable CHROME_BIN
  设置方法:找到系统中chrome的安装位置,找到chrome.exe文件
  ~ D:\workspace\javascript\karma>set CHROME_BIN="C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"

posted @ 2014-02-18 11:17 顺其自然EVO 阅读(693) | 评论 (0)编辑 收藏

LINUX安装源码软件经典三部曲

  这几天一直在搞suse下的mplyaer、ffmpeg等源码编译安装,总结出源码软件安装三部曲,网上称为经典三部曲。
  这三步分别为:
  1. ./configure [options]
  2. make
  3. make install
  具体地说:
  1. 先下载源码。这里本人一直偏向于在官网上直接下载源码。因为个人觉得一切源码还是官网比较正规,谁知道其他地方下载的东西有没有被加入什么乱七八糟的东西;
  2. 源码一般以bz2或者是gz形式的包。包里一般有readme或者是install文档,这里面有关于本源码该如何编译安装,可以仔细看看。有时候包里没有这两个文档,但是会有一个doc目录,该目录下有针对不同OS平台的安装文档,一样可以细读;
  3. 将源码拷到linux上,解压;
  4. 第一步就是configure配置。配置项还是很多的,可以通过./configure --help查看有哪些配置项。很多源码的readme文档直接指出,一般使用./configure就可以看了。我个人喜欢将源码安装到指定的位置,使用./configure --prefix=我安装的目录。这样做的好处就是我知道将软件装在哪里了,将来还有他用;
  5. 第二步,使用make开始编译。这一步是根据上一步configure的结果来编译的;
  6. 第三步,使用make install开始安装,这一步结束后,软件就被安装到我指定的目录下;
  注意:有时候使用系统自带的make时,编译会报出一些错误,原因是系统自带的make版本太老了,可以装个新的,官网可以再百度上搜下。
  这里再补充几点:
  1. 上面make后,可以使用make clean将编译参数清空,接着重新make;
  2. 上面configure发现错误,可以使用make distclean,将configure参数全部清空,接着重新./configure-->make;

posted @ 2014-02-17 15:00 顺其自然EVO 阅读(1335) | 评论 (0)编辑 收藏

项目管理和缺陷跟踪工具 Redmine

Redmine 是一个开源的、基于Web的项目管理和缺陷跟踪工具。它用日历和甘特图辅助项目及进度可视化显示。同时它又支持多项目管理。Redmine是一个自由开放 源码软件解决方案,它提供集成的项目管理功能,问题跟踪,并为多个版本控制选项的支持。
  虽说像IBM Rational Team Concert的商业项目调查工具已经很强大了,但想坚持一个自由和开放源码的解决方案,可能会发现Redmine是一个有用的Scrum和敏捷的选择。 由于Redmine的设计受到Rrac的较大影响,所以它们的软件包有很多相似的特征。
  Redmine建立在Ruby on Rails的框架之上,支持跨平台和多种数据库。。
  特征
  支持多项目
  灵活的基于角色的访问控制
  灵活的问题跟踪系统
  甘特图和日历
  新闻、文档和文件管理
  feeds 和邮件通知
  依附于项目的wiki
  项目论坛
  简单实时跟踪功能
  自定义字段的问题,时间项,项目和用户
  SCM in集成 (SVN, CVS, Git, Mercurial, Bazaar and Darcs)
  多个LDAP认证支持
  用户自注册支持
  多语言支持
  多数据库支持

posted @ 2014-02-17 14:55 顺其自然EVO 阅读(2095) | 评论 (0)编辑 收藏

Selenium 2.0 WebDriver 使用指南

  SeleniumWebDriver
  注意:我们正致力于完善帮助指南的每一个章节,虽然这个章节仍然存在需要完善的地方,不过我们坚信当前你看到的帮助信息是精确无误的,后续我们会提供更多的指导信息来完善帮助文档。
  1.WebDriver介绍
  Selenium2.0最主要的新特性就是集成了WebDriverAPI。我们设计WebDriver的初衷是提供更加简单明了的接口来弥补Selenium-RCAPI的不足。在动态网页中,通常只会更新局部的html元素,WebDriver会很好的帮助用户快速定位这些元素。我们最终的目的是通过提供精心设计的面向对象API来解决现代高级网页中的测试难题。
  2.WebDriver如何驱动浏览器?与Selenium-RC有什么区别?
  不同类型的浏览器都会有原生的接口支持自动化操作,Selenium通过这些接口直接向浏览器发送指令。如何发送这些指令取决于你当前使用的浏览器类型,我们将在这一章节后面来详细介绍。
  看上去WebDriver与之前Selenium-RC的实现方式类似,实际上两者之间存在着本质的区别。对于所有类型的浏览器Selenium-RC都是使用的同一种方法:当浏览器启动时,向其中注入javascript,从而使用这些js来驱动浏览器中的AUT(ApplicationUnderTest)。WebDriver并没有使用这种技术,它是通过调用浏览器原生的自动化API直接驱动浏览器。
  3.WebDriver与SeleniumServer
  是否需要是用SeleniumServer取决于你使用WebDriver的方式。以下两种情况不需要使用SeleniumServer,WebDriver直接运行浏览器即可:1、testcases仅仅使用了Webdriver的API;2、浏览器和testcase在同一台PC上,而且testcases仅仅使用了Webdriver的API。
  以下三种情况你需要结合SeleniumServer来使用WebDriver:
  1)使用Selenium-Grid管理集群环境(或者虚拟机)上的testcase;
  2)需要调用非本机上的不同版本的浏览器;
  3)未使用任何languagebinding(java/c#/python/ruby),且有意向使用HtmlUnitDriver。
  4.配置Selenium-WebDriver工程
  安装Selenium是指在开发环境上配置一个工程,然后可以在这个工程中用Selenium编写程序。如何配置取决于你使用的开发语言和编程环境。
  使用Maven是配置一个Selenium2.0java工程最简单的方式。Maven会下载所有javabingdings以及所有相关的库(theSelenium2.0javaclientlibrary)。通过使用pom.xml(maven配置文件)来新建工程,你可以根据自己的喜好将Maven工程导入IntelliJIDEA或者Eclipse。
  首先,创建一个文件夹存放Maven工程文件。然后,创建pom.xml,你可以使用texteditor来编辑。鉴于已经有很多关于“如何在Maven工程中使用pom.xml”优秀的参考文献,这里将不再过多的讨论相关细节。下面给出一个示例,为你的工程也创建一个类似的文件。
<?xmlversion="1.0"encoding="UTF-8"?>
<projectxmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>MySel20Proj</groupId>
<artifactId>MySel20Proj</artifactId>
<version>1.0</version>
<dependencies>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>2.38.0</version>
</dependency>
<dependency>
<groupId>com.opera</groupId>
<artifactId>operadriver</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.opera</groupId>
<artifactId>operadriver</artifactId>
<version>1.5</version>
<exclusions>
<exclusion>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-remote-driver</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</dependencyManagement>
</project>
请确认你使用的WebDriver是最新的当前版本。在这篇文档撰写时,上述示例给出的是最新的版本。在Selenium2.0发布不久WebDriver就有过频繁的更新。请在这个链接MavenDownloadPage确认当前的版本,相应地修改你工程中的pon.xml。
  现在,你可以通过dos界面使用CD命令进入工程所在文件夹,通过以下命令运行Maven。
  mvncleaninstall
  运行之后会自动下载Selenium及相关套件,并加载到你的工程中去。
  最后,将你的工程导入到你偏好的IDE中。如果你对导入的过程不是很清楚,我们已经准备了操作指南。
  ImportingamavenprojectintoIntelliJIDEA.ImportingamavenprojectintoEclipse
  5.如何将自动化工程从Selenium1.0迁移到Selenium2.0
  已经在Selenium1.0上构建测试工程的用户,我们为您提供了一份指导如何将已有的代码迁移到Selenium2.0。Selenium2.0的首席开发工程师SimonStewart为此撰写了一片文章:MagratingFromSeleniumRCtoSeleniumWebDriver。
  6.Selenium-WebDriverAPI简介
  WebDriver可以用来实现Web应用程序的自动化测试,特别适合于验证实际结果是否符合预期结果的场景。WebDriver旨在提供比Selenium1.0更加易用、友好的API,便于用户的探索和理解,从而使测试用例变得容易阅读和维护。WebDriver没有使用任何第三方测试框架,所以它可以很好与单元测试工具或者最古老的main函数结合使用。本章节将介绍如何使用WebDriver的API,帮助你慢慢开始了解WebDriver。如果你还没有新建一个Selenium工程,请先完成这个操作,在这个章节的上面有详细的描述。
  当你创建完Selenium工程后,你会发现WebDriver和普通的第三方库一样是完全独立的,在你使用之前不需要启动任何额外的进程或者安装程序,相反如果你使用Selenium-RC需要先启动代理服务器。
  注意:当你使用如下WebDriver时需要额外的步骤:ChromeDriver,OperaDriver,AndroidDriver,IPhoneDriver。
  现在你肯定跃跃欲试要写一些代码了。我们以一个简单的例子来开始第一段旅程:在Google上搜索“Cheese”,并打印出搜索结果网页的标题。
packageorg.openqa.selenium.example;
importorg.openqa.selenium.By;
importorg.openqa.selenium.WebDriver;
importorg.openqa.selenium.WebElement;
importorg.openqa.selenium.firefox.FirefoxDriver;
importorg.openqa.selenium.support.ui.ExpectedCondition;
importorg.openqa.selenium.support.ui.WebDriverWait;
publicclassSelenium2Example{
publicstaticvoidmain(String[]args){
//创建一个FirefoxDriver实例
//这个类依赖于接口而不是接口的实现
WebDriverdriver=newFirefoxDriver();
//使用get方法访问Google
driver.get("http://www.google.com");
//使用下面这个方法也能够达到访问Google的目的
//driver.navigate().to("http://www.google.com");
//找到html输入框的name
WebElementelement=driver.findElement(By.name("q"));
//输入要查找的内容
element.sendKeys("Cheese!");
//提交表单,WebDriver会自动找到我们需要提交的元素所在的表单
element.submit();
//打印网页的标题
System.out.println("Pagetitleis:"+driver.getTitle());
//Google的搜索网页会通过JS动态渲染
//等待页面加载完毕,超时时间为10秒
(newWebDriverWait(driver,10)).until(newExpectedCondition<Boolean>(){
publicBooleanapply(WebDriverd){
returnd.getTitle().toLowerCase().startsWith("cheese!");
}
});
//控制台上将打印如下信息:"cheese!-GoogleSearch"
System.out.println("Pagetitleis:"+driver.getTitle());
//关闭浏览器
driver.quit();
}
}
  在本章节的接下来篇幅,我们将学习如何使用WebDriver操作你的浏览器,如何使用框架和窗口来测试Web网站。当然,我们将提供更加翔实的论述和举例。
  7.Selenium-WebDriverAPI详解
  7.1获取Web页面
  我们第一件要做的事是通过WebDriver取得Web页面的控制权,一般情况下使用get方法
  driver.get("http://www.google.com");
  在某些情况下,比如操作系统和浏览器的穿插组合,WebDriver有可能不会等待Web页面加载完成,这种情况下WebDriver会返回错误或者直接运行下一步操作。为了保证程序的健壮性,你需要等待页面中某个元素加载完成后再进行下一步操作,请参考ExplicitandImplicitWaits。
  7.2定位UI元素
  我们可以通过WebDriver实例或者WebElement类来定位UI元素。我们为每种编程语言都提供了两种方法:“FindElement”和“FindElements”。第一种方法返回的一个WebElement,找不到则抛出异常。第二个方法返回一个WebElement链表(List),在找不到任何DOM元素的情况下会返回空的链表。
  Find方法会使用类似探测器的类,类名叫做By。下面列举By的一些常用方法:
  ByID
  当我们定位一个UI元素,这个是最有效也是最好的方法。不过这个方法不是万能的,有的前端开发在设计UI元素时会遗漏ID或者使用动态ID,这两种情况下都要避免使用这个方法。这时候使用获取class名称方法比ByID更合适。
  示例:如何使用该方法定位元素
  <divid="coolestWidgetEvah">...</div>
  WebElementelement=driver.findElement(By.id("coolestWidgetEvah"));
ByClassName
  在这种场景下,我们引用DOM元素的属性。实际情况是很多元素都有一样的ClassName,因此找到多个有相同ClassName的元素,比找到第一个拥有这个ClassName的元素来的更重要。
  示例:如何使用该方法定位元素
  <divclass="cheese"><span>Cheddar</span></div><divclass="cheese"><span>Gouda</span></div>
  List<WebElement>cheeses=driver.findElements(By.className("cheese"));
  ByTagName
  DOM元素Tag的名称。
  示例:如何使用该方法定位元素
  <iframesrc="..."></iframe>
  WebElementframe=driver.findElement(By.tagName("iframe"));
  ByName
  找到与Name属性相同的Input元素。
  示例:如何使用该方法定位元素
  <inputname="cheese"type="text"/>
  WebElementcheese=driver.findElement(By.name("cheese"));
  ByLinkText
  找到与Text属性精确匹配的超链接。
  示例:如何使用该方法定位元素
  <ahref="http://www.google.com/search?q=cheese">cheese</a>
  WebElementcheese=driver.findElement(By.linkText("cheese"));
  ByPartialLinkText
  找到与Text属性模糊匹配的超链接。
  示例:如何使用该方法定位元素
  <ahref="http://www.google.com/search?q=cheese">searchforcheese</a>
  WebElementcheese=driver.findElement(By.partialLinkText("cheese"));
  ByCSS
  这个方法名称意味着它是一个CSS探测器。前提是浏览器默认支持这种方法,建议根据W3C的标准文档构建CSS选择器。如果浏览器不支持CSS选择器,可以使用Sizzle。IE6,7和FireFox3.0就是使用Sizzle作为CSS查询引擎。
  注意不是所有浏览器都使用同样的CSS选择器表达式,有些CSS可能只在某一个版本中生效。
  示例:如何使用该方法定位元素
  <divid="food"><spanclass="dairy">milk</span><spanclass="dairyaged">cheese</span></div>
  WebElementcheese=driver.findElement(By.cssSelector("#foodspan.dairy.aged"));
  ByXPath
  当有需要时,WebDriver还可以使用浏览器自带的XPATH。对于那些不支持XPATH的浏览器,我们提供了WebDriver特有的实现方式。请确保熟悉XPATH在不同的引擎中的区别,否则会导致一些不可预料的问题。
  Driver大小写敏感属性值是否可见是否支持XAPTH
  HtmlUnitDriver仅识别小写可见是
  IEDriver仅识别小写可见否
  FireFoxDiver大小写不敏感可见是上面的表格有一些抽象,让我们来看个例子
  <inputtype="text"name="example"/>
  <INPUTtype="text"name="other"/>
  List<WebElement>inputs=driver.findElements(By.xpath("//input"));
  匹配结果如下
  XPATH表达式HtmlUnitDriverFireFoxDriverIEDriver
  //input122
  //INPUT020有些标签的属性有默认值,这种情况下不指定属性值则匹配默认值。比如,"input"标签"type"属性默认为"text"。使用XPATH的首要原则就是不要忽略这些隐藏的实现。
  使用JavaScript
  只要返回的是一个WebElement,你还可以使用任意的JS代码查找Web元素,根据查询结果会自动修改为一个WebElement对象。
  一个简单的使用jQuery的例子:
  WebElementelement=(WebElement)((JavascriptExecutor)driver).executeScript("return$('.cheese')[0]");
  查找页面中每个label的所有Input元素:
List<WebElement>labels=driver.findElements(By.tagName("label"));
List<WebElement>inputs=(List<WebElement>)((JavascriptExecutor)driver).executeScript(
"varlabels=arguments[0],inputs=[];for(vari=0;i<labels.length;i++){"+
"inputs.push(document.getElementById(labels[i].getAttribute('for')));}returninputs;",labels);
  7.3模拟用户输入行为
  我们已经演示了在文本框输入文本内容,其他Web元素应该如何操作呢?你可以触发CheckBox的某个选项,也可以选择Select的某个选项。WebDriver处理Select元素也很简单。
WebElementselect=driver.findElement(By.tagName("select"));
List<WebElement>allOptions=select.findElements(By.tagName("option"));
for(WebElementoption:allOptions){
System.out.println(String.format("Valueis:%s",option.getAttribute("value")));
option.click();
}
  上面的例子,将选择Web页面中的第一个Select元素,并将循环打印出选项的取值并单击选项。或许你已经注意到,使用这个方法并不是最有效的。WebDriver提供一个“Select”类,这个类的方法更适合于处理上述这种场景。
Selectselect=newSelect(driver.findElement(By.tagName("select")));
select.deselectAll();
select.selectByVisibleText("Edam");
  上面的例子,首先去除选定第一个选项的焦点,然后选中取值为"Edam"的选项。
  一旦你完成了所有表单字段的输入,下一步就是提交表单。一种方法就是找到Web页面中的Submit按钮并单击:
  driver.findElement(By.id("submit")).click();
  作为另一种选择,WebDriver的Element类有一个更加便利的方法"sublmit"。如果你对表单中的某个Element使用该方法,WebDriver将会走读其所在的DOM对象,直到找到其所属的表单,并提交。如果该Element并不在某个表单中,将会抛出异常NoSuchElementException。
  element.submit();
  7.4在windows和frames间切换
  有些Web程序包含许多Frame和窗口,WebDriver提供"switchto"方法在这之间进行切换:
  driver.switchTo().window("windowName");
  所有传输给WebDriver的指定将被传输给切换后的窗口。如何直到窗口的名称呢?查看JS并打开该窗口就可以了:
  <ahref="somewhere.html"target="windowName">Clickheretoopenanewwindow</a>
  作为另一种选择,你可以使用一个“窗口句柄”传递给"switchTo().window()"方法。根据此方法,将会使用迭代器遍历所有打开的窗口:
  for(Stringhandle:driver.getWindowHandles()){
  driver.switchTo().window(handle);
  }
  你也可以在Frame之间切换(或者进入Frame):
  driver.switchTo().frame("frameName");
  你还可以根据路径使用Frame的子Frame,而且可以通过索引定位Frame。
  driver.switchTo().frame("frameName.0.child");
  以上方法将切换到名称为“frameName”的Frame的第一个子Frame,所有Frame都是Web页面的最顶端开始计数。
  7.5弹出框
  Selenium2.0beta1版本,我们提供方法获取弹出框。在你触发弹出框的操作后,你可以用一下方法进入弹出框:
  Alertalert=driver.switchTo().alert();
  以上方法将会返回当前当前打开的alert对象,你可以对这个对象进行任何可操作:点击取消,点击确定,关闭窗口,获取alert的文本内容等。这个接口在alerts、confirms、prompts对象上都有很好的应用,具体请参见API文档。
  7.6Navigation:浏览器本地历史记录
  前文中,我们使用get方法来获取网页(driver.get("http://www.example.com"))。正如你看到的,WebDriver有不少轻量级的功能聚焦的接口,Navigation就是这样一个。正因为加载网页是一个再普通不过的需求,这个方法存在于Driver类下面,但是用法很简单:
  driver.navigate().to("http://www.example.com");
  重申一下,"navigate().to()"和"get()"做的是同样的事情,只不过其中一个更适合打印。
  Navigate接口还提供方法可以在浏览器历史记录中前后翻页。
  driver.navigate().forward();
  driver.navigate().back();
  请注意,以上功能完全取决于底层的浏览器。如果你习惯跨浏览器操作,当你使用这些接口时可能会出现意想不到的的异常。
 7.7Cookies
  在我们开始下一步的讲解之前,你可能对WebDriver如何操作本地Cookies很感兴趣。首先,你必须处于当前Cookie的作用域。如果你在打开一个网页之前尝试预置Cookie,而且你的主页大到需要很长一段时间来加载,这时候你需要找一个小点的网页来替代,比如HTTP404网页(http://example.com/some404page)。
//打开Cookie作用的网站
driver.get("http://www.example.com");
//设置全局Cookie
Cookiecookie=newCookie("key","value");
driver.manage().addCookie(cookie);
//输出当前网页所有可用的Cookie
Set<Cookie>allCookies=driver.manage().getCookies();
for(CookieloadedCookie:allCookies){
System.out.println(String.format("%s->%s",loadedCookie.getName(),loadedCookie.getValue()));
}
//你又三种方法删除Cookie
//Byname
driver.manage().deleteCookieNamed("CookieName");
//ByCookie
driver.manage().deleteCookie(loadedCookie);
//Orallofthem
driver.manage().deleteAllCookies();
   7.8修改用户代理服务器
   对于FireFox来说很简单:
FirefoxProfileprofile=newFirefoxProfile();
profile.addAdditionalPreference("general.useragent.override","someUAstring");
WebDriverdriver=newFirefoxDriver(profile);
  7.9拖拽Web元素
  下面是一个拖拽Web页面元素的例子,前提是本地事件必须可用。
  WebElementelement=driver.findElement(By.name("source"));
  WebElementtarget=driver.findElement(By.name("target"));
  (newActions(driver)).dragAndDrop(element,target).perform();
  8各种Driver的特性以及如何选择合适Driver
  翻译中
  9向前兼容:融合WebDriver和Selenium-RC
  翻译中
  10为远程WebDriver单独启动SeleniumServer
  翻译中
  译者注:
  1、原文链接:http://www.seleniumhq.org/docs/03_webdriver.jsp。
  2、文中只包含了java相关的操作,WebDriver还支持c#/Python/Ruby/Perl/PHP/Perl,如有需要,请阅读原文。
  3、languagebinding,又叫gluecode,意思是胶水代码,比如有个C++的lib库,java调用这个库的api就叫javabinding。参考:http://en.wikipedia.org/wiki/Language_binding。
  4、措辞拙劣,有些单词句子没有深究就直译了,深感从阅读到翻译差的不仅仅是一本字典,还有文化的差异。笔者强烈推荐直接阅读官网上的原文,如果我的译文给你造成误解,深感不安。这也是最后三章不敢继续班门弄斧的原因,等我对Selenium熟悉了之后再回来补全。

posted @ 2014-02-17 14:45 顺其自然EVO 阅读(2180) | 评论 (0)编辑 收藏

SpecDD系列:敏捷应用生命周期管理(ALM)

 由于敏捷开发正成为越来越多开发团队的标准,敏捷应用生命周期管理持续呈现增长势头。一个已经被证明了的事实,那就是很多工具供应商发现把自己的产品标识成敏捷工具甚至是敏捷ALM工具,是很管用的。
  然而,何谓敏捷应用生命周期管理?应用生命周期管理结合了技术因素和功能因素,为常见的项目活动(如开发,配置,部署,发布,测试,质量,集成,和需求管理)提供一个综合方案。
  敏捷ALM用敏捷的价值观和策略,丰富了应用生命周期管理。敏捷方法下的ALM可以提高产品质量,缩短产品上市时间,并让开发者感到快乐。传统的ALM有助于为敏捷ALM提供一个架构,同时保证过程和工具链是灵活的,可更改的和高品质的。
  个体和交互胜过过程和工具
  首先,敏捷ALM是一个准则,是一种思想。从事敏捷应用生命周期管理应该从价值观和人,以及人们背后的观念开始。敏捷ALM工具是一个能够促进敏捷过程的ALM工具。
  敏捷ALM工具必须能够为项目增加价值并改善利益相关者之间的合作。这些是通过构建敏捷ALM的基石:协作和基于任务的开发,功能/技术发布,利益相关者关注点和质量保证来实现的。
  很多团队都很乐于把几个单独的好用的工具拼凑起来用。把许多轻量级的,可配置的工具整合为一个工具链。这种混搭的工具集合通常能够提供完成一个任务所需的大部分功能。很多时候,虽然工具之间存在隔阂,但这些隔阂可能不会存在于完全整合的解决方案中。
  理想的情况下,敏捷ALM工具应该有一个整合的,灵活的架构,可以让你扩展过程和功能。依托一个完全整合的工具,可以显著提高产品安全性和沟通效率,因为你可以很容易地维护各个交付件之间的关系,并且不用担心工具间传输时会遗漏细节。现在,我们来讨论一下构建敏捷ALM基石的其他重要部分。
  基于任务的开发
  基于任务的开发方法中,任务是团队工作和交互的基本单元。基于任务的开发需要能够跟踪具体变更的关联工作项,通过追溯性定位并完成这些工作。例如,你正在处理事件系统上的一个任务。你的SCM(比如SVN)与事件系统(比如DevTrack)是相集成的,从而透明化任务的工作进度和相互依赖关系。在DevTrack中,你可以看到Sprint中每个任务的计划,它们的状态,以及已完成的代码更改。此外,DevTrack作为完整DevSuite中的一个组件,你可以为DevTrack中的任务链接原始的用户需求及可用的测试用例
  功能性和技术性发布管理
  发布管理包括产生软件交付件,并按照既定流程发布这些交付件。发布管理可以区分为功能性的和技术性的。要想成功交付软件,这两部分都是非常重要的,并且应该相互融合。
  功能发布管理涉及到客户的需求,将这些需求分配到各个版本中,然后把功能提供给客户。经常使用敏捷实践来支撑这一过程,许多项目通过使用Scrum管理模板取得了良好的效果。通过定义一个简洁的框架,Scrum促进了规范化,并且让缺陷(软件中的以及过程中)可视化。但是,Scrum太抽象化了,有些“纸上谈兵”。你必须实施Scrum,并且使之适应软件工程。例如,实施实践可能在不同的开发阶段会存在差别,微观层面上,在一个Scrum发布内部:发布过程中,你可能会为了关闭开发阶段而考虑冻结某些新功能的开发实现,而允许开发人员只处理缺陷的修复工作。另一个有效的选择是使用一定时间间隔的代码冻结,来完成和交付最终版本。
  技术发布包括构建软件和提供最终产品给用户。构建管理(包括编译脚本,打包和分发组件)对于敏捷ALM来说是必不可少的。技术发布管理描述了以下活动:识别配置项,跟踪和审核基于需求和配置项的变更,集成和交付实施。在软件工程中,变更更像是规则,而不是例外。因为需求总是在变化的,保证需求和实施的同步是非常重要的。功能发布管理和技术发布管理之间可能存在的隔阂应该被桥接。一个完全整合的敏捷ALM工具可以通过自动创建相应的关系和链接来避免这些隔阂。
  总结
  敏捷应用生命周期管理涵盖软件工程中的许多学科。敏捷ALM关乎人和策略,以及用一个完全整合的工具套件来实施这些策略。敏捷ALM有助于为敏捷提供架构,并且通过一种果断,务实的方式来实现应用生命周期管理。使用敏捷方法来进行应用生命周期管理,你将收益更好的结果并更快的获得成功。

posted @ 2014-02-17 14:35 顺其自然EVO 阅读(343) | 评论 (0)编辑 收藏

分布式应用测试工作遐想

测试的过程中我们不光在提出问题,还需要定位和排查问题。我们碰到的很多场景在于问题定位的成本很高或技术难度很高,这个地方的工作是比较有挑战的,如果做的好,对测试工作有着很好的促进作用,也能加深对整个系统的理解。
  从大的方面看,这也是测试工作必不可少的一环,而且分布式领域一个为人诟病的缺点,就是测试和调试的成本高,综合看来对这个领域的持续积累和提炼需要提上日程。
  这里稍微发散一下,从此扩展出去,如果把整个dump中心的测试工作上升到一个体系的高度,我们需要综合测试本身的特点、分布式系统的特点和阿里系业务的特点考虑几个实际的因素:
  1. 如何有效的编写测试用例
  2. 如何有效的编写自动化脚本
  3. 如何有效的并且灵活的制定自动化回归的策略
  4. 如何有效的排查和分析测试过程中的问题
  5. 如何有效的管理测试集群
  6. 如何有效的管理测试的核心产出(测试数据、测试用例、缺陷),注:我并不认为计划、覆盖率等等是测试的核心产出,虽然是需要我们持续关注的。
  这个几个因素每个点都能形成一个面,一个体系。
  再回到一开始提出的问题,也就是以上列举的第4点,如何在这个面上有所积累和突破?我们团队规模不大,资源有限,不过有句话“麻雀虽小,五脏俱全”,简单思考之后,我们在目前人手的基础上,根据大家的知识背景进行一些分工:
  1. 集群层面(含hadoop,hbase,zookeeper,redis等)
  2. JVM层面
  3. 业务逻辑层面
  大家在平时积累时各有侧重,希望通过零零碎碎的积累,能走向质变的道路,最终由点到面,形成完善的体系。
  资源和时间有限,虽然各有侧重,也需要大家不断的分享,相互促进解决,每个人能专注一个方面有所产出,也能通观全局,相互协助。

posted @ 2014-02-17 14:34 顺其自然EVO 阅读(224) | 评论 (0)编辑 收藏

自动化测试之自动卸载软件

  在平常的测试工作中,经常要安装软件,卸载软件,  即繁琐又累。  安装和卸载完全可以做成自动化。 安装软件我们可以通过自动化框架,自动点击Next,来自动安装。  卸载软件我们可以通过msiexec命令行工具自动化卸载软件
  阅读目录
  用msiexec 命令来卸载软件
  注册表中查找ProductCode
  C#中自动卸载软件
  C#查找注册表中的ProductCode
  完整源代码下载
  用msiexec 命令来卸载软件
  平常我们手动卸载软件都是到控制面板中的”添加/删除”程序中去卸载软件, 或者通过程序自带的卸载软件来卸载。
  我们可以通过 MsiExec.exe /X{ProductCode} 命令来卸载程序。
  关于MsiExec.exe 请看 http://technet.microsoft.com/zh-cn/library/cc759262%28v=WS.10%29.aspx
  注册表中查找ProductCode
  ProductCode是Windows 安装程序包的全局唯一标识符 (GUID), 我们可以通过注册表来获取ProductCode
  实例:  用MsiExec.exe 自动卸载Xmarks.
  Xmarks 是一个用来同步收藏夹的工具, 我平常用来同步IE,firefox,chrome的收藏夹。
  先用注册表打开如下位置,
  32位操作系统: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\
  注意: 如果是64位操作系统:
  64位的程序还在: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\
  32位的程序而是在: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\
  Uninstall下面的注册表子键很多, 你需要耐心地一个一个去查找”DisplayName”, 从而找到程序的ProductCode, 如下图。
  从注册表中我们找到UninstallString这个键值:  MsiExec.exe /X{C56BBAC8-0DD2-4CE4-86E0-F2BDEABDD0CF}, 那么ProductCode就是{C56BBAC8-0DD2-4CE4-86E0-F2BDEABDD0CF}
  我们可以通过 MsiExec.exe /X{ProductCode} 命令来卸载程序.
  那么卸载的命令应该为 MsiExec.exe /X{C56BBAC8-0DD2-4CE4-86E0-F2BDEABDD0CF}
  然后在CMD中直接调用这个命令, 会弹出一个对话框,点击”是” 后, 软件就能被卸载了。
  在自动化测试中,我们不想弹出这个对话框,而是希望直接卸载。同时也不希望系统重启 只要加个两个参数 /quiet /norestart 就可以了
  现在的卸载的命令是: MsiExec.exe /X{C56BBAC8-0DD2-4CE4-86E0-F2BDEABDD0CF} /quiet

 C#中卸载程序
  C#的卸载代码比较简单, 当然你也可以用其他语言。
Process p = new Process();
p.StartInfo.FileName = "msiexec.exe";
p.StartInfo.Arguments = "/x {C56BBAC8-0DD2-4CE4-86E0-F2BDEABDD0CF} /quiet /norestart";
p.Start();
  C#查找注册表中的ProductCode
  最麻烦的在于,如何到注册表中获取ProductCode。 如果做非Web程序的自动化测试,经常需要跟注册表打交道。
  代码为:
public static string GetProductCode(string displayName)
{
string productCode = string.Empty;
// 如果是32位操作系统,(或者系统是64位,程序也是64位)
string bit32 = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
// 如果操作系统是64位并且程序是32位的
string bit64 = @"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall";
RegistryKey localMachine = Registry.LocalMachine;
RegistryKey Uninstall = localMachine.OpenSubKey(bit32, true);
foreach (string subkey in Uninstall.GetSubKeyNames())
{
RegistryKey productcode = Uninstall.OpenSubKey(subkey);
try
{
string displayname = productcode.GetValue("DisplayName").ToString();
if (displayname == displayName)
{
string uninstallString = productcode.GetValue("UninstallString").ToString();
string[] strs = uninstallString.Split(new char[2] { '{', '}' });
productCode = strs[1];
return productCode;
}
}
catch { }
}
return productCode;
}

posted @ 2014-02-17 14:32 顺其自然EVO 阅读(455) | 评论 (0)编辑 收藏

测试计划和自动化测试思考

这几天对XXX的测试计划自动化测试进行思考。
  先说测试计划,测试计划需要依据迭代开发计划制定,需要有明确的测试范围和测试目标。
  看了下Q1的迭代开发计划主要有XXX功能改进、BUI改进、系统安全性改进、全页面子资源监测、api组件改进。这些改进都是持续性的,没有明确的改进需求和改进结果要求。因此进入测试之前无法了解需求和进行用例设计或维护。可以预想最终结果可能会跟以前一样,开发完成交给测试执行测试,改进后发布。如果是这样测试人员没有办法做到主动测试,只能在开发完毕提给测试后被动接受进行测试。制定测试计划也就没有多大意义了,也不知道从何计划。
  为了改进这个过程,我建议如下:
  1.明确和细化Q1的功能改进需求,并列点说明。
  2.开发人员根据明确的改进需求逐步改进。这期间测试人员针对需求进行用例设计和维护。
  3.迭代开发完毕,满足测试准入条件,提交测试。
  4.测试人员执行用例、验证缺陷、手工测试,完成测试。
  5.建议项目迭代周期安排一个时间段专门进行测试和修复缺陷。
  6.建议对XXX已提交的缺陷进行筛选并安排进行修复。
  自动化测试
  无论是qtp还是selenium脚本,当产品进行bui改进和功能改进后,脚本基本都需要进行维护和变更,而且这个维护工作量还蛮大的。对比新旧版本的创建站点监控,变化比较大,并且新版的功能界面也还不够完善。
  我觉得这阶段开展自动化测试不是太合适,主要是1.之后可能很多页面都要重构,后续维护脚本的工作量巨大。2.功能还不够完善,用手工测试效率更高,不适合自动化回归测试。3.开发出来的自动化脚本复用性不高。
  因此规划这一阶段自动化的主要工作:
  1.完善XXX测试用例。
  2.挑选出适合开展自动化测试的用例。主要目标用例为系统主要流程功能、相对稳定的功能模块用例。
  3.根据项目测试的需求进行自动化测试技术预研(QTP、selenium或其它合适的自动化测试工具)

posted @ 2014-02-17 14:22 顺其自然EVO 阅读(352) | 评论 (0)编辑 收藏

仅列出标题
共394页: First 上一页 148 149 150 151 152 153 154 155 156 下一页 Last 
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

导航

统计

常用链接

留言簿(55)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜