JS自动化测试 单元测试之Qunit

前言

因为公司开发了一套javascript SDK需要测试,在网上找了很久,找到了JQuery团队开发的QUnit,和基于JUnit的JsUnit,还有一些还没有看,先讲讲QUnit吧

下载

登录JQuery官网http://qunitjs.com/直接首页右边可以下载最新版本的QUnit。

或者直接点击下载qunit-1.16.0.js,使用QUnit还需要下载官方css文件。下载地址qunit-1.16.0.css

使用QUnit前提条件

1、需要引用qunit-1.16.0.js和qunit-1.16.0.css,有人会问,css可以不引用吗,答案是不行。展示执行用例结果的样式,需要css来显示。

2、需要在body标签中加入两行HTML代码,id属性不能去掉的哦~

<div id="qunit"></div>
<div id="qunit-fixture"></div>

3、需要写一个js用于测试。这里随便写了一个user.js 有登录登出和判断用户名是否存在的方法。引用这个user.js

贴出user.js代码

// JavaScript Document
// 创建user类
var user={
    ///登录 userName:用户名  userPwd:密码
     login:function(userName,userPwd){
          return userName+userPwd;
         },
     ///退出 返回1为成功 返回0为失败
     logout:function(){
         ///省去登出代码
          return "1";
        },
     getUser:function(){
         return {userName:‘‘,userPwd:‘‘};
         },
      ///判断用户名是否存在 返回1存在 返回0不存在
      ///测试异步操作  需要提供一个回调函数 用于延迟加载
      existUserName:function(userName,callBack){
         setTimeout(function(){
             var state =0;
             if (userName==‘milan‘){
                   state= 1;
                  }
             else{
                    state= 0;
                   }
             if (callBack){
                     callBack(state);
                }
              },1000);
         }
          ,
        callback:null,
        existUserName2:function(userName){
            setTimeout(function(){
             var state =0;
             if (userName==‘milan‘){
                   state= 1;
                  }
             else{
                    state= 0;
                   }
             if (user.callback){
                     user.callback(state);
                }
              },1000);
          }
    };

使用QUnit

1、test :所有用例必须在test方法中执行,表示一个测试用例,一般一个用例有N个断言。

///测试登录
test(‘user.login‘,function(){
    equal(user.login(‘milan‘,‘123‘),‘milan123‘,"登录测试");
})

运行结果

2、断言函数

  1. ok( result, message)断言返回值为true/false
  2. equal( actual, expected, message )actual为实际值、expected为预期值;浅对比,判断实际值是否与预期值相等。相当于==
  3. propEqual( actual, expected, message )用于判断对象和值是否相等
  4. deepEqual( actual, expected, message )深对比,用于判断两个值类型和值是否相等,相当于===
  5. 以上2、3、4条分别提供了功能相反的函数 notEqual、notPropEqual、notDeepEqual。参数跟2、3、4条是一样的。

大家也可以在qunit-1.16.0.js的源代码中搜索“notPropEqual”(或者其他函数名称),搜索到同级函数都是QUnit提供的断言函数,可以方便大家查看及扩展。 如下图:

3、使用断言函数

楼主一般喜欢一个接口一个测试用例,当然每个人的习惯不一样。不能一概而论,反正只要做到清晰易读就可以啦!

///登出测试
test(‘user.logout‘,function(){
 ok(user.logout()==1,"登出测试ok");
 //验证实际值不等于断言值为正确,这里实际是相等的,所以是错的
 notEqual(user.logout()==1,true,"登出测试notEqual");
 //验证实际值等于断言值
 equal(user.logout()==1,true,"登出测试notEqual");
 //验证返回值是否同类型同值
 deepEqual(user.logout(),1,"登出测试deepEqual");
});
///获取用户信息测试
test("user.getUser",function(){
 ///判断两个对象是否相等 此方法 不适用于判断基本的数值或者字符串
 propEqual(user.getUser(),{"userName": "12","userPwd": ""},"登出测试propEqual");
 ///判断是否不相等,不相等为通过
 notPropEqual(user.getUser(),{"userName": "12","userPwd": ""},"登出测试propEqual");
});

执行结果如图:

4、QUnit实现异步测试

大家都知道,要测试接口/方法,必须等到接口的返回值,才能测试,如果没有返回值,我们也不知道结果对不对啦。

所以异步测试一般有两种办法:一种是把回调当作参数传入方法中;二是开发者提供一个变量,我们可以把回调函数赋值给变量;等异步处理完毕之后再执行我们写的回调函数

