前端自动化测试工具doh学习总结(一)

 前言

  项目中需要用到前端自动化测试,自己被当作一个探针研究了下目前用的比较多的web自动化测试工具。一开始研究的是的selenium,但由于项目使用了大量的dijit控件,写起testCase来很费劲;最主要的是selenium有严重的浏览器兼容性问题,于是彻底放弃,改投doh门下,毕竟是dojo他爸爸开发的跟dojo继承起来非常方便。这几篇主要介绍doh、doh/Robot以及将doh与selenium结合进而与CI工具集成起来。

  一、DOH 是什么

  DOH 是 Dojo Objective Harness 的简称,是 Dojo 在 0.9 版本之后新增的单元测试工具。随着 Javascript 代码的数量和复杂度的增加,Web 前端开发者也需要一个 Javascript 代码的单元测试框架来保证自己写出来的 Javascript 代码是健壮的。所以,DOH 是 Web 前端开发者对 JUnit 的回应。DOH有如下特点:

  1. 提供用户界面:JUnit中的红条测试失败、绿条测试通过,大家都已经很熟悉了,DOH也有类似的用户界面,用户在测试时更加一目了然;
  2. 平台无关:DOH并不依赖某种浏览器平台,甚至不依赖于浏览器;用户可以根据自己的需要在命令行进行Javascript的自动化单元测试;
  3. 支持Ajax:Ajax编程在Web前端开发中是必不可少的一环,DOH最有价值的一个特性就是支持Ajax的测试;
  4. 不只适合与于Dojo,可用于任何JavaScript程序的单元测试。

  下载dojo源码包,解压后可以看到以下目录:

  

  二、DOH第一次亲密接触

  部署到服务器后,我们访问runner.html

    

  与JUnit类似,DOH也为我们提供了一个类似的界面,左侧表示运行的测试案例,右侧是测试日志,最上方的进度条表示的是本次运行中的已执行案例,同样绿色表示成功,红色表示失败。默认情况下会加载“dojo/tests/module.js”文件,该文件的作用就是像runner.html中加载dojo所有核心模块的测试案例。

  

  如果想要单独加载某一模块的测试案例,需要用到test参数指向该模块:

http://<server>/util/doh/runner.html?test=dojo/tests/fx

  

  我们可以吧测试案例放到自己的项目目录下,通过test参数指向自定义测试模块,这时需要用到paths参数:

 util/doh/runner.html?paths=org/myorg,../../../mycode/org/myorg&test=org/myorg/mymodule/tests/alltests

 paths参数中逗号前后的值相当于dojoConfig定义packages对象时的name和location    

  

  同样在path中我们可以定义多个模块, 模块之间用“;”分隔开来

util/doh/runner.html?paths=org/myorg,../../../mycode/org/myorg;com/mycom,../../../x/com/mycom&test=com/mycom/tests

doh中测试模块要么是一个用来请求多个测试文件的文件,要么是一个使用doh.register方法注册时测试案例,或者两者皆有。

define([
    "my/test/widget/Foo0",
    "my/test/widget/Foo1",
    "my/test/widget/Foo2"
]);

或者

define(["doh/runner"], function(doh){

    doh.register("MyTests", [
      function assertTrueTest(){
        doh.assertTrue(true);
        doh.assertTrue(1);
        doh.assertTrue(!false);
      },
      {
        name: "thingerTest",
        setUp: function(){
          this.thingerToTest = new Thinger();
          this.thingerToTest.doStuffToInit();
        },
        runTest: function(){
          doh.assertEqual("blah", this.thingerToTest.blahProp);
          doh.assertFalse(this.thingerToTest.falseProp);
          // ...
        },
        tearDown: function(){
        }
      },
      // ...
    ]);

});

  三、测试用例

  doh为我们提供了以下断言函数:

doh.assertTrue(boolean)
Note: This function is aliased to doh.t();

doh.assertFalse(boolean)
Note: This function is aliased to doh.f();

doh.assertEqual(obj1, obj2)
Note: This function is aliased to doh.is();

doh.assertNotEqual(obj1, obj2)
Note: This function is aliased to doh.isNot();

  Junit中,编写一个测试用例我们需要继承Junit类,同样在doh中也有自己的规则来将一段代码,包装成doh可识别的测试案例。

  doh中主要提供了以下方法(最常用的就是doh.register):

doh.register(...)
An almost 'magical' function. The doh.register() method accepts the function signatures of any of the other registration functions and determines the correct underlying function (listed below) to dispatch registration to. It's the function you'll most commonly use for registering Unit Tests.

