qileilove

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

Badboy工具应用技巧

  Badboy:基于Web自动化测试工具,通过协议包进行交换,响应速度快,安装文件较小简单,安装环境不限制,很容易上手且无需编写复杂的代码,功能强大https的加密请求也可以进行模拟录制
  案例:在web架构的平台上添加大量的用户
  思路:利用badboy先录制添加一个用户的步骤,再整理脚本提高效率,接着参数化脚本,设置excel传值,最后执行play
  步骤:
  1.打开badboy,新建一个脚本,默认添加一个录制步骤,点击暂停录制,在地址栏输入要录制的平台WebIP地址,如https://172.10.39.130,点击右侧的转入或按键盘回车键展示平台登录页面,登录系统切换到用户管理模块,打开添加用户对话框,点击开始录制按钮,输入用户相关信息点击save保存(即用户添加完成),此时点击暂停录制。可以看到badboy的左侧script栏step下多了一条https请求,下方的Summary栏展示录制过程的响应时间
  2.参数化设备信息。在tools中选中Data Source,右键菜单选择properties;在弹出框中选择excel类型,选择excel路径(事先可以先创建好excel文档,首行写列名,接下来填数据,也可以添加一列seq作为序列),保存后右键菜单选择Add to script
  3.选择要参数化的变量,本案例中由于用户名是唯一的需要对用户名参数化,再step的脚本中找到userInfo.name=test,我们对test进行参数化赋值给变量如${name}
  4.循环,选中step右键菜单选择properties,选择循环按照参数表,即完成循环添加用户的脚本(如果选择下拉框为空,先执行下datasource脚本)
  5.执行,web页面停留在添加用户对话框,右键step选择play whole test,即完成添加用户的操作
  PS:在录制过程中为什么要从添加用户开始呢?
  刚开始测试时遇到几个问题1)用badboy回放登录平台无法实现2)登录后badboy无法定位到用户管理模块
  根据我们的最终目的我们可以直接避开这两点直接从添加用户开始,这样做的好处还有一个减少冗余请求执行更快
  特点:本案例添加用户成功后【add user】对话框不关闭

posted @ 2014-04-21 12:51 顺其自然EVO 阅读(3210) | 评论 (0)编辑 收藏

Python单元测试框架使用unittestpyUnit

 使用Pyunit框架的简单测试
'''''
Created on 2014-4-15
@author: Administrator
'''
import unittest,my_math
class Test(unittest.TestCase):
def testIntegers(self):
for x in xrange(-10,10):
for y in xrange(-10,10):
p = my_math.product(x,y)
self.failUnless(p == x*y,'Integer multiplication faild')
def testFloat(self):
for x in  xrange(-10,10):
for y in xrange(-10,10):
x = x/10.0
y = y/10.0
p = my_math.product(x,y)
self.failUnless(p == x*y,'Float multiplication faild')
if __name__ == "__main__":
#import sys;sys.argv = ['', 'Test.testName']
unittest.main()
my_math.py
'''''
Created on 2014-4-15
@author: Administrator
'''
def square(x):
'''''
Squares a number and return the result.
>>>square(2)
4
>>>square(3)
9
'''
return x*x
def product(x,y):
if x == 7 and y ==9:
return 'bug'
else:
return x * y
#return x*y
'''''
if __name__ == '__main__':
import doctest, my_math
doctest.testmod(my_math)
'''
  unittest.main函数负责运行测试。它会实例化所有TestCase的子类,运行所有名字以test开头的方法。
  如果定义了叫做setUp和tearDown的方法,他们就会运行在每个测试方法之前和之后执行。

posted @ 2014-04-21 12:50 顺其自然EVO 阅读(319) | 评论 (0)编辑 收藏

