专注于自动化测试,性能测试.......

发布新日志

  • KDATFFS v1.0 发布

    2011-12-09 09:26:37Top 1 Digest 1

      KDATFFS 作为一个基于Selenium的关键字驱动的自动化框架,其中包括KDATFFS,KDATFFSRecorder,KDATFFSRunner. KDATFFS是框架的核心,KDATFFSRecorder是一个测试录制工具,KDATFFSRunner是一个测试运行工具。

    具体详情请见 KDATFFS

    如果有问题可以在博客中留言或者发email给我。

    By the way, 如果下载后,360报有trojan.generic病毒,那并不是病毒,而是360的流氓本色在作怪,^_^!

  • 关于WebDriver(selenium2)的关键字驱动自动化框架-KDATFFS(原创)

    2011-11-16 12:31:11Top 1 Digest 1

      本文为作者原创,如需转载请声明作者及出处

      刚刚发布了关于WatiN系列最后一篇文章,算是对使用WatiN的最终篇了,WatiN+Gallio的组合,就我看来应该是最佳的一种组合了,它们之间互补性很强,以至于在Gallio的Samples里就有一个关于WatiN的事例,写的非常精彩,有兴趣的可以去看看。事实上,我从来不是一个安分的人,总是喜欢尝试一些新奇的东西。最近在研究Selenium,在selenium1.0时代,我使用过它,感觉很不方便,虽然它一直名列最受欢迎的web开源测试工具的首位,但就是感觉不是那么回事。但令人惊喜的是,Selenium 2.0发布了,它完全颠覆1.0的模式。采用了类似于WatiN,Watir的方式,浏览器,元素,Find方法等等,都极其的类似,却又有所简化,试用了一下,感觉还不错。

      当然使用是最基本的,但是自动化测试追求的是适应性强,以致出现了数据驱动框架,关键字驱动框架,很显然这些框架大大的提高了测试的灵活性,易用性。现在Selenium采用了WatiN类似的测试方式,受了Wax项目的启发,我也在最近针对Selenium2(也就是WebDriver)开发了一个关键字驱动的自动化框架-KDATFFS.(Key-Driver Automated Testing Framework For Selenium)

    界面

    主要实现以下一些功能:

    - 不需编写测试代码实现自动化测试
    - 多种测试数据载体(Excel,CSV)
    - 支持IE,Firefox浏览器,Firefox可以使用代理
    - 支持JS弹出框,弹出窗口
    - 支持IFrame结构
    - 支持页面元素,图片以及数据库数据的验证功能
    - 支持测试结果,测试日志输出
    - 良好的GUI操作和显示

     这个框架还在测试中,不久后可能会上传到codeplex开源网站与大家共享。

  • 设计模式系列(1) 使用频率

    2018-01-30 09:59:52

    自1995年,GoF四人组在《设计模式》一书中定义了23种设计模式后,设计模式就如灯塔般给无数开发者指明着方向。这些设计模式有些是我们耳熟能详的,如单例模式,工厂模式,策略模式,也可能有鲜有耳闻的,如享元模式,解释器模式.本文将列出每种设计模式在实际应用中的使用频率,已给开发者以参考。

    创建型(Creational Patterns)

    设计模式描述使用频率
    抽象工厂(Abstract Factory)提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类*****
    工厂方法(Factory Method)定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类*****
    单例(Singleton)保证一个类仅有一个实例,并提供一个访问它的全局访问点****
    原型(Prototype)用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象***
    建造者(Builder)将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示**

    结构型(Structural Patterns)

    设计模式描述使用频率
    外观(Facade)为子系统中的一组接口提供一个一致的接口,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用*****
    适配器(Adapter)将一个类的接口转换成客户希望的另外一个接口.Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作****
    组合(Composite)将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性****
    代理(Proxy )为其他对象提供一种代理以控制对这个对象的访问****
    桥接(Bridge)将抽象部分与它的实现部分分离,使它们都可以独立地变化***
    装饰(Decorator)动态地给一个对象添加一些额外的职责***
    享元(Flyweight)使用共享来有效地支持大量细粒度对象*

    行为型(Behavioral patterns)

    设计模式描述使用频率
    观察者(Observer)定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新*****
    迭代器提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示*****
    策略(Strategy)定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化****
    命令将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作****
    状态(State)允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类***
    模板方法(Template Method)定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤***
    中介者(Mediator)用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互**
    责任链(Chain of Responsibility)使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止**
    访问者(Visitor)表示要在对象结构的元素上执行的操作。Visitor允许您定义一个新的操作,而不需要更改它所操作的元素的类*
    解释器(Interpreter)给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子*
    备忘录(Memento)在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态*
  • 自动化测试:你如何拥有

    2018-01-18 08:57:24

    原文发布在: https://www.jianshu.com/p/907b21353a4f

    这是一个老生常谈的话题,如果你打开这篇文章,说明你正困惑于“如何开展自动化”这类问题。相信目前测试业内普遍认同"自动化并不是银弹"的说法。也就是说自动化并不能完美的解决测试的所有问题,但很多公司又都在搞自动化,说明开展自动化是需要具备一定条件的。

    适不适合开展自动化测试

    开展自动化测试之前,你第一个要问自己的问题就是"我们的团队适不适合开展自动化测试?"。并不是公司老板说我们需要开展自动化测试来提高工作效率,节约公司成本,就匆匆忙忙的开始进行自动化测试。你至少应该从以下几个方面考虑是否适合开展自动化测试:

    公司及业务的规模
    一般说来,自动化测试是大公司才能玩得转的游戏。因为在这些公司,开发流程相对比较严谨和完善,有专门的自动化测试团队来实施自动化;同时也因为规模大,可以使自动化测试形成规模优势,从而降低成本,提高效率

    项目的规模和性质
    并不是所有项目都适合进行,一些短平快的项目不适合自动化测试,一些需求长期变动频繁的项目也不适合自动化测试,只有迭代周期长且需求变动平稳的项目才适合自动化测试.

    做好ROI(投资回报率)
    做工作干事业,我们总是会考虑投入和产生的问题,自动化测试自然也例外。简单的概括,自动化测试的ROI可以用如下公式来计算:

    ROI=(手工测试成本-自动化测试成本)/自动化测试成本*100% 
    
    比如:现在有100条测试用例,设计这些用例需要耗费3天时间,执行一次需要耗费1天时间,那么以1月执行5次为例,
    那么一个月手工测试成本为3+1*5=8人日,而自动化测试100条用例设计需要7天,执行一次需要耗费2小时,
    但由于业务需求更改,每次需要花费半天进行脚本调整,那么一个月的自动化测试成本为7+0.5*5=9.5人日
    由此可见,只有在需求尽量少变更(减少维护成本),且需要多进行自动化测试的情况下,自动化测试才会有比较高的回报率.
    

    测试团队的技术水平
    虽然目前自动化测试框架的**度已经很高,但依然需要测试人员具备一定的开发能力。如果在技术储备不足的情况下开展自动化测试,成功的几率很低。

    业务需求变动频繁
    关于这点,几乎已经是业界内的共识。对变更很频繁的功能进行自动化测试,结局几乎都是灾难性的。测试人员往往陷入到自动化测试用例维护的漩涡中,结果就是自动化测试没有起到应有的作用,手工测试也被耽误了。

    持续集成的项目
    目前越来越多的团队实施了敏捷开发模式,敏捷开发中比较重要的观点就是持续集成。由于持续集成的持续性和即时性,所以非常需要自动化测试来持续的,及时的反馈测试的结果。

    节制且有策略的实施自动化测试

    很多公司都曾经开展过自动化测试,但取得成效的确很少。其中一个很重要的原因就是缺乏策略性,仓促的就开展自动化,甚至把自动化测试作为KPI来考核,结果大家都一窝蜂的编写自动化测试用例,KPI是漂亮了,但开展自动化测试对实际工作效率和效果的改善确没有尽如人意。其实,开展自动化测试应该一步一步来。先拿一个项目,甚至一个模块来做实践,"实践是检验真理的唯一标准",那么花费最小的代价来实践出真理就是最好的结果。通过实践,你总是会得到“自动化测试适不适合你们公司”,“如何更好的开展自动化测试”这些问题的答案。而且通过最佳实践,你也更有底气的在项目,甚至公司里广泛的开展自动化测试。![timg.jpg]
    实践出真知.jpg

    要选择合适的自动化测试

    测试金字塔.png

    大家对上面这幅图都应该很熟悉,测试金字塔揭示了进行测试的优先级。如果你们公司需要开展自动化测试,那么如上图所示,从单元测试开始是最好的选择。但单元测试是否实施以及如何实施的主动权往往在开发的手里。所以开展自动化测试的最佳选择往往是API测试(接口测试)。尤其是在现在越来越盛行基于服务的开发以及前后端分离,给接口测试实施自动化带来了极大的便利。对于UI自动化测试,虽然关于UI自动化测试讨论以及相关技术和框架都比较多,但实施的效果往往都不尽如人意。

    你可能需要一个自己的框架

    我们需要自己的框架并不是为了显示自己逼格高,而是当自动化测试规模到了一定的规模,维护自己的框架才会使你的自动化测试更好的进行。你也不必自己从头开始造轮子,在现有的测试框架上实现适合自己公司的功能就可以。比如说,使用Junit驱动API测试用例的执行,那么你可能需要一个平台来管理你目前的用例,批量执行测试以及测试报告的查看。

    结束语

    自动化测试,你是否值得拥有,我想答案是肯定的。但如何拥有,确有很长的一段路要走。如何结合技术与实践总结出适合工作的最佳方案是最终的目

  • 软件测试面试题

    2017-12-22 12:55:10

     在GitHub上维护一个软件测试面试题的项目,大家可以去看一下 software-testing-interview-question
  • 测试技术雷达的开篇

    2017-12-22 12:50:11

     兴起写测试技术雷达的念头,源于ThoughtWorks的技术雷达的启发。ThoughtWorks的技术雷达每年发布两期,是一份关于技术趋势的报告。通常把技术划分为技术,工具,平台,语言&框架4个分类,然后对每个分类涉及的内容以采用,试验,评估以及暂缓四个等级进行划分。最后以雷达图的形式直观展现出来。可以一目了然的看到哪些技术在被积极的运用,未来的技术趋势是怎么样的,我觉得这是一种非常好的展现技术趋势的方式.当然,技术雷达的准确性也是非常重要的,这和ThoughtWorks是一家技术咨询与服务公司是分不开的。

     对技术雷达感兴趣后,我仔细阅读了每期的技术雷达。但是很遗憾的是,技术雷达更多关注是开发技术,我在其中很少发现有测试技术的内容。因此,我兴起了写测试技术雷达的念头。但其中存在一个很大的问题,ThoughtWorks作为一家全球性的技术咨询公司,自然有很多的资源和经验来验证一种新技术或工具的各项指标。现在我个人来进行这么一项工作,先不说资源和精力的问题。就是做出来了,权威性何在?毕竟个人的认知并不能代表行业的形态。所以,我退而求其次,先建立个人的技术雷达。是的,技术雷达并不仅仅适用于整个行业的技术归纳和趋势展现,同样也适用于个人技术的归纳,规划。

     如果你阅读了这篇文章,已经说明你正身处一个时刻在变化的行业:IT行业。这是一个需要你一辈子去学习的行业。自从你迈入这个行业,你应该就有清醒的认识,你必须跟上技术的步伐,积极的拥抱技术的变迁,以不变的学习去对应万千的变化。对流行的技术的透彻了解是你安身立命的本钱,对未来可能流行的技术的研究是你未来发展的潜力所在。忽视技术的变迁是一种很危险的行为。所以构建自己的技术雷达,既可以对当前掌握的技术进行归纳总结,也可以结合当前流行技术给自己指明学习的方向。

     技术行业是一个需要你沉淀一些东西,同时也要研究点东西的行业。选择一些有广泛需求的技术(好找工作的),对这些技术要始终进行关注和学习。找点未来可能会流行的东西进行研究,给自己平淡的生活增添点酷炫的元素。

     上面说了构建自己技术雷达想法的缘由,那么如何构建呢?我的想法是这样的。首先还是像技术雷达那样,先划分出技术的四个象限,ThoughtWorks技术雷达的四个象限分别是技术,工具,平台,语言&框架.我觉得把测试技术进行划分,工具和平台这两个可以合并为工具。增加一个理论象限,语言&框架去掉,替换为其它(想不到别的了)。最后把测试技术划分为 理论,技术,工具,其它这四个象限。然后,划分的技术等级可以沿用 采用,试验,评估以及暂缓这四个。构建测试技术雷达的步骤,我的想法大概是这么两个步骤

    • 整理自己掌握的技术,按照四个象限和等级进行划分
    • 增添当前流行技术(和你掌握的技术重合的,你可以标注一下)

     以上,就是构建测试技术雷达的前因后果。即将迎来2018年,希望自己能把这件事儿做成,程序猿不易,且行且珍重。

  • 总结的WatiN的资料

    2014-03-08 21:40:02

       好久没有更新博客了,心血来潮的把以前总结的关于WatiN的资料上传。好久没玩这个了,估计以后也不会玩了,算是告别吧,呵呵。
  • 关于Tfs Api的一些想法

    2013-03-29 19:57:22

       最近用Tfs api写了一个统计测试执行情况的工具,深感tfs api还有很多料可以挖,特在此留下印记,以留后续参考。
       1. Tfs提供了api进行测试用例执行的操作,这个可以和现有的自动化框架结合进行自动化测试用例执行结果的回传。
       2. 有利于每日构建
       3. 可以进一步扩展来对测试用例,测试执行以及Bug的数据挖掘和分析。
       现在就这些吧,以后想到什么再补。
  • 任务管理器中进程的各列的含义

    2012-12-03 18:44:21

      
    描述

    PID(进程标识符)

    唯一标识所运行进程的编号。

    用户名

    运行该进程的用户帐户。

    会话标识

    标识进程所有者的编号。当多个用户登录时,每个用户都有一个唯一的会话标识。

    CPU 的使用

    自上次更新以来,进程使用 CPU 的时间百分比(列标题中列为“CPU”)。

    CPU 时间

    进程自其启动以来使用的总处理时间(以秒为单位)。

    内存 - 工作集

    私人工作集中的内存数量与进程正在使用且可以由其他进程共享的内存数量的总和。

    内存 - 峰值工作集

    进程所使用的工作集内存的最大数量。

    内存 - 工作集增量

    进程所使用的工作集内存中的更改量。

    内存 - 私人工作集

    工作集的子集,它专门描述了某个进程正在使用且无法与其他进程共享的内存数量。

    内存 - 提交大小

    为某进程使用而保留的虚拟内存的数量。

    内存 - 页面缓冲池

    由内核或驱动程序代表进程分配的可分页内核内存的数量。可分页内存是可写入其他存储媒体(例如硬盘)的内存。

    内存 - 非页面缓冲池

    由内核或驱动程序代表进程分配的不可分页的内核内存的数量。不可分页的内存是不能写入其他存储媒体的内存。

    页面错误

    自某进程启动后该进程生成的页面错误数。进程访问当前不在工作集的内存页面时会出现页面错误。某些页面错误要求从磁盘中检索页面内容;其他的页面错误可在不访问磁盘的情况下解决。

    页面错误增量

    自上次更新以来页面错误数量的变化。

    基本优先级

    优先排名,它确定了所计划进程的线程顺序。

    句柄

    进程的对象表中的对象句柄数。

    线程数

    进程中运行的线程数。

    USER 对象

    当前由进程使用的 USER 对象数。USER 对象是来自 Window 管理器的对象,它包含窗口、菜单、光标、图标、挂接、加速器、监视器、键盘布局及其他内部对象。

    GDI 对象

    图形输出设备应用程序编程接口 (API) 的图形设备接口 (GDI) 库中的对象数量。

    I/O 读取

    由进程(包括文件、网络和设备 I/O)生成的读取输入/输出操作的数量。无法计算定向到 CONSOLE(控制台输入对象)句柄的 I/O 读取数量。

    I/O 写入

    由进程(包括文件、网络和设备 I/O)生成的写入输入/输出操作的数量。无法计算定向到 CONSOLE(控制台输入对象)句柄的 I/O 写入数量。

    I/O 其他

    由既非读取又非写入的进程(包括文件、网络和设备 I/O)生成的输入/输出操作的数量。此类操作的示例是控制功能。无法计算定向到 CONSOLE(控制台输入对象)句柄的 I/O 其他操作数量。

    I/O 读取字节数

    由进程(包括文件、网络和设备 I/O)生成的输入/输出操作所读取的字节数。无法计算定向到 CONSOLE(控制台输入对象)句柄的 I/O 读取字节数。

    I/O 写入字节数

    由进程(包括文件、网络和设备 I/O)生成的输入/输出操作所写入的字节数。无法计算定向到 CONSOLE(控制台输入对象)句柄的 I/O 写入字节数。

    I/O 其他字节数

    由既非读取又非写入的进程(包括文件、网络和设备 I/O)生成的输入/输出操作所传输的字节数。此类操作的示例是控制功能。无法计算定向到 CONSOLE(控制台输入对象)句柄的 I/O 其他字节数。

    映像路径名称

    硬盘上的进程位置。

    命令行

    指定为创建进程的完整命令行。

    用户帐户控制(UAC)虚拟化

    确定为此进程启用、禁用还是不允许使用用户帐户控制 (UAC) 虚拟化。UAC 虚拟化将文件和注册表写入错误重定向到每用户位置。

    描述

    进程的描述。

    数据执行保护

    是否为此进程启用或禁用数据执行保护。有关详细信息,请参阅 什么是数据执行保护?

  • 【原创】浅析自动化测试框架(一) 自动化测试框架是什么?

    2012-01-04 18:08:54

     浅析自动化测试框架()  自动化测试框架是什么?

        本文为原创,欢迎转载,转载请注明作者及来源(Felix ,TIB工作室)

       本文章是一个系列文章,主要的撰写目的是通过该系列文章,让大家对自动化测试框架的概念,类型以及创建有个大概的了解和认识,通过该系列文章,也许无法使人一下子可以构建起自己的框架,但至少希望可以帮助初学者可以在创建测试框架的旅程中踏下坚实的一步。当然由于本人的能力或视野的局限性,在文中有谬论之处,也请读者海涵。另外注意,本系列文章是针对功能测试自动化,而非单元测试或性能测试。本系列文章的初步计划编写的目录为:

    1.       自动化测试框架是什么

    2.       几种自动化框架的介绍

    3.       如何构建数据驱动框架

    4.       如何构建关键字驱动框架

    5.       如何构建混合型测试框架

     

      自动化测试是什么?大家都很清楚,就是用程序测试程序的过程。那么,自动化测试框架是干什么的呢?维基百科上是这么给出定义的,“测试自动化框架就是支撑自动化测试的一系列假设,概念和工具。”这个概念定义的比较抽象,事实上,我个人认为自动化测试框架的概念并不是唯一的,因为在不同情况下,自动化测试框架的核心组成部分并不一定是固定。

    比如大至整个自动化测试项目的文档,流程规定,约束,工具 ,小到一个简单的帮助函数都可能被称为自动化测试框架(只是很少有这种情况而已,^_^)。本系列文章依然着重于技术层次上的自动化测试框架,不会设计流程,管理层次上的。

     

      在我看来,自动化测试框架就像是个容器,一个包括了一系列构件的容器,每个构件包含一系列的约束,规则。我们把符合规则的文件放入各自的构件中,由框架解析文件,并根据预先制定的规则进行自动化测试,然后输出测试结果。如果这个大家还是不理解,没关系,我会在后面具体讲述如何创建框架时来诠释这个概念。

    那为什么一定要创建自动化测试框架呢?它能解决哪些问题?其实构造不同类型的框架,其目的还是存在一定差异性的,但总体说来,构造框架的目的有以下这么几个

    1.       类似于开发的框架,构建框架有利于自动化测试的协同开发

    2.       框架中编写的公共函数库,可以避免代码的重复编写

    3.       框架的不同构件设计,有利于松耦合测试脚本中数据,对象,逻辑之间的依赖关系,利于自动化测试的维护

    4.       构建框架有利于多工具的整合使用,有利于跨平台操作,可以初始化测试环境

    5.       如果需要分布式执行,那么也可以通过构建框架来处理相关的事务。

    这里不理解也没关系,这些都会在后续的文章中提到。

      其实是否构建自动化测试框架,以及如何构建都是根据实际情况不同而具体分析,但一般情况下,构建自动化测试框架都是在已有的框架或工具上进行二次开发。毕竟现在开源资源这么丰富,实现没有必要再去重新写一个底层处理的工具。比如如果是进行web功能测试,可以有watir,watin,selenium等工具可供选择,进行C/S架构的客户端功能测试可以选择white等,当然如果条件允许,也可以选择商业工具,如QTPTestcomplete,这些商业工具一般都提供扩展接口,对象接口可供使用。

      本文主要介绍了自动化测试框架的概念,目的,仅希望读者对框架有个初步的概念,在后续的文章中会进一步结合实际来阐述这些概念。


  • 【原创】如何操纵已打开的IE窗口

    2011-12-28 11:20:09

       本文为原创文章,转载请注明出处(TIB工作室)

       在Vs中新建一个控制台程序,引用SHDocVw.dll和mshtml.dll.
       首先初始化ShellWindowsClass,以获取当前打开的所有IE窗口,然后再其中轮循所有的IE窗口,根据页面的标题找到想操纵的IE窗口,然后把IWebBrowser2对象的Document对象转换为IHTMLDocument2,然后就可以操纵其中的元素了,具体代码如下:

    using System;

    using System.Collections.Generic;

    using System.Text;

    using mshtml;

    using SHDocVw;

    namespace GetIEWindow

    {

    class Program

        {

     static void Main(string[] args)

            {

                string browerTitle = "百度一下,你就知道";

                string elementId = "kw";

                string inputValue = "my test";

                var allBrowsers = new ShellWindowsClass();

                IHTMLDocument2 currDocument =null;     

                foreach (IWebBrowser2 browser in allBrowsers)

                {

                    if (((IHTMLDocument2)browser.Document).title == browerTitle)

                    {

                        currDocument = (IHTMLDocument2)browser.Document;

                    }

                }

                IHTMLElementCollection elements = currDocument.all;

                foreach (IHTMLElement element in element)

                {

                    if (element.id == elementId)

                    {

                        element.setAttribute("value", inputValue, 0);

                    }

                }

                Console.ReadLine();

            }

        }

    }

  • 解决KDATFFSRecorder运行报错问题

    2011-12-15 21:40:24

     之前KDATFFS下载安装完毕后,KDATFFSRecorder运行会报错,原因是ComUtilities.dll未打包,先解决方法有两个:
     1) 卸载KDATFFS,重新下载后,重新安装
     2) 下载附件中的文件,解压到KDATFFS的安装目录中,运行Regsvr.BAT即可。
  • 学习WatiN源代码之前做的一些准备

    2011-12-15 17:13:26

    近日完成了基于Selenium2的自动化测试框架KDATFFS v1.0的开发,虽有不尽人意之处,不过也确实在工作中运行良好,也修复和改进了一些bug。对2.0的一些新功能和应用也有了一些新的想法和计划,但也都想好好的沉淀一段时间,对KDATFFS整体的框架做更为合理的设计和重构。
     
    其实对WatiN这个工具一直是比较关注的,之前也写过WatiN使用的系列文章。记得几年前就研究过WatiN的源代码,那时还是WatiN 1.*,看的颇为吃力,大家都清楚看别人的代码是一件非常吃力不讨好的事情,尤其是开源项目,没有现成的概要,设计文档供你参考,当时就中途放弃了。现在 却又重新提起了兴趣,毕竟这么经典的开源项目,错过了确实可惜。
     
    那么在学习WatiN源代码之前,还是要做些准备工作的,主要是C#语言的一些新特性的使用的相关知识的学习,还有就是代码分析工具的使用。
      
    粗略的概览了一下WatiN的源代码,关于C#语言的需要增强学习的大概有:
      1.
    特性编程
      2.
    泛型编程
      3.
    委托,Lambda表达式
      4. Win32
    一些API的编程
      5. Interop.SHDocVw
    Microsoft.mshtml程序集
     
    辅助工具:
      AQtime
      
    好了,就记录这些,放在这里备忘,有遗漏以后再补充。

  • KDATFFS框架测试实例(一) 登录测试

    2011-12-14 20:33:16


    KDATFFS工具进行自动化测试还是比较简单的,现以Ctrip登录测试作为实例来讲解KDATFFS工具的使用

    1.首先使用KDATFFSRecorder工具进行测试步骤的录制


    1.JPG


    Figure 1 开始录制

    1)输入测试网址,并导航到测试页面

    2)添加一个测试,比如“LoginTest”,并选中它,状态栏中会显示当前的测试名称

    3)点击“开始录制”的按钮,就可以开始录制,录制过程中可以暂停/记录录制,同时也可以删除某个测试步骤,也可以通过“开始查找”按钮来进行测试步骤的手工添加。(注意,浏览器的操作的测试步骤也需要在“开始录制”按钮被Checked的情况下录制。)

    2.JPG


    Figure 2 添加验证点

    4)用户登录成功后,我们为了验证登陆是否成功,可以对登陆成功页面添加验证点。把“Is Find Element”按钮按下,把鼠标移动到需要验证的页面元素上,点击左键就可以选择需要的验证点了。这里我们添加两个验证点,一个是验证页面标题ValidteBrowerTitle ,一个是验证用户名称 ValidateItemText

    5)这样一个登陆的测试就录制完成了,勾选需要导出的测试,输入sheet name,导出即可。

    3.JPG


    Figure 3 录制成的测试步骤

    2. 然后,我们就可以对录制完的测试步骤进行编辑,参数化等操作。

       录制完成后,你可直接在KDATFFSRunner中运行你录制的测试步骤,但是因为刚才输入的数据都是固化数据,不利于灵活的执行测试,你也可以选择对测试数据进行参数化,参数化的操作很简单。创建一个Excel文件用于存放数据,比如“TestData.xlsx,Sheet表名为”Login”。你需要参数化几个参数就创建几列,这里有 网址,用户名,密码,两个预期值。

    那么测试数据如下

    4.JPG


    Figure 4 测试数据

    1) 修改测试文件,参数化数据,参数化的格式为Data[sheet表名:列明],那么测试文件中的测试数据就应该修改为

    Logintest 修改为 Data[LoginName]

    …………

    一个测试只能匹配excel中的一个表

    5.JPG


    Figure 5 参数化后的测试文件

    2)把测试文件中需要参数化的参数都依据如上进行参数化话后,就可以进行测试执行了

    3.测试执行

    打开KDATFFSRunner

    1)如果需要执行数据驱动的话,导入测试文件

    6.JPG


    Figure 6 导入测试数据

    2) 导入测试文件

    7.JPG


    Figure 7 导入测试文件

    3) 设置选择浏览器类型,是否设置代理,速度等参数后,如果是数据驱动的话,把Data Driver设置为yes,点击Start就可以开始测试了,在IE浏览器中执行时,Speed最好设置大一点,比如300Firefox无所谓,可以极速执行。

    8.JPG


    Figure 8 测试执行过程中

    4) 上图会发现测试步骤多出了很多,这是因为执行过程中会根据测试数据的数量迭代的生成测试,执行完毕后,可以在Test
    Log
    中查看执行的错误信息。

    9.JPG


    Figure 9 测试日志

  • KDATFFS中增加可参数化的字段

    2011-12-13 15:19:56

     
     
       之前在KDATFFS中,只可以参数化CommandArgs,ExpectedValue两个字段可以进行参数化,现增加了FindArgs,Frame,window字段也可以进行参数化操作。
  • ATI网站评选出的有关自动化测试的最佳

    2011-12-05 21:18:06

    每年ATI(automated testing institute)网站都会评出有关自动化测试的最佳荣誉,今年是第三届,其中评选出了

    • 最佳开源单元自动化测试工具
    • 最佳开源功能自动化测试工具
    • 最佳开源新性能测试工具
    • 最佳商业功能自动化测试工具
    • 最佳商业性能自动化测试工具
    • 最佳自动化测试书籍
    • 最佳自动化测试博客
    • 最佳自动化测试论坛

     详情见 http://www.automatedtestinginstitute.com/home/index.php?option=com_content&view=article&id=1379&Itemid=188 

  • 自动化测试中自动生成测试数据

    2011-12-02 17:12:15

     在进行自动化测试过程中,很多的框架的测试数据都是从外部(ExcelCsv,数据库)读取的,一般数据都是固化数据。显然这样做不够灵活,而且很多场景下这些数据需要频繁的改动,比如用户注册,第一次这个数据注册成功了,但是第2次再运行,很显然会失败,因为这个用户已经注册过了。这时候我们会想到生成随机数据,但是随机什么样的数据呢?这需要定义生成数据的规则,对于数据的匹配规则,我们很快想到了正则表达式,那么测试数据写成正则表达式,然后根据正则表达式来生成数据不是Perfect,确实是这样。但是对于正则表达式的反解析绝对是一个不轻松的工作,而且需要相当的正则表达式的知识。那么我们何不自己定义数据生成的规则呢?这就是我下面想讲的,如何定义自己的规则,然后生成对应的测试数据?

     

      首先,我们要先定义规则标识,只有这样,数据被读取到代码后,它才会去解析数据。这样我们给出这样的标识 Rule[],当测试代码读取到测试数据为Rule[]时,就知道这是一个需要解析的测试数据,调用解析方法进行GetReturnData(string name)方法进行解析。Rule[][]括号中就是我们的数据规则,比如数据中固定的数据我们定义为F() ,随机数定义为R(),随机字符串定义为S()等等。比如我们有这样一个数据规则Rule[F(fix)|R(5)|S(2)],这样在测试输入时就应该是输入一个fix+5位随机数+2个随机字符的数据。

     

       而因为定义数据规则后,输入的数据时不可预测的,那之后的测试过程中如果用到这个测试数据该怎么办呢?我们应该可以有个方法可以获取到输入的数据。那么在输入时我们就定义一个规则:Value1 =Rule[],就是说在输入数据的同时把这个值赋值给Value1。而这个Value1会被添加到一个泛型字典中,这样在以后需要用到该数据的地方我们就可以定义一个规则Rule[E(Value1)]来读取value1的值。

       就这样,我们可以灵活的定义自己的数据规则,使测试数据更为灵活,简单,方便。

    具体实现代码如下:

     

     public class UtilityClass

        {

           private static Dictionary<string, string> returnData = new Dictionary<string, string>();

     

            static UtilityClass()

           {

     

           }

     

            public static string GetReturnData(string name)

            {

                foreach (string item in returnData.Keys)

                {

                    if (name == item)

                    {

                        return returnData[item];

                    }

                }

                return "";

            }

            public static string GetTestDate(string commandArgs)

            {

                Regex regex = new Regex(@"(.*)Rule\[(.*)\]");

                Regex returnRegex = new Regex(@"(.*)=");

                Regex fixeRegex = new Regex(@"(F\()(.*)(\))");

                Regex randomRegex = new Regex(@"(R\()(\d*)(\))");

                Regex expectedRegex = new Regex(@"(E\()(.*)(\))");

                if (regex.IsMatch(commandArgs))

                {

                    var items = regex.Match(commandArgs).Groups;

                    string[] regItems = (items[2].ToString()).Split('|');

                    StringBuilder sb = new StringBuilder();

                    for(int i=0;i<regItems.Length;i++)

                    {

                      

                        //固定值

                        if (fixeRegex.IsMatch(regItems[i].ToString()))

                        {

                            var result = fixeRegex.Match(regItems[i].ToString()).Groups;

                            sb.Append(result[2].Value);

                        }

     

                        //随机数

                        if (randomRegex.IsMatch(regItems[i].ToString()))

                        {

                            var result = randomRegex.Match(regItems[i].ToString()).Groups;

                            int number = Convert.ToInt32(result[2].Value);

                            sb.Append(GetRandomNumber(number));

                        }

     

                        //之前输入过的测试数据

                        if (expectedRegex.IsMatch(regItems[i].ToString()))

                        {

                            var result = expectedRegex.Match(regItems[i].ToString()).Groups;

                            sb.Append(GetReturnData(result[2].Value));

                        }

                    }

     

                    if(returnRegex.IsMatch(items[1].ToString()))

                    {

                        string name = returnRegex.Match(items[1].ToString()).Groups[1].Value;

                        if(returnData.ContainsKey(name))

                        {

                            returnData.Remove(name);

                        }

                        returnData.Add(name, sb.ToString());

                    }

     

                    return sb.ToString();

                }

                else

                {

                    return commandArgs;

                }

              

            }

     

            /// <summary>

            /// 生成随机数

            /// </summary>

            /// <param name="length"></param>

            /// <returns></returns>

            public static string GetRandomNumber(int length)

            {

                Random random = new Random();

                StringBuilder sb = new StringBuilder();

                for (int i = 0; i < length; i++)

                {

                    sb.Append(random.Next(10).ToString());

     

                }

                return sb.ToString();

            }

     

        }

  • 解决MDAC与xp不兼容问题

    2011-12-02 16:56:43

       使用OLeDB导入Excel,但是自己的机器上总是提示“数据提供程序要求 MDAC”之类的信息,连续搞2天才搞定它。现记录下来以备忘记。

      1.你的机器的mdac的版本确实过低,下载mdac进行安装

      2.机器上mdac的版本不低,但是就是提示版本过低,就是我这种情况,网上的主要解决办法是修复mdac,方法就是到 C:\Windows\Inf 这个目录,去重新安装mdac.inf.具体的可以google。但是我尝试了这个方法,问题依旧。那么,下载一个mdac的检查工具Componet Checker。运行后,会显示当前的mdac版本。然后选择第二项检查,选择对应的分析版本,然后就会出现一系列的分析结果,有mach,nomacht,not found。然后把缺失的文件以及注册表信息补齐就可以了。我是直接导入了别人的注册表信息(很危险的操作)才ok的。

  • KDATFFSRecorder - KDATFFS自动化测试框架中的测试录制工具(原创)

    2011-11-30 14:41:34

     

    本文为作者原创,如需转载请声明作者及出处

     

    前文对KDATFFS框架以及测试执行工具KDATFFSRunner做了简单的介绍,而作为KDATFFS自动化测试框架中的一个组成部分,KDATFFSRecorder是一个测试步骤的录制工具。它同样基于.net framework 3.5,使用C#开发,其中最重要的一个组件就是csEXWB2,官方站点中声称是“The most complete .NET Webbrowser control wrapper”,功能确实强悍。

     KDATFFSRecorder主要具有以下功能:

    -          测试步骤录制

    -          测试步骤添加

    -          验证点添加

    -          支持弹出窗口,弹出JS对话框,Frame框架

    -          支持输出Xpath

    -          导入导出功能

    界面如下:

     

    录制过程中会生成测试步骤的关键字,也就是KDATFFSRunner可以运行的格式。当然测试步骤导出成Excel后,也可以对测试步骤和测试数据进行修改,基于Excel超强的编辑能力,所以无论是KDATFFSRunner,还是KDATFFSRecorder都没有提供测试步骤的修改功能就是这个原因,Excel可以解决一切问题 ^_^

    生成的测试步骤(TestStep):

     

      KDATFFSRecorder支持手动的添加测试步骤和验证点,通过在页面中指定需要的步骤或验证点,指定的元素高亮显示。

     

     支持弹出窗口的脚本录制,以及添加验证点。

     

  • WatiN系列之七 WatiN与Gaillo有个约会(原创)

    2011-11-16 12:12:11

    WatiN与Gaillo有个约会

    本文为作者原创,如需转载请声明作者及出处。

      又有大半年的时间没有来更新51Testing的博客了,开博已经4年多了时间了,博客的文章也就50多篇,实在是少的可怜。其实心中有很多的内容想写,想分享,可一贯的惰性使然,也就成了现在这样了。这大半年的时间,工作生活一如既往的平淡,动车脱轨了,日本地震了,物价上涨了,而作为IT人依然平淡的活着,为加薪高兴,为房子发愁,为孩子操心….. 生活就是如此吧。好了,发了一通的感慨,言归正传,之前我写了一个关于WatiN的系列文章,介绍了WatiN一些使用的基本知识和应用。我在一些项目中也会应用WatiN,感觉这个工具还是不错的,但是要灵活,方便的使用它越是也要花些心思。之前说过,它结合NunitVSTS单元测试工具一起使用,可以增加它的易用性,但总是觉得力有未逮,直到我遇到了Gallio,一切问题都迎刃而解。

     有人要问Gallio是什么?官方的说法是“Gallio自动化测试平台是一个开放、可扩展的中间平台,为 .NET 提供一个通用的测试用的对象模型、运行时服务和工具”。好的,我们注意到了,它是一个自动化测试平台,确切的来说它是一个开放式的单元测试平台,它支持众多的.NET单元测试工具,比如Nunit,CsunitMbunit等等。现在Gallio已经整合了自家的单元测试工具Mbnuit,这同样是一款非常优秀的单元测试工具,具有很多NUnit,MSunit不具备的超强功能,以后我会提到。为什么要选择GallioMbunit呢?这是有原因滴。

      VSTS的单元测试必须依赖Visual Studio这个IDE,运行起来太麻烦,日志功能也薄弱

      Nunit运行起来方便,但是同样的,日志输出不给力,过于简陋,工具功能也太简单。

      Gallio就不一样了,它具有一个非常优秀的Icarus GUI Test Runner工具,也具有一个命令行的工具(有了它,可以进行无人值守的计划任务测试)。而与它配套的Mbunit同样是一款优秀的单元测试工具,除了一般单元测试功能外,它还提供了多种数据源的数据驱动测试功能,日志输出功能,截图和视频功能等等。

     

    下面我们就跟根据一个实例来讲解一下Gallio+WatiN的使用。

    1)首先安装Gallio,可以到Gallio的官方网站下载: http://www.gallio.org/Downloads.aspx

    2)在Visual Studio建立一个类库项目,这里命名“WatiNAndGallio”,然后添加一个类,这里命名“SearchBaidu,添加对于WatiN,Gallio的引用,Gallio直接在添加引用的弹出框中的.NET中找即可。如图

    3)再添加一个类,命名为“BrowserHelper”,这个类里定义了方法,用于截图。

    4)在“SearchBaidu”中编写测试代码,代码如下:

    using System;

    using System.Collections.Generic;

    using System.Text;

    using MbUnit.Framework;

    using MbUnit;

    using Gallio.Framework;

    using Gallio.Framework.Data;

    using WatiN.Core;

    namespace WatiNAndGallio

    {

        [TestFixture]

        public class SearchBaidu

        {

            BrowserHelper bh = new BrowserHelper();

            //使用CsvData数据驱动,Gallio中还包含其他类型的数据驱动,详细参考Gallio的帮助文档

            //Test:不用说了吧,用于标识测试的属性

            //Order:可选,用户表示执行测试的顺序

            //FilePath:文件路径

            //HasHeader:是否有列名行

            [Test(Order = 1), CsvData(FilePath = @"D:\\OpenSource\\WatiNAndGallio\\Data.csv", HasHeader = true)]

            public void SearchSomeThing(string url,string someThing)

            {

     //使用自定义的BrowserHelperConfigureWatiNSettings方法,WatiN的动作进行跟踪,在Log可以看到

                bh.ConfigureWatiNSettings();

                IE ie = new IE(url);

                ie.TextField(Find.ById("kw")).TypeText(someThing);

                ie.Button(Find.ById("su")).Click();

           //输出日志,TestLog类中有很多的方法用于输出不同类型的日志,详细可以参考Gallio的帮助文档

                TestLog.WriteLine(string.Format("完成了\"{0}\"的搜索",someThing));

    //使用自定义的BrowserHelperEmbedBrowserSnapshot方法,对浏览器内的内容进行截图,在Log可以看到

                bh.EmbedBrowserSnapshot(someThing,ie);

            }

        }

    }

    5) 对这个类型进行编译后,打开GallioIcarus GUI Test Runner工具,加载编译的这个DLL,如图

     

    它是按照在Visual Studio中的目录结构进行显示的,最底层的一级就是Test,你可以勾选以用来选择你希望运行的测试。

     

    6)这时,我们就可以点击Start,运行测试了,运行后会自动显示日志和测试结果,报告统计和写的很详细,更好的是这些报告可以导出多种格式,如图

    测试结果

    测试执行日志

     

     

    就这样,一个测试就完成了,其实步骤和原理与NUnit,VSTS都是差不多了的,只不过Gallio提供了一些更为人性化的强大功能。

     在本文的最后的附件里有这个事例的源代码,有兴趣的可以下载下来研究一下。由于大小的原因,引用的WatiN,Gallio类库都被删除了,需要自己重新引用。

    WatiNAndGallio.rar(16.9 KB)

791/41234>
Open Toolbar