这里我们用setTimeout来模拟异步延迟返回操作。

用例代码:

//模块化
module("异步测试");
///方法一  回调用参数的方式传入   异步测试
user.existUserName(‘milan‘,function(result){
  ///注意啦 这里是先调方法,再写用例哦。
  test("user.existUserName",function(){
    ok(result==1,"判断用户名是否存在ok");
    notEqual(result==1,true,"判断用户名是否存在notEqual");
  });
});
//方法二 回调用内置变量赋值的方式传入 异步测试
user.callback=function(result){
 test("user.existUserName2",function(){
    ok(result==1,"判断用户名是否存在ok");
    notEqual(result==1,true,"判断用户名是否存在notEqual");
  });
};
user.existUserName2(‘milan‘);

测试结果:

5、模块化

在上面的异步测试中,我们看到每个用例的开头都多了“异步测试”这几个字。那么这几个字是怎么来的呢?

很多时候,要测试的用例过多,我们也会眼花缭乱了。QUnit提供module("模块名称")来实现用例分组。

使用方法直接放在要模块化的地方就行啦。参照第4接异步测试的代码和结果

贴出教程所有html的代码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title>

<link rel="stylesheet" href="../../qunit/qunit-1.16.0.css">
<script src="../../qunit/qunit-1.16.0.js"></script>
<script src="user.js"></script>

</head>
<body>
<div id="qunit"></div>
<div id="qunit-fixture"></div>

<script type="text/javascript" language="javascript">
///测试登录
test(‘user.login‘,function(){
    equal(user.login(‘milan‘,‘123‘),‘milan123‘,"登录测试");

})
//模块测试
module("基本测试");
///登出测试
test(‘user.logout‘,function(){
 ok(user.logout()==1,"登出测试ok");
 //验证实际值不等于断言值为正确,这里实际是相等的,所以是错的
 notEqual(user.logout()==1,true,"登出测试notEqual");
 //验证实际值等于断言值
 equal(user.logout()==1,true,"登出测试notEqual");
 //验证返回值是否同类型同值
 deepEqual(user.logout(),1,"登出测试deepEqual");
});
///获取用户信息测试
test("user.getUser",function(){
 ///判断两个对象是否相等 不适用于判断基本的数值或者字符串
 propEqual(user.getUser(),{"userName": "12","userPwd": ""},"登出测试propEqual");
 ///判断是否不相等,不相等为通过
 notPropEqual(user.getUser(),{"userName": "12","userPwd": ""},"登出测试propEqual");
});
//模块化
module("异步测试");
///回调用参数的方式传入   异步测试
user.existUserName(‘milan‘,function(result){
  ///注意啦 这里是先调方法,再写用例哦。
  test("user.existUserName",function(){
    ok(result==1,"判断用户名是否存在ok");
    notEqual(result==1,true,"判断用户名是否存在notEqual");
  });
});
//回调用内置变量赋值的方式传入 异步测试
user.callback=function(result){
 test("user.existUserName2",function(){
    ok(result==1,"判断用户名是否存在ok");
    notEqual(result==1,true,"判断用户名是否存在notEqual");
  });
};
user.existUserName2(‘milan‘);

</script>

</body>
</html>

结论

在很多时候,我们不可能把每一种方法都讲到极致,没有讲到的,还需要大家多多去试一试。第一次写博客,写得不好,有什么建议或者问题,都可以在下面回复。楼主会在看到后第一时间解决的。谢谢!

时间: 2024-10-10 08:15:12

JS自动化测试 单元测试之Qunit的相关文章

Javascript单元测试之QUnit

首先去Qunit官网下载. Qunit有一个js脚本文件和一个css我们在页面中引入它. <script src="qunit-2.0.1.js"></script> <link rel="stylesheet" href="qunit-2.0.1.css"> 页面中有两段必须的标签. <div id="qunit"></div> <div id="q

单元测试之道(使用NUnit)

首先来看下面几个场景你是否熟悉 1.你正在开发一个系统,你不断地编码-编译-调试-编码-编译-调试……终于,你负责的功能模块从上到下全部完成且编译通过!你长出一口气,怀着激动而 又忐忑的心情点击界面上的按钮,顿时你刚刚的轻松感烟消云散:系统无法正常工作,你想读的数据显示不出来,你想存的东西也送不到数据库……于是,你再次回 到IDE里,设断点.调试.一层一层跟踪,当你精疲力尽终于将数据送到数据库里,你又发现了其它问题,于是你继续设断点.调试.编译.调试…… 2.你狂躁地敲击着键盘和鼠标,咒骂着不断