手机APP测试技术

 做手机APP测试也有2年多了,在这方面也有不少感慨,看了很多分享者,觉得大伙都是好样的,读后有感,把自己近年来的手机APP方面的测试经验也写下来,希望能对同行多少有点帮助,不足之处,还请留言,一起讨论:
  一  手机APP测试基本思路:
  测试计划--测试方案--测试用例--执行:
  很多小公司都没有具体的需求,项目时间也比较紧,而且流程也不是很严谨,在这样的情况之下,作为测试的我们,该怎样去对项目进行用例的设计?个人觉得,项目到手,不是马上就进入测试工作,而是,先熟悉下整个项目的流程,把大致的框架过一遍,不懂的地方记录下来,再问开发,把流程都掌握了,再对照已有的文档给予项目立项(测试计划、测试方案),用例不必写的太过于详细(app模块变动较大,过于详细维护成本太高,而且项目经理给你的时间短,会浪费项目执行时间),把每个功能模块罗列出来,大致的功能点,用什么方法去测试,都给标注,然后再根据测试需求执行测试(目前我用例都只是罗列大概的执行方法,不具体详写,改起来方便);
  二  手机APP测试测试要点:
  功能测试(流程测试、功能点测试)、兼容性测试、交叉测试、安装卸载测试(包括应用的升级)、压力测试(接口压力测试);
  功能测试:对具体功能点一一测试,确保每个点都能正确实现相应功能;
  兼容性测试:对市场上主流的设备安装应用执行测试,确保都能正常运行;
  交叉测试:对于正在运行的应用,若进入短信、电话等其他软件响应的情况,不会影响所测试应用,且会保证应用都能正确运行;
  安装卸载测试:确保应用都能正确安装、卸载,且能正确运行(注意应用的升级测试:升级前后的状态);
  压力测试:用户量大,交互性高的应用需对接口执行压力测试,确保不会应用在大用户量的情况下能正常运行。
  三  注意事项:
  闪退(内存不足等情况),在手机上,该类问题出现的几率很大,应着重测试,比如,返回访问某个模块(数据时时获取的模块),切换应用,重复提交、来电交互等都是闪退几率大的原因。
  以上就是本人所列点,写的不好的地方,请多包容,第一次写这个。大家一起学习,一起进步。

posted @ 2014-04-21 12:48 顺其自然EVO 阅读(2899) | 评论 (0)编辑 收藏

数据库设计三大范式

 数据库设计范式
  什么是范式:简言之就是,数据库设计对数据的存储性能,还有开发人员对数据的操作都有莫大的关系。所以建立科学的,规范的的数据库是需要满足一些
  规范的来优化数据数据存储方式。在关系型数据库中这些规范就可以称为范式。
  什么是三大范式:
  第一范式:当关系模式R的所有属性都不能在分解为更基本的数据单位时,称R是满足第一范式的,简记为1NF。满足第一范式是关系模式规范化的最低要
  求,否则,将有很多基本操作在这样的关系模式中实现不了。
  第二范式:如果关系模式R满足第一范式,并且R得所有非主属性都完全依赖于R的每一个候选关键属性,称R满足第二范式,简记为2NF。
  第三范式:设R是一个满足第一范式条件的关系模式,X是R的任意属性集,如果X非传递依赖于R的任意一个候选关键字,称R满足第三范式,简记为3NF.
  注:关系实质上是一张二维表,其中每一行是一个元组,每一列是一个属性
  理解三大范式
  第一范式
  1、每一列属性都是不可再分的属性值,确保每一列的原子性
  2、两列的属性相近或相似或一样,尽量合并属性一样的列,确保不产生冗余数据。
  如果需求知道那个省那个市并按其分类,那么显然第一个表格是不容易满足需求的,也符合第一范式。
  显然第一个表结构不但不能满足足够多物品的要求,还会在物品少时产生冗余。也是不符合第一范式的。
第二范式
  每一行的数据只能与其中一列相关,即一行数据只做一件事。只要数据列中出现数据重复,就要把表拆分开来。
  一个人同时订几个房间,就会出来一个订单号多条数据,这样子联系人都是重复的,就会造成数据冗余。我们应该把他拆开来。
  这样便实现啦一条数据做一件事,不掺杂复杂的关系逻辑。同时对表数据的更新维护也更易操作。
  第三范式
  数据不能存在传递关系,即没个属性都跟主键有直接关系而不是间接关系。像:a-->b-->c  属性之间含有这样的关系,是不符合第三范式的。
  比如Student表(学号,姓名,年龄,性别,所在院校,院校地址,院校电话)
  这样一个表结构,就存在上述关系。 学号--> 所在院校 --> (院校地址,院校电话)
  这样的表结构,我们应该拆开来,如下。
  (学号,姓名,年龄,性别,所在院校)--(所在院校,院校地址,院校电话)
  最后:
  三大范式只是一般设计数据库的基本理念,可以建立冗余较小、结构合理的数据库。如果有特殊情况,当然要特殊对待,数据库设计最重要的是看需求跟性能,需求>性能>表结构。所以不能一味的去追求范式建立数据库。

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