doh.registerTest(group, testFuncOrObj)
This function registers a test as a member of the group 'group', and the test can either be a simple function definition or a 'Test Fixture', which is an object that defines the run requirements of the test.

doh.registerTests(group, testFuncOrObjArr)
This function registers an array of tests as a member of the group 'group'. The contents of the array of tests can be an array of simple test functions or an array of 'test fixtures', or a mix of them.

doh.registerTestNs(group, obj)
This function registers an object comprised of functions as a member of the group 'group'. Note that this function will only add in non-private (functions without an _ at the beginning of the name), as a test function. If you'd like to use fixtures (setUp(), tearDown(), and runTest()), please use doh.register(), doh.registerTest() or doh.registerTests().

doh.registerTestUrl(url)
This function registers a URL as a location to load tests from. The URL is used to populate the contents of an iframe, and usually refers to an HTML page that boot-loads D.O.H. internally for running tests in a segmented iframe. A good example showing this is the dojo/tests/fx.html. It loads dojo, doh, and then on dojo load completion calls doh.registerTests(). The D.O.H. instance in the iframe will proxy back the results of the test run to the primary D.O.H. instance.

上面提到的dojo/test/fx模块中我们可以看到该文件中主要定义了两个TestSuite:

define(["doh/main", "require"], function(doh, require){
    if(doh.isBrowser){
        doh.register("tests.fx", require.toUrl("./fx.html"), 30000);
        doh.register("tests.NodeList-fx", require.toUrl("./NodeList-fx.html"), 30000);
    }
});

 对应于runner.html中

  

  打开该目录下的fx.html文件,我们可以看到该文件中定义了一系列TestCase

  

  doh中有两种测试结构:

  1、Simple Tests  将一个单独的函数放到doh.register参数testCase数组里

  同步形式:

function mySimpleTest(doh){
  doh.assertTrue(true);
}

异步形式:

function mySimpleAsyncTest(doh){
  var deferred = new doh.Deferred();
  setTimeout(deferred.getTestCallback(function(){
      doh.assertTrue(true);
  }), 100);
  return deferred;
}

2、Test Fixture

  同步形式:

{
  name: "thingerTest",
  setUp: function(){
    // Setup to do before runTest.//类似于JUnit中的@beforeTest
    this.thingerToTest = new Thinger();
    this.thingerToTest.doStuffToInit();
  },
  runTest: function(){
    // Our test function to run.//类似于JUnit中的@Test
    doh.assertEqual("blah", this.thingerToTest.blahProp);
    doh.assertFalse(this.thingerToTest.falseProp);
    // ...
  },
  tearDown: function(){
    // cleanup to do after runTest.//类似于JUnit中的@afterTest
  },
  timeout: 3000 // 3 second timeout.//测试运行时间,超过改时间会报错
}

异步形式:

{
  name: "thingerTest",
  setUp: function(){
    // Setup to do before runTest.
    this.thingerToTest = new Thinger();
    this.thingerToTest.doStuffToInit();
  },
  runTest: function(){
    // Our test function to run.
    var deferred = new doh.Deferred();
    setTimeout(deferred.getTestCallback(function(){
        doh.assertEqual("blah", this.thingerToTest.blahProp);
        doh.assertFalse(this.thingerToTest.falseProp);
    }), 100);
    return deferred;
  },
  tearDown: function(){
    // cleanup to do after runTest.
  },
  timeout: 3000 // 3 second timeout.
}

参考资料:

http://www.infoq.com/cn/articles/dojo-unit-test-DOH/

http://tech.ddvip.com/2010-04/1271148731150772_2.html

时间: 2025-01-28 04:35:49

前端自动化测试工具doh学习总结(一)的相关文章

前端自动化测试工具doh学习总结(二)

一.robot简介 robot是dojo框架中用来进行前端自动化测试的工具,doh主要目的在于单元测试,而robot可以用来模仿用户操作来测试UI.总所周知,Selenium也是一款比较流行的前端自动化测试工具,与Selenium相比robot的优点在于robot触发的浏览器事件是真正的用户操作事件,而Selenium中的事件属于"合成事件".打个比方,用户在一个textbox元素上触发了mousedown事件,但是在触发mousedown事件之前,肯定会触发mouseover等事件.

[Maven + Gem]为大型企业打造自动化测试工具

一. 目的与区别 我曾在2010年在国内知名搜索引擎服务商公司工作,主要负责网页前端自动化测试工具的开发,我们当时的做法已经其实和现在网页自动化测试方法基本一致,即在watir和watir-webdriver上开发一套自己的封装层,但当时没有引入cucumber做BDD, 而是让其他测试人员直接编写RUBY脚本,require我们制做的封装层,其实理论上讲,只是没有打包成gem,也没有进行测试. 在此过程中遇到的最大的困难就是将我们的封装层部署到每个测试人员的计算机中,并可以指导每个测试人员编写

