- 浏览: 458233 次
- 性别:
- 来自: 北京
博客专栏
-
张小庆,在路上
浏览量:8835
文章分类
最新评论
-
bad_brain:
很好的文章,帮助我快速了解zookeeper提供的能力以及为什 ...
Zookeeper与paxos算法 -
ixu:
支持,已经买了 是对工作流和BPM的很好总结啊
无知者无畏,一本写了四年的书 -
yangsong158:
看来,我与这个时代有些脱节了。必需加快赶上来。谢谢你的奉献。必 ...
无知者无畏,一本写了四年的书 -
黄粱一梦11:
目标 人没有目标就很容易迷失自己,常常陷入困惑中
PM成长日记第二话-一定要想清楚自己要什么 -
fenian_zhq:
支持。就凭你这个感悟,必须买一本收藏!
无知者无畏,一本写了四年的书
我们从一个最简单的登录例子开始。
最开始我们需要验证在用户名和密码都正确的情况下,能够正常登录系统,我们这样编写测试代码(以下都是伪代码,使用TestNG和Selenium):
@Test def should_login_success_with_exist_username_and_correct_password(){ LoginPage page = user.open(LoginPage,"/login.html") user.perform("login",['user1','1234'],on(page)) assert page.successLogin }
恩,很不错,运行一下,出现红条。为什么呢?原来测试数据库里没有用户名为user1的用户,好吧,写个数据库数据初始化脚本。再运行,OK,绿条!
那么,接下来我们再增加一个测试,需要覆盖密码错误时不能登录系统的情况,很快测试就完成了:
@Test def should_login_success_with_exist_username_and_incorrect_password(){ LoginPage page = user.open(LoginPage,"/login.html") user.perform("login",['user1','4321'],on(page)) assert page.successLogin,false }
再运行一下测试,绿条。好啦,现在可以看下这段代码,恩,有些重复,重构一下:
@Test def should_login_success_with_exist_username_and_correct_password(){ assert login('user1','1234') } @Test def should_login_success_with_exist_username_and_incorrect_password(){ assert login('user1','4321'),false } def login(username,password){ LoginPage page = user.open(LoginPage,"/login.html") user.perform("login",[username,password],on(page)) return page.successLogin }
重构完成,可以看到,我们的测试方法里现在没有了任何行为,仅仅是数据!这样让我感觉有点怪,不管了,先用TestNG提供的@dataProvider整理一下:
@Test(dataProvider="testdata") def testLogin(username,password,expected){ LoginPage page = user.open(LoginPage,"/login.html") user.perform("login",[username,password],on(page)) assert page.successLogin,expected } @DataProvider(name="testdata") def Object[][] dataForLogin(){ def data=new Object[2][] data[0]=['user1','1234',true] as Object[] data[1]=['user1','4321',false] as Object[] }
测试方法只剩下了一个!如果要测试不存在的用户不能登录系统呢?很简单,增加数据即可!
@DataProvider(name="testdata") def Object[][] dataForLogin(){ def data=new Object[2][] data[0]=['user1','1234',true] as Object[] data[1]=['user1','4321',false] as Object[] data[1]=['inexistuser','1234',false] as Object[] }
在我们的测试方法里,测试数据和测试的行为进行了完全的分离。从系统的功能来说,功能一旦实现,那么就是一个黑盒,我们只要提供数据即可进行测试,这个数据包括两部分:输入和期待的输出。我开始暗自嘀咕:难道我以前那么多的洋洋得意测试方法很多都是不需要的吗?这些方式为什么会存在呢?恩,想起来了,这些方法是为了覆盖功能的各个路径的,是提高测试覆盖率的。那么为什么会产生这么多的测试方法呢?哦,在这些测试方法里,测试数据和测试行为是耦合在一起的!
我伸了个懒腰,突然想,这下好了,我已经封装好了功能行为,QA想增加测试用例只需要自己增加数据就可以了,嘿嘿,爽啊。说曹操,QA到。QA mm说,你的某个功能实现有问题。我瞅了一眼,说,不可能啊(这是dev面对bug的第一反应),俺有测试的,持续集成一直是绿条的。QA mm说,在你的开发环境下测试是没有问题的,但是在QA环境,因为数据库变了,数据变了,应用服务器变了,所以会有些问题。我极不情愿的登录到QA环境,一测试,还真是,郁闷。
怎么办?修复完BUG,第一反应就是自动化测试能不能跑在QA环境呢?一般情况下,这些测试需要干净的测试环境,我们会制造很多的测试数据,可是在QA环境下,QA有她自己的测试数据,这些数据都不存在了哈。恩,看看刚才的测试代码,哈,就用QA的数据也可以啊,心情愉悦的改下:
@DataProvider(name="testdata") def Object[][] dataForLogin(){ def data=new Object[2][] data[0]=['hrong','1234',true] as Object[] data[1]=['hrong','4321',false] as Object[] data[1]=['rhao','1234',false] as Object[] }
OK,完成!为了该测试既能在开发测试环境运行又能在QA环境下运行,我们可以引入一个环境变量,将测试数据扔到文件里,通过环境变量来加载不同的测试数据(测试文件)。
好吧,喝点东西(甲流很厉害,喝板蓝根好了),总结一下:
数据驱动测试:测试数据与测试行为分离,通过数据来驱动测试。
好处:在对测试行为封装好的情况下,QA mm能够自己通过数据修改自动化测试;
自动化测试能够运行在多个环境下(开发环境、QA环境、产品环境);
测试的可读性;
测试方法大量压缩
适用范围:功能测试(selenium测试)
通过环境准备测试数据(非测试用例自己准备数据)
可能存在的问题:比一般的测试编写困难,特别是在静态语言里
最后:该文章的思考来自于徐昊在团队内部的相应Session.
评论
我先说说我怎么测试的吧!
我将一个登陆页面的所有情况使用XML文件进行编写。然后使用dom4j进行解析XML。将XML的中的每个数据通过Selenium进行测试。基本上可以将登陆的所有想到的情况都测试。但是我就是不知道怎么将这些一个单独的功能测试进行整合成一个业务流的方式进行有序的测试。!
给出我的一些代码
以下这个是一个登陆数据及其验证结果
<loginPage> <user sid="001"> <login>admin</login> <password>123</password> <validateCode>1</validateCode> <result>true</result> <ResultSuccessMessage>Successfully</ResultSuccessMessage> <ResultFailMessage>Fail</ResultFailMessage> </user> <user sid="002"> <login>abc</login> <password>123</password> <validateCode>1</validateCode> <result>false</result> <ResultSuccessMessage>Successfully</ResultSuccessMessage> <ResultFailMessage>Fail</ResultFailMessage> </user> <user sid="003"> <login>dd</login> <password>123456</password> <validateCode>1</validateCode> <result>false</result> <ResultSuccessMessage>Successfully</ResultSuccessMessage> <ResultFailMessage>Fail</ResultFailMessage> </user> <user sid="004"> <login>def</login> <password>123456</password> <validateCode>1</validateCode> <result>false</result> <ResultSuccessMessage>Successfully</ResultSuccessMessage> <ResultFailMessage>Fail</ResultFailMessage> </user> <user sid="005"> <login>jian</login> <password>1236</password> <validateCode>1</validateCode> <result>false</result> <ResultSuccessMessage>Successfully</ResultSuccessMessage> <ResultFailMessage>Fail</ResultFailMessage> </user> <user sid="006"> <login>dddddc</login> <password>1234536</password> <validateCode>1233a</validateCode> <result>false</result> <ResultSuccessMessage>Successfully</ResultSuccessMessage> <ResultFailMessage>Fail</ResultFailMessage> </user> ........ </loginPage>
类似的将这样列出想到的所有情况!
在使用dom4j进行解析出来。调用Selenium进行页面填充。
ps:我觉得适用范围可以是功能测试(如selenium测试)和集成测试(如JUnit写出的集成测试)
更进一步的我想象的可能场景是,前者由QA mm来维护测试数据文件,后者由开发人员来维护测试数据文件。
我的看法和你一致,使用范围应该是功能测试和集成测试,不包括单元测试。
恩 表示同意 。单元测试都是开发人员测
data[0]=['hrong','1234',true] as Object[] data[1]=['hrong','4321',false] as Object[] data[1]=['rhao','1234',false] as Object[]
有点担心的是,如果输入和输出比较复杂时,QA mm能看懂吗?
之前一个项目有一个比较大JUnit集成测试,也是类似以上的写法,
维护时发觉比较痛苦(主要是data[][]不够直观,修改输入输出时比较麻烦)
客户提出改进意见(他们也会跑这个JUnit),希望能用excel来描述输入输出,这样他自己就能追加case了
修改后发现果然更好用了
代价是:读excel比读data[][]烦
ps:我觉得适用范围可以是功能测试(如selenium测试)和集成测试(如JUnit写出的集成测试)
更进一步的我想象的可能场景是,前者由QA mm来维护测试数据文件,后者由开发人员来维护测试数据文件。
我的看法和你一致,使用范围应该是功能测试和集成测试,不包括单元测试。
首先声明一下,本人的数据驱动测试经验并不多,但是个人认为所有的测试数据都需要由环境准备。
我的数据驱动测试经验也很少。虽然还不清楚你说的测试数据由环境准备什么意思,但我想知道是否遇到过这样的问题:
如果每个dev准备自己的测试环境,创建db纪录,会不会在集成的时候造成db的冲突,比如这个简单和极端的情况,你用于fail的用户名/密码,却被另一个dev当作能成功登陆的用户对待。如果发现类似的问题,应该怎么解决?
是这样,环境准备的意思是在测试开始之前所有测试数据已经准备完毕,测试代码里不准备数据。环境准备可以是一段在测试开始前的脚本也可以是一个程序,它的目的是清理测试环境并准备数据。
既然是环境准备数据,那么显然这些脚本和程序也是要放入版本管理中的,这样就避免冲突。
ps:我觉得适用范围可以是功能测试(如selenium测试)和集成测试(如JUnit写出的集成测试)
更进一步的我想象的可能场景是,前者由QA mm来维护测试数据文件,后者由开发人员来维护测试数据文件。
集成测试下倒没有研究过,主要涉及到测试环境是否存在多人共用情况,如果不存在此种情,倒是可以在集成测试脚本启动前加载进行测试数据环境加载。
首先声明一下,本人的数据驱动测试经验并不多,但是个人认为所有的测试数据都需要由环境准备。
我的数据驱动测试经验也很少。虽然还不清楚你说的测试数据由环境准备什么意思,但我想知道是否遇到过这样的问题:
如果每个dev准备自己的测试环境,创建db纪录,会不会在集成的时候造成db的冲突,比如这个简单和极端的情况,你用于fail的用户名/密码,却被另一个dev当作能成功登陆的用户对待。如果发现类似的问题,应该怎么解决?
首先声明一下,本人的数据驱动测试经验并不多,但是个人认为所有的测试数据都需要由环境准备。
发表评论
-
Zookeeper与paxos算法
2012-03-22 20:36 16827一、 zookeeper是什么 ... -
关于异常的问与答
2010-09-16 22:34 1148今天的问题是关于异常 ... -
一家公司发展的胡言乱语
2010-01-16 23:06 2907终于一天早上,睁开极 ... -
《Head First Process-深入浅出流程》连载预告
2009-10-17 22:58 6210似乎一到年末,就会忙 ... -
也说炮轰
2009-10-05 13:13 1959社区里目前最火的无疑 ... -
使用selenium测试showModalDialog模态对话框
2009-07-27 21:10 7068Selenium目前没有提供对IE模态对话框(即通过showM ... -
(Multi-stage Continuous Integration)多阶段持续集成
2009-05-26 23:08 1252一、目前的情况 目前我 ... -
JbpmSide 流程设计器进度
2009-03-26 22:15 4452汇报一下设计器当前进度以及下一阶段主要的开发目标。 当前进度主 ... -
jBPM-side流程设计器功能规划
2009-03-08 21:57 2258目标: jBPM-side ProcessDesigne ... -
Flex框架Riawave应用以及对AJAX开发框架的思考
2009-03-01 22:05 1216Jbpmside要使用Flex开发流 ... -
你服务,你全家才服务
2009-02-19 14:18 1686在拥挤的公交车上读完《工作流管理(模型、方法和系统)》,自从搬 ... -
工作流技术基础读后
2009-02-09 18:03 1693大概花了三天的时间读完这本书,书本身也 ... -
BPM向左,工作流向右(二)工作流系统杂谈
2008-11-07 11:28 2335当 面对一个完整的工作流系统时,你可能会被它众多的功能所困惑: ... -
基于memcached的SNA实现
2008-10-28 17:34 3733系统要集群,使用SNA方案。一、 缓存的处理缓存要使用统一的缓 ... -
SNA方案之session炒冷饭
2008-09-04 14:49 2091SNA方案中,session的处理是一个重要方面。原帖见这里: ... -
一次性能调优的实战
2008-09-01 12:56 1926项目情况:是一个大型 ... -
BPM向左,工作流向右(一)什么是业务流程
2008-08-26 17:43 2421从事工作流以及相关开 ... -
js组件的测试,是个问题
2008-08-11 19:06 1108用js编写自己的组件,测试一直是个头疼的问题。最开始大量使用a ... -
工作流之收回
2008-07-15 18:31 1599收回 收回是工作 ... -
从贫血到充血Domain Model
2008-07-03 12:01 1740关于Domain Model的讨论已经非常多了,炒炒冷饭,这里 ...
相关推荐
介绍如何进行数据驱动测试 测试脚本的开发和维护是自动化测试的重要环节,适当地调整和增强测试脚本,能提高测试脚本的灵活性,增加测试覆盖面,以及提高应对测试对象变更的能力。数据驱动方式的测试脚本开发是解决...
### 高级数据驱动测试(ADDT):深入解析与应用 #### 一、引言 随着软件开发的复杂度不断提高,确保软件质量成为了一项挑战。自动化测试作为一种有效手段,能够显著提升测试效率和软件质量。其中,高级数据驱动...
数据驱动测试是一种软件测试方法,它使用外部数据源来控制测试用例的执行,而不是硬编码在测试脚本中。WebDriver 是一个广泛使用的自动化测试工具,它可以与多种浏览器进行交互,实现网页应用的自动化测试。当结合...
数据驱动测试报告1 在软件测试领域,数据驱动测试是一种重要的方法,它依赖于特定的数据输入来执行测试并评估程序的输出。此报告由蔡挺和周泽龙完成,他们在软件测试技术课程中进行了相关实验,主要关注的是利用...
数据驱动测试(Data-Driven Testing)是一种测试方法,它将测试用例的数据和测试逻辑分开。在Sazerac中,你可以定义一组输入数据和期望的输出结果,框架会自动遍历这些数据并运行相应的测试。这种方法的好处在于可以...
3. **数据驱动测试**:数据驱动测试是一种测试方法,其中测试逻辑与测试数据分离。在本项目中,可能使用了TestNG的数据提供者功能,将测试数据(如用户名、密码等)作为参数传递给测试方法,从而实现对不同数据组合...
本项目基于"Maven+Selenium+TestNG+TestNG-xslt"搭建了一个高效的数据驱动测试框架,以下将详细解释这个框架的核心组件及其实现方式。 首先,Maven是一个项目管理和综合工具,它帮助开发者管理依赖、构建项目、执行...
Postman:数据驱动测试教程.docx
提出采用面向自动化测试的测试用例设计格式,通过QTP的编程功能,使用外部数据源来实现较复杂的数据驱动测试。具体方法是采用Excel作为测试数据源,制定Excel中测试数据的设计格式,建立专用的函数库来操作Excel数据...
数据驱动测试则是将测试数据从测试脚本中分离出来,存储在外部文件(如Excel表格)中。这种做法允许测试人员更方便地管理、修改和扩展测试数据,而不需要修改测试代码。在本项目中,测试用例的数据存储在Excel文件中...
2. **关键字驱动测试**:相较于数据驱动测试,关键字驱动测试进一步抽象了测试步骤,通过定义一系列关键字(如“登录”、“提交”等)来表示特定的操作。测试人员只需要编写包含这些关键字的简单脚本来描述测试场景...
机械手数据驱动器DataDriver是用于Robot Framework的数据驱动测试库。 本文档说明了如何使用DataDriver库侦听器。 有关安装,支持等的信息,请访问有关机器人框架的更多信息,请参见 。 DataDriver用作/导入为库,但...
test-nginx, 面向 Nginx C 模块和 OpenResty Lua库开发的数据驱动测试 电子邮件名称Test::Nginx - Nginx MODULE 和 Nginx/openresty库和应用程序的数据驱动测试脚手架 table-内容NAME描述用户指南使用 Test::Nginx ...
在自动化测试领域,QuickTest Professional(QTP,现在被称为UFT - Unified Functional Testing)是一款功能强大的工具,尤其在数据驱动测试方面表现出色。本篇文章将深入探讨QTP如何利用Excel、Access和Text文件...
内容概要:本文详细介绍了如何使用Postman这款强大的API开发工具来进行数据驱动测试,从准备阶段讲起,涵盖了环境变量的应用、使用集合与迭代器、预处理器与后处理器的实际运用、设置与实施数据驱动测试用例以及高级...
数据驱动测试是一种测试方法,它将测试数据与测试逻辑分离,允许测试用例根据不同的输入数据执行。在Python中,Selenium通常用于自动化Web应用程序的测试,而数据驱动测试可以帮助提高测试覆盖率和效率。本文将深入...
数据驱动测试将测试脚本和数据分离,让通用脚本可以驱动多个测试用例。SilkTest通过录制操作,将GUI对象转化为4Test对象,利用变量替换实际值,实现数据驱动。例如,在IDE工具测试中,通过录制一个典型流程,然后...