使用ant来调用Jmeter,并定制运行时参数

为了应对不同的运行需求(主要是不同的线程数),以及可能的变化(host ip),在nongui运行时我对ant build.xml进行了一些修改
  1. log目录备份与运行前清除
<tstamp>
<format property="time.stamp" pattern="HHmmss_yyyyMMdd"/>
</tstamp>
<property name="bak.dir" value="c:/apache-jmeter-2.10/bin/testresult/${time.stamp}" />
<property name="result.dir" value="c:/apache-jmeter-2.10/bin/testresult" />
<property name="jmeter.extra" value="c:/apache-jmeter-2.10/extras" />
<target name="clean" depends="">
<delete verbose="true">
<fileset dir="${result.dir}">
<include name="*.csv" />
<include name="*.jtl" />
</fileset>
<fileset dir="${jmeter.extra}">
<include name="*.jtl" />
<include name="*.log" />
</fileset>
</delete>
</target>
<target name="bak">
<copy todir="${bak.dir}" verbose="true">
<fileset dir="${result.dir}">
<include name="*.csv" />
<include name="*.jtl" />
</fileset>
<fileset dir="${jmeter.extra}">
<include name="*.jtl" />
<include name="*.log" />
</fileset>
</copy>
</target>

posted @ 2014-04-18 13:51 顺其自然EVO 阅读(375) | 评论 (0)编辑 收藏

Java中IO流知识点总结

 一、流的分类
  1、按功能分
  读取流:InputStream Reader
  写出流:OutPutStream Writer
  2、按流的类型分类
  字节流:InputStream OutputStream
  字符流:Reader    Writer
  二、流功能分析
  读取流是从输入设备或数据对象中读取数据到程序,用程序进行处理读入的数据,写出流是把程序处理的数据输出到
  输出设备上比如硬盘和控制台。
  字节流读取和写入的数据单位是字节,可以读取和写入任何类型的数据。字符流读取跟写入的数据单位是字符,只能
  读取和
  写入文本类型的数据。当需要读取或写入文本型的数据时要用字符流,因为它会比字节流读写字符更方便和高效,相反当数
  据不是文本型时只能用字节流来读取跟写入。
  三、流中读写方法的示例。(当用到IO流时就有可能出现IO异常,所以需要处理可能的异常)
  字节流:
  FileOutputStream fos = new FileOutputStream("D://xxx.xxx");
  fos.write("dsfdsf".getBytes());//写入字节数组
  fos.close();           //用完后需要关闭流,释放资源。字节流不需要Flush
  FileInputStream fis = new FileInputStream("D://xxx.xxx");
  fis.read();       //读取一个字节
  fis.close();
  字符流:
  FileWriter fw = new FileWriter("D:\\xxx.txt");
  fw.write("sdfsdfsdf");//可以直接写入字符串
  fw.flush();         //写完后需要Flush,才能真正写道输出设备
  fw.close();         //close()时也会Flush。
  FileReader fr = new FileReader("D:\\xxx.txt");
  fr.read(char[] ch);//可以读取一个字符数组的内容
  fr.close();
  四、转换流
  当需要流之间的转换时会用到转换流。
  1、把字节读取流转换成字符读取流
  InputStreamReader isr = new InputStreamReader(new FileInputStream("xxx.xxx"));
  2、把字符输出流转化成字节输出流
  OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("xx.xxx"));
 五、缓冲流
  需要提高流的读写效率时会用到缓冲流
  1、字节缓冲流
  BufferedInputStream bis = new BufferedInputStream(new FileInputStream("xx"));
  BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("xx"));
  2、字符缓冲流
  BufferedReader br = new BufferedReader(new FileReader("xx.txt"));
  BufferedWriter bw = new BufferedWriter(new FileWriter("xx.txt"));
  缓冲流对读写功能进行了增强,而且使用缓冲技术提高了读写效率,所以当需要提高程序的读写效率时要使用缓冲流。
  六、File类的使用
  1、创建
  boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false。
  和输出流不一样,输出流对象已建立创建文件。而且文件已经存在,会覆盖。
  boolean mkdir()创建文件夹
  boolean mkdirs() 创建多级文件夹
  2、删除。
  boolean delete();删除失败时返回false。如果文件正在被使用,则删除不了返回false。
  void deleteOnExit();在程序退出时删除指定文件。
  3、判断
  boolean exists();文件是否存在。
  isFile():是不是文件
  isDirectory();是不是文件夹
  isHidden();是不是隐藏文件
  isAbsolute();是不是绝对路径
  4、获取信息
  getName();文件名
  getPath();文件路径
  getParent();上一层路径
  getAbsolutePath();绝对路径