论单元测试之重要性

单元测试的重要性不言而喻,自我开发生涯以来,从很少注释过过场场,到非常重视. 单元测试为什么会让人忽视呢? 通常情况像一些查询或者增删改之类,拿我来说,即便报错我大概一扫,我就知道错误是什么了,该如何排查,因为就拿SpringMVC来说或者MyBatis等,再不济就是Spring的依赖注入问题,拿MyBatis来说,要么就是sql问题,要么就是参数问题,再不济就是与Spring动态扫描有关或者是mybatis中专门写sql的配置文件某个地方语法错误等,这些错误都是可预见的,说句不好听的话,再不济

python单元测试之unittest框架

python单元测试之unittest框架 一.什么是单元测试 单元测试是用来对一个模块.一个函数或者一个类来进行正确性检验的测试工作. 比如对于函数abs(),我们可以编写的测试用例为: (1)输入正数,比如1.1.2.0.99,期待返回值与输入相同 (2)输入复数,比如-1.-1.2.-0.99,期待返回值与输入相反 (3)输入0,期待返回0 (4)输入非数值类型,比如None.[].{}.期待抛出TypeError 把上面这些测试用例放到一个测试模块里,就是一个完整的单元测试 我们先写一个

.NET 单元测试的艺术&amp;单元测试之道C#版

目录 1.单元测试概念 2.单元测试的原则 3.单元测试简单示例 4.单元测试框架特性标签 5.单元测试中的断言Assert 6.单元测试中验证预期的异常 7.单元测试中针对状态的间接测试 8.单元测试在MVC模式中的实现 8.单元测试相关参考 9.示例源代码下载 志铭-2020年1月23日 11:49:41 1.单元测试概念 什么是单元测试? 单元测试(unit testing)是一段自动化的代码,用来调用被测试的方法或类,而后验证基于该方法或类的逻辑行为的一些假设. 简而言之说:单元测试是一

单元测试之Stub和Mock

单元测试之Stub和Mock FROM:http://www.cnblogs.com/TankXiao/archive/2012/03/06/2366073.html 在做单元测试的时候,我们会发现我们要测试的方法会引用很多外部依赖的对象,比如:(发送邮件,网络通讯,记录Log, 文件系统 之类的). 而我们没法控制这些外部依赖的对象.  为了解决这个问题,我们需要用到Stub和Mock来模拟这些外部依赖的对象,从而控制它们 阅读目录 实例 设计测试用例 什么是外部依赖 Stub和Mock的相同

谈谈单元测试之(四):测试工具 TestNG

前言 上一篇文章<测试工具 JUnit 4>中提到了 JUnit 4,并对 JUnit 4 做了简单的讨论,这篇文章我们将要围绕另一款测试工具讨论 -- TestNG.其实,这篇文章应该写在<测试工具 JUnit 3>之后,和<测试工具 JUnit 4>之前,为什么这么说呢? 那是因为,TestNG 是在 JUnit 3 之后出来了,而 JUnit 4 是在 TestNG 推出之后,综合 JUnit 3 的优点,并且借鉴了 TestNG 的优势,才推出的.但是,考虑到,

谈谈单元测试之(三):测试工具 JUnit 4

前言 上一篇文章<测试工具 JUnit 3>简单的讨论了 JUnit 3 的使用以及内部的方法.这篇文章将会在 JUnit 3 的基础上,讨论一下 JUnit 4 的新特性.同时,与 JUnit 3 做一个简单的对比.那么,废话就不多说了,直接进入正题. 介绍 JUnit 4.x 是利用了 Java 5 的特性(Annotation)的优势,使得测试比起 3.x 版本更加的方便简单,JUnit 4.x 不是旧版本的简单升级,它是一个全新的框架,整个框架的包结构已经彻底改变,但 4.x 版本仍然

单元测试之测试方法

单元测试面临的困难 职责不明确 类或者方法的职责不明确,违反了SRP原则. 类/方法如果处理了本不该它处理的逻辑,会造成单元测试需要关心过多的外部关联类. 静态方法 静态方法使得调用者直接面对实际的服务类,难以通过其它方式替代其实现,也难以扩展. 直接访问对象实例 调用者直接实例化服务对象,从而使用服务对象提供的服务.同静态方法一样,调用者直接面对服务类. 标准库 标准库中有非常多的接口调用使得调用者难以被测试. 准备数据 编写测试用例需要外部准备大量的数据. 可行的解决方案 重构系统 对于职责