跨平台的应用开发工具和前端开发工具

文章描述:前端开发者的跨平台移动应用开发策略及工具. 愉悦的周五,早些回到家,冲澡吃饭照顾猫咪家务完毕已然超过九点的样子.登录博客后台,进入编辑页面,才觉得些许轻松安逸.不坏,一天里能有这么一会沉浸在这样的感觉里,足够了. 在之前的一篇文章中,我们曾经讨论过,对于交互和视觉设计相关职能的从业人员来说,从传统Web行业向移动应用领域转型的过程中需要学习和注意的问题.这篇文章中提到过"混合型应用"的概念,以及与之相关的两本开发指导书籍.今天这篇文章的英文原文,就是来自这两本书的作者--移动

前端构建工具gulp使用

前端自动化流程工具,用来合并文件,压缩等. Gulp官网 http://gulpjs.com/ Gulp中文网 http://www.gulpjs.com.cn/ Gulp中文文档 https://github.com/lisposter/gulp-docs-zh-cn Gulp插件网 http://gulpjs.com/plugins/ Awesome Gulp https://github.com/alferov/awesome-gulp StuQ-Gulp实战和原理解析 http://i5

svg-Watin自动化测试工具触发image的click事件

问题描述 Watin自动化测试工具触发image的click事件 最近用watin这个自动化测试工具做系统的功能测试,有一个地方是:watin获取svg的子节点image,并且触发click事件.已经使用过jQuery选择器和eval方式,都未能实现,求大牛帮忙看看.谢谢啦! html: 相关文章 selected-OnItemClickListener与OnItemSelectedListener区别 aspx-Ext.net的ext.button点击事件的触发顺序 如何通过JS代码触发cli

阿里云前端工程化工具 - Dawn

一.Dawn 简介 Dawn(后续将简称为 DN)是阿里云前端团队,新一代的前端构建工具,简化并统一了针对开发人员的「命令行接口」,将开发过程抽象为有序的 6 个阶段 + 1 个常用操作.不会因为工具本身的扩展,而扩展新的用法,统一.一致,免于记忆,通过 DN 创建的工程还将会结合 GitLab CI 进行持续集成. DN 相较于同类工具的特点是什么? 简单.统一.一致,无论扩展还是使用它. 无关框架.甚至可以无关语言.轻中心化(并非完全去中心化,而是「轻」) 松散且易于整合,注重重用,易于扩展

手机UI自动化测试工具NativeDriver VS Robotium

最近在调研手机端的自动化测试工具,之前看到了Robotium这个工具也写了几个用例,后面发现了NativeDriver工具,也写了几个 例子,下面主要从官方介绍以及写例子的过程中发现的一些问题对比一下两种工具的优缺点吧,也是刚开始做自动化测试不久,暂时还没有了解工具底层的一些东 西,以下仅是自己个人观点,如果有不全面的欢迎大家评论补充讨论.现在打算使用NativeDriver工具来进行手机端UI自动测试. NativeDriver: 官方地址:http://code.google.com/p/n

《手机测试Robotium实战教程》—第1章 1.3节移动端自动化测试工具的选择

1.3 移动端自动化测试工具的选择 之所以需要选择,是因为可选项太多了,不同的平台,会有很多不同的自动化测试工具供选择,其中既有商业性的收费工具,也有开源免费的自动化测试工具. 这本书的主题Robotium就是其中一种开源的自动化测试框架,在正式展开前,先看看当下还有哪些在Android测试方面比较常用的测试框架可供选择. 1.3.1 Appium Appium也是一种自动化测试框架,可以用来测试natvie.hybrid和mobile web APP,Appium最吸引人的一点是,它既支持An

2017年前端开发工具趋势

本文来源于全球的5254份前端工具使用的调查报告,期望通过本文能够帮助大家更好的了解最新的前端开发工具趋势. 受访者组成 83%的受访者具有两年以上的前端技术经验,只有5%的受访者不到一年: CSS 开发者中有63%为高级开发者和专家: 尽管CSS被认为只是属性-参数值对的简单集合,但是CSS却是很难掌握的.CSS3引入了许多的新特性,要想完全的掌握CSS变得越来越困难. 如果你想学习前端可以来这个群,首先是二九一,中间是八五一,最后是一八九,里面可以学习交流也有资料可以下载. CSS预处理器