posted @ 2014-04-18 13:51 顺其自然EVO 阅读(1677) | 评论 (0)编辑 收藏

Selenium文件上传的实现

 一、对于上传文件, 从手动操作我们可以看出, 需要对window 窗体进行操作, 而对于selenium webdriver 在这方面应用就受到了限制。 但是, 庆幸的是, 对于含有input element的上传, 我们可以直接通过sendkeys来传入文件路径,省略了对window 窗体的操作来实现文件上传, 具体实现过程如下:
  1)找到上传控件element,并输入路径:
  WebElement element = driver.findElement(By.id("cloudFax-attachment-form-upload-input"));
  element.sendKeys(getFilePath(text.txt));
  2)路径的处理:
private String getFilePath(String resource) {
URL path = this.getClass().getResource(resource);
return path.toString().replaceAll("file:/","");
}
  这样把代码和文件上传到服务器, 就可以找到该文件进行上传。
  这里需要注意的几点:
  The element you want to put filepath is the "whole" input element rather than the "readonly" input element,as below, the first locator is right but the second locator will throw an exception.
  直接调用element.sendkeys , 不需要再做一次element.clear(),否则会出现该异常:Element must be user-editable in order to clear it.
  二、对于如下控件的上传方式, 暂时无法实现:



posted @ 2014-04-18 13:50 顺其自然EVO 阅读(2808) | 评论 (0)编辑 收藏

