发布新日志

  • 基于selenium测试框架设计之MVC模式 2

    2013-06-24 18:03:00

    测试控制(control)从大的来讲就是测试用例结构流程的控制,从小的来讲就是如何驱动测试的展开
    selenium测试通常和单元测试框架整合,比如在java上就是junit或者testng。单元测试框架的作用就是控制测试执行的策略。testng相较junit提供更多的控制方式,比如组策略,类控制等,这种灵活的机制很大程度地扩展了我们设计执行框架的空间。
    有时我们要执行所有回归测试用例,但更多的时候执行部分。最简单的办法是把要测试的类列在testng配置文件里,然后按类执行。有时候我们需要的测试用例混杂在不同的类里边,那组策略就比较合适了。
    在设计测试结构时有个重要的因素时测试的依赖性。适度的依赖性可以提升测试效率,但是牺牲测试独立性。比如登陆和浏览是两个用例。登陆是浏览的前提用例。我们来看一下两种不同的设计方式
    一:
    测试准备-》登陆-》浏览-》测试关闭

    二:
    测试准备-》登陆-》测试关闭-》测试准备-》登陆-》浏览-》测试关闭

    方式一的好处是减少了测试时间,方式二的好处两个用例可以独立执行,但是重复代码多,设计要求高。

    测试准备-》登陆-》测试关闭
    测试准备-》登陆-》浏览-》测试关闭
    当测试用例完全独立的时候我们可以采用并发的方式缩短测试时间。但是实际情况中这种依赖性很难完全消除,还有些约束条件要考虑,比如A先完成和B先完成可能将导致不同的结果。所以在设计的时候就要充分考虑这些情况以保证选择性测试可以实现。
    单个测试用例独立性集中体现在手工测试和自动测试的集成。有些集成管理工具比如QC允许测试人员启动单个自动测试脚本并传回结果。在testng框架下充分利用不同层级的setup和teardown可以很大程度提升测试的独立性。

    下面谈一下测试的驱动模式。常见的是关键字驱动和数据驱动。还有事件驱动,即测试的顺序由事件的发生顺序而确定,而行为驱动可以看作是事件驱动的一种特例。基于selenium的框架用于web测试,因此关键字驱动是最直观也是最重要的驱动方式。

    设计测试过程的时候最重要的原则是可读性。个人一直认为测试代码的设计和应用程序代码的设计原则是不同的。应用程序注重的外部行为,即人们只关心这个接口能做些什么,确不关心内部到底怎么做的。测试代码则不同,读代码的人非常需要了解内部细节和步骤是的实现。所以测试脚本更具有面向过程而不是面向对象的本质(所以我们称之为脚本)。人对过程的理解相当程度是线性的,所以要尽量减少代码的分支和跳转。重复代码在一定程度上是可接受的,条件是增加可读性。方法的封装要适度。比较理想的是代码语句和手工测试用例步骤相呼应。尽管精巧的命名可以大大提升可读性,测试代码注释行的量仍然应当比应用程序代码多得多。
  • 基于selenium测试框架设计之MVC模式

    2013-06-20 19:46:38

    这里只是借用MVC这个名字,其实和web应用的mvc模式不是一个概念

    M是model,就是数据模型,从测试来讲包含测试数据和测试对象数据。
    -测试数据管理。在数据驱动的场景下可能要用到大量测试数据,可以是随机或特定约束下生成的,或者从外部导入。无论哪种都需要支持类和方法来生成,存储,操纵或转换。
    测试数据的格式常见的有csv,xml,excel,数据库等。在java里配置数据一般存在xml或者properties文件,便于读取和管理,而大量的数据纪录则用csv比较经济。数据结构来讲映射到对象比多维数组更便于检索,但开销也大一些。
    数据库存测试数据增加了依赖性,但是方便复杂的查询。各种结构可谓各有利弊,从个人实践上讲csv是最常用的输入输出格式,其中一个重要因素是csv转换excel非常方便。

    -测试对象数据。QTP有动态和静态对象库的概念。这种机制有利于脚本的维护,完全可以借鉴到我们自己的框架设计体系中来。selenium里可以标示网页对象的是Locator,webdriver里是By。类型不外乎name,id,class,xpath,jquery locator等,描述方式接近于QTP的描述性标示。Terrillium 框架采用了groovy混合编程,就是利用了脚本语言在描述层次对象上的灵活性。假如用java实现的话也可以用递归的方式来检查组合对象,比如表单。表单对象有若干子对象,比如输入框,提交按钮,下拉框等。一个一个对象检查有些累赘,改进后伪代码如下
    checkCombObject(WebObject object){
    if(object.hasChildren()){
    for(Object obj : object.allChildren){
    checkCombObject(obj);
    }
    }
    assertObjectMatch(expectedObj, object);
    这样一行代码就可以检查整个表单
    checkCombObject(webForm);

    先写到这里,下次再写V(View)和C(Control)
  • 自动化测试 双线开发

    2013-06-19 16:48:20

    总结一下这几年来自动化测试管理的经验,觉得比较有价值的一条就是双线开发。其实都是些显而易见的 东西,也谈不上是创新,但是这样实践的貌似不多
    一条线是框架和可重用过程库的开发,另一条就是测试脚本的开发
    有一个很深的感触就是设计良好的测试框架能大大提升脚本开发的效率和降低维护难度,然而测试人员往往不具备这样的 设计能力。框架开发更合适由SA和开发人员设计完成,具备优良的接口设计,定期发布。而自动化测试人员则专注于脚本开发。这样能达到人力配置的最大优化。

Open Toolbar