敏捷测试的人性化优势

 第一部分:潺潺流水化田园
  很多人认为一个好的测试工程师必须做到在第一时间发现所有的bug,然后以最快的速度测试完毕所有的task。以显示其测试技术的高超。
  您是否想过
  1:在一个task完成之后,这个task就真的如此果断的结束了吗?这个task对于整个软件,会产生什么作用?
  2:这个测试人员所谓的最快速度,究竟是何等的快,快的原因是什么?
  就算运用了自动化或者性能测试工具,这些工具的运用是否恰如其分?
  3:这些“高超的技术”会给公司带来什么?会带来公司文化的提升吗?公司的文化是什么呢?
  从拿到需求起,我就会先通读需求,逐句分析,一一尝试,一直到需求中的每一步,每一句都能融会贯通,同时将需求中涉及的每一个步骤在有必要的情况之下,一遍又一遍的执行,在执行的过程中,提出疑问。
  在疑问得到解答之后,在必要的前提之下,开出非常详细的bug,在bug中不但有步骤,还有个人感受,体会,甚至还会有建议。
  在很多时候,我的疑问,会有助于优化需求,我的bug也会很有可能被设置为by design,或者defer to another User Story。
  将成为另外一个需求的初始地。
  而我们的PM,都认为这样做是正确的,他们也乐于为我解答每一个疑惑。不论疑惑是大的还是小的,他们都会不厌其烦的为我进行解答。他们会理解我不是随便提的问题,因为我的问题必定是经过深思熟虑而提出的。
  他们会在置为by design的bug中,为我写明原因,而且还会对我所提出的bug或者疑惑进行鼓励,thank you,you are welcome是我们邮件中运用最多的词汇。
  就是在这样互相尊重,时时鼓励的氛围之下,我感觉每一天的工作是愉悦的,有价值的。
  我还会将每次的task都总结起来,时刻回顾分析,系统的每一个模块也在我的一遍一遍的分析之下,成为一个有机整体,合理,有序,有逻辑化,不紧不慢,每一天,每一刻,都是一个小进步。
  看着整个系统渐渐成熟,如同一片田园,就是因为有测试工程师这样的流水,才能从荒芜渐渐变成一片美好景象一般。心中不免有一丝欣慰。仿佛呼吸着田园带来的清新空气享受春风吹过般的感觉。
  而闲暇时候,我还学习一些自动化测试,性能测试,还学习数学理论,并与同事分享成果。
  谁会在乎你是否第一时间发现bug呢?这有何重要呢?
  第二部分:分出高下的埋没人性
  有的软件公司会在试用期期间招募一批测试人员,然后短期时间内就分出个高与低,这种高于低的区分不是靠工作的热忱度,也不是靠对于测试的投入多少,往往靠几句花言巧语,或者耍耍花腔和所谓的资历。
  最终结局往往还会是,被“淘汰”的人会被那些没有被淘汰的人举行隆重的“葬礼”,然后灰溜溜的离开这个公司或者离开这个职位。
  而要继续“重生”,他们逐渐学会了如何“耍花腔”。我承认他们很理解测试的流程,测试的理念,测试的工具的使用,比如自动化测试,或者性能测试,甚至,他们的智慧都是超高的。
  但是他们在测试的过程中,对其测试的主体:这个软件。却并不怎么了解,也不想了解。他们只想应付工作,想升职,想当测试经理,甚至,想找工资更高的工作!
  他们的中心思想,也就是银子,为了银子不顾一切,人性被埋没了,人格也消失了。
  这不是测试人员的错,这是制度的错。
  而这样的软件公司,不在乎测试人员与开发人员之间的沟通,更不会关注测试人员的感受,尤其是那些所谓的初级测试人员的感受:
  体现在:
  1:每天完成大量工作,测试人员彼此很少沟通,彼此是竞争对手。(人干嘛非要你争我夺,累死累活)
  2:他们的绩效是开bug的数量,而且还不成文的规定是开被fix的bug的数量。
  (by design 的bug也是智慧的结晶,不能歧视有缺陷的儿童嘛,人家又不是故意开bug,人家开bug也很费力气,很多也是需求问题造成的。在此,人性也很缺乏)
  3:没有必要的前提下搞性能测试和自动化测试。自动化测试,性能测试团队和普通测试团队分离,显得自动化,性能高于普通团队。(我从来都认为劳动的含金量不是靠工具来决定的,而是靠一颗热忱的心,自动化一段时间不用就会忘记,但是热忱的心不会改变)
  4:他们的软件质量好是碰运气,质量差是测试人员的不是,有人要承担后果。(由于是金钱上的后果,所有人都生活在恐惧之中,氛围紧张)第三部分:黑暗团队之封建社会
  在一个多年的测试团队中,新分派一个根本不了解这个软件人作为测试团队的头领。仅仅因为这个人有某种特权,或者有某种资历。
  先且不谈这个团队中原本是存在着对于这个软件有着系统了解的组员的感受了。
  这样的头领必须每日花费所有时间来了解整个软件,才可能赶上其他测试人员的步伐,与此同时还要鉴别所有测试人员的测试成果,做出决策,这恐怕是比登天还难的事情。
  而黑暗团队的组成模式是可以轻松实现这种比登天还难的事情的:
  测试头领以“保住自己的有利地位和有利工资”为主线。
  结果扼杀团队成员的想法和活力,因为测试的头领想留住对自己有利的人,而不是去思考如何将软件的质量进一步提升,更不是想让人人都了解软件。
  这样的测试头领会想让某些人“不知”,或者“后知后觉”,而另一些人却“先知”,可是“先知”的那些人真的能做到知无不言,真的是勇于探索的吗?
  那些被新的“头领”认可的人必然会歧视其他人,同时因为自己已经取得了有利“地位”而不需要进行更多的探索和努力,变得更为懒散。
  将所谓的重复的“任务”分配给“后知后觉”的苦命人。
  这些任务因为是那些“皇帝”,“地主”设置的,往往有很多“特点”:
  1: 很多是不必要的任务,做了一天下来发现是白白做了,冠冕堂皇的说让你做你做就是了。
  2:“皇帝”,“地主”认为不需要告诉“后知后觉”们为什么要做这些任务,因为他们是奴隶,只需要听从主子的安排就是了。
  3:“苦命人”每天累得腰酸背痛,都不知道在做什么,还心情低落,无处申诉。
  4: 如果有什么后果,就是那些“苦命人”来承担。所以,加班,后果,裁员都是由“后知后觉”承担。(此时的“苦命人”早已知道自己的地位,也不再恐惧了,受罚的肯定是自己了,所以可以“笑对一切”,难不成就是个回家继续找工作咯!)
  以上就是黑暗团队。想象地主挥舞鞭子抽打着奴隶的样子,还要奴隶为他们服务吧。
  第四部分:敏捷测试迎来改革开放晨光,劳苦大众翻身做主人
  ---人人迸发智慧的光芒
  敏捷测试真的优点多多
  1:不会把人累倒
  因为每个周期会有2,3周时间,每个人以自己的方式尽快测试完毕,发挥自身的潜能。就算到时候无法完毕,也不是大不了的事情,因为在每天的交流之中,人人都了解你付出的努力,你是有理由这样的,人都是讲道理的。
  不会出现每天加班没法完成任务的景象。
  2:独立的测试,不需要依赖别人,界限分明,彼此敬重,不争不抢
  因为你的任务就是你的任务,不需要给别人插手,如果是别人做的,也可以将任务分配给那个人就行了,你可以在日后研究别人的测试用例,取长补短。
  以人为本的敏捷测试会让十个测试人员有十种光芒,您会说他们也许会七嘴八舌,也许会有重复的。
  可是,当他们人人都深入了解软件,软件本身的功能与内涵就会如同一条主线贯穿于每个人的脑海,因为有着共同的目标和热诚,软件在每个人的心中都如同一种纽带,一种信仰,让所有的测试人员彼此的心,相通了。 所谓的测试经理只需要开个会,一一记录,并给予每个人以正确引导和鼓励,相信这会是高效的,愉悦的大会。
  而每一次的大会,会像潺潺流水一般滋润到整个软件中,滋润到每个人的心中。
  软件-心灵-生命-热诚,甚至是关爱,对测试人员的关爱,对软件的热情, 这同时也升华成为团队的一种文化,公司的文化。
  在任何公司文化中,都不免会有一些人被淘汰,而敏捷测试所淘汰的人,必定是那些自愧不如的人,因为谁对软件了解多少,如何了解,必定会在每一次的交流中得到充分体现,思如泉涌的人会体现,碌碌无为的人难道能够混过去吗?
  谁做测试经理,自然是对软件最最了解的,自然是热忱度最高的那一位。所以测试经理应该是在团队运行一段时间后逐渐,自然形成的。相信这样的测试经理会是一个拥有一颗善良的心的,关心团队中每一个成员的好人,更不会做出“皇帝”的样子来,“地主”的样子来。
  人心凝聚了,当然也不会有人总是离职,有那么好的职员,团队也不会那么容易裁员。而离职的人,一定是希望有更高的收入,不在乎自己辛苦钻研的软件的人,也就让他去吧。
  如果您说,您在一家公司是测试经理,因此您希望在新的公司也要做测试经理,我想这个愿望不太可能立刻达成。因为您要做的事情太多太多,您要成为整个团队的主心骨,您要成为这个软件的专家,您不能懈怠。
  如若您碰巧真的是立刻达成了此愿,那么请尊重每一个人,尊重每一个组员,让他们为软件付出的同时得到您真诚客观的鼓励,并将他们的成果转换为您自己的idea,与大家密切分享,并时刻努力,这样下去,团队将在您的带领之下蒸蒸日上。
  而在您离职的时候,请将您的职位传授给最最了解这个软件的人。所谓公道自在人心,相信这会是您气度的体现,相信上天还会因此而继续保佑公司,保佑您!
  最后,我想,敏捷测试适合长期的项目,因为它有一个潺潺流水化田园的过程,但是对于短期项目的同学们,你们可要做好继续奋斗的准备,因为路就在脚下,永远不需要气馁,永远不需要低头,曙光是前方明亮的,上天会保佑不断奋斗的人,51testing是精神家园。 对于长期项目的人亦是如此。
  不管是长期项目,还是短期项目,都是一个锻炼的过程,对于人生来说,都是一段回忆,而人生的田园需要您不断的灌溉,用真诚,友善的心来面对一切事物吧。
  这就是人生中的潺潺流水化田园的寓意所在。
版权声明:本文出自 wchair 的51Testing软件测试博客:http://www.51testing.com/?153101
原创作品,转载时请务必以超链接形式标明本文原始出处、作者信息和本声明,否则将追究法律责任。

posted @ 2014-04-18 13:49 顺其自然EVO 阅读(202) | 评论 (0)编辑 收藏

测试数据构造秘技(1)—专属数据引用数据分离

最近在企业里面看了一些测试案例的数据准备,发现了一个共性问题:测试数据中存在大量冗余,这些冗余会给后续的测试案例及数据维护带来大量的成本。
  为了便于大家理解,先举一个例子:
  测试信用卡交易金额汇总,测试数据完全从csv中加载,每个测试案例根据csv中的数据,assert特定返回值(由于篇幅限制,这里只举了一个简单的例子。实际看到的情况是,csv完全没有字段名称信息,一行里面成百上千个数据,而且还有许许多多类似结构的csv文件作为测试数据)。
  在这两个文件里面,我注意到有大量冗余。以csv格式的测试案例为例,想象一下如果未来这个表结构发生变化(增加或减少字段),那么需要修改所有这些csv文件,会是什么样的工作量!
  在乔梁翻译的《持续交付:发布可靠软件的系统方法》一书,其实已经给出了解决思路,只不过由于没有具体实例,不是很容易理解。
  经何勉提醒,发现在《实例化需求》一书中,也提到了类似思路,但同样都没有实例,:):
  下面我们就以上面例子为基础,说明一下两本书中的思路如何具体应用:
  应用程序引用数据(Application reference data)是测试无关数据,但它们是应用程序启动所必需的,这些数据往往是指一些基表和基础数据;
  测试引用数据(Test reference data)是那些和测试相关,但是对测试行为没有多大影响的数据,在下面两个例子中,黄色就是测试引用数据
.

测试专属数据(Test specific data):真正影响测试行为的特征数据
  了解了测试引用数据和测试专属数据的区别后,我就可以介绍测试数据构造第一秘技了:
  将测试引用数据和测试专属数据的准备过程分离,分离复用测试引用数据准备,而将测试专属数据保存在测试脚本中。
  具体的做法是,第一个例子中,我们建议在每个测试案例里面,先使用一段公共程序为每个案例准备一样的测试引用数据,然后再用UPDATE语句来将测试专属数据导入,测试案例的伪码如下:
  测试案例1
  从CSV导入测试引用数据
  
  测试专属数据导入
  UPDATE transactions SET amount = 15.99 WHERE id = 1;
  UPDATE transactions SET amount = 30.98 WHERE id = 2;
  UPDATE transactions SET amount = 75.95 WHERE id = 5;
  UPDATE transactions SET amount = 150.9 WHERE id = 10;UPDATE transactions SET amount = 750.5 WHERE id = 50;
  测试执行
  测试验证 (总和是1024.32)
  测试案例2
  从CSV导入测试引用数据
  测试专属数据导入
  UPDATE transactions SET amount = 34.56 WHERE id = 1;
  UPDATE transactions SET amount = 56.78 WHERE id = 2;
  UPDATE transactions SET amount = 57.97 WHERE id = 5;
  UPDATE transactions SET amount = 44.32 WHERE id = 10;
  UPDATE transactions SET amount = 234.65 WHERE id = 50;
  测试执行
  测试验证 (总和是428.28)
  这样做主要有两点好处:
  测试案例可维护性:上面这些案例中,测试引用数据由于使用了INSERT语句,它其实会受到数据库表结构变化的影响,而测试专属数据准备由于使用UPDATE语句,不会受到数据库表结构变化的影响。我们通过统一测试引用数据准备程序,将这种变化的冲击大大降低,未来数据表结构变更,我们只需修改统一的测试引用数据准备程序而无需修改每一个案例,这其实暗合了DRY原则(Don’t repeat yourself)。
  测试案例可读性:由于我们将测试引用数据准备从独立出来了,只要看测试案例本身,就可以明确地看到测试专属数据,被测行为和结果验证,让案例可读性大大提升。
  为了便于大家理解,我们再举另一个例子,假设有一个测试汇率转换接口,测试输入是xml文件:
  应用测试引用数据和测试专属数据分离原则,可以看到哪些是引用数据,哪些是专属数据
  
  因此,在测试案例中,我们会先准备并加载一个基底XML文件,再设置测试专属数据,下面是利用Robot Framework编写的两个测试案例,可以看出,未来如果XML文件的结构有任何变更,我们都只需要修改基底XML文件即可,而不需要修改任何测试案例了
  至此,我们想大家已经明白,对于测试数据准备这个步骤而言,将测试引用数据和测试专属数据分离,会非常有效地提升测试案例可维护性和可读性。

posted @ 2014-04-18 13:45 顺其自然EVO 阅读(188) | 评论 (0)编辑 收藏

Web测试中的几个case

一、页面上对引起 大量数据提交的 按钮/链接 点击一次后,  disable
  需求:
  对于重要的表单、数量庞大/响应慢的系统,在做提交时, 又有页面还在loading状态, 此时连续做两次点击, 经常引起各种报错,这种情况下, 需要提出 对 按钮/链接 点击一次后, 做 disable
  测试
  1)、查看页面源代码是否有脚本控制,例如:
<a href="javascript: $('#next').val('true'); buttonDisable();headerFormSubmit();" type="submit" class="btn" id="nextButton"> Next </a>
function buttonDisable(){
$("#nextButton").attr("disabled", "disabled");
}
  2)、对脚本进行调试,
  可以借助firebug工具,在Script Tab上,在$("#nextButton").attr("disabled", "disabled");这行脚本设置disable, 点击nextButton,检查运行到断点处停止,按钮无法再次点击。运行断点后, disable解除。
  二、新增数据库字段测试需要考虑的几个点
  1)、从数据库检查起, 检查相关表: 原表、历史表、与其同步库的表 有没有都添上该字段,并且注意在每个表中, 字段类型是否统一
  2)、校验:考虑字段本身类型,   判空、边界、唯一性、特殊字符、正确性允许的data
  特别, 在做判空时,若字段不允许为空时,考虑: 需要提交脚本初始化历史数据set dafault value
  3)、流程覆盖:考虑该字段覆盖到哪几个相关页面, 测试到整个流程, 每个页面校验要一致;
  三、查log测试的几个操作
  一般情况下, 项目都部署在linux环境上, 测试时, 有些需要查log, 或者有些服务需要自己去重启, 此时就需要一些基本的linux操作命令:
  1)、首先连接到linux系统的机器上,可以使用putty软件, 要有 服务器地址+端口+协议  loginName+password,就可以登录
  2)、cd到脚本或者log放置的文件夹位置去重启服务或查看log,还有一些常用的命令
  less 文件名(W向上翻页、F向下翻页,Shift+F自动翻页,Ctrl+C停止自动翻页);
  grep "findString" 文件名;
  执行脚本:   ../脚本名   或者   sh./脚本名

posted @ 2014-04-18 13:26 顺其自然EVO 阅读(173) | 评论 (0)编辑 收藏

仅列出标题
共394页: First 上一页 123 124 125 126 127 128 129 130 131 下一页 Last 
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

导航

统计

常用链接

留言簿(55)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