karma配好之后,默认使用的是jasmine作为测试框架: frameworks: ['jasmine']。
jasmine是基于BDD模式的测试框架,详细介绍请上网查看,在此我们直接进入实战。
本文以jasmine1.3为例,因为最新版的Karma v0.12.9 使用的为jasmine1.3。
参考文档:http://jasmine.github.io/1.3/introduction.html
jasmine测试用例的书写格式:
可用的匹配器:
测试用例的前置和后置函数
http://powertech.iteye.com/blog/2065922
beforeEach afterEach
探测器:探测函数的执行过程,以及动态修改
函数的参数和返回值。
http://powertech.iteye.com/blog/2065922
探测器的类型:
http://powertech.iteye.com/blog/2065922
andCallThrough 监听函数的执行过程。
andReturn:伪造函数的返回值,一般用来在测试用例执行前
为测试用例提前配置好测试环境,减少函数间的依赖。
andCallFake:伪造函数的调用过程。
createSpy:请查看原文档
createSpyObj:请查看原文档
测试用例的同步代码支持:
在测试的时候,有时我们需要某个测试执行时,等待5秒钟之后再开始,
或者满足某个条件后才开始,比如,执行用户管理测试,需要先调用
登录代码后,等待1秒再开始其它测试。
用于序列化执行的的代码块,多个runs块按顺序执行。
waits(毫秒),执行完此函数,会引起等待,等待结束然后再执行下一个runs代码块或下一个
it测试用例
waitsFor代码块在5000毫秒内返回true,则执行下一下runs块
如果在5000毫秒内不能返回true,则测试用例失败,不再执行下一个runs代码块。
实例:
和karma的配合
http://powertech.iteye.com/blog/2065922
karma默认每个包含的文件,都是用<script src="my.js"></script>这种格式包含进一个HTML文档里。
console.log($(document))即可看到:
文件的加载顺序和配置顺序是一样的。
所以可以写一些前置的测试用例,用来初始化测试环境,比如设置登录用户,预加载页面内容
伪造服务器响应,修改服务器地址,设置全局变量,使用waits等待加载等。
当这些测试用测跑完,相当于走了一个初始化过程,再开始其它的测试用例,会省去很多重
复代码。
如:
作完这些操作后,其它的测试用例跑起来很方便。
karma里测试文件的加载方式:
http://powertech.iteye.com/blog/2065922
默认情况下,所有文件都使用<script>标签直接加载到浏览器里,后台相当于存在一个小服务器。也可以将文件加载到服务器,在地址档访问,或Ajax加载。
jasmine是基于BDD模式的测试框架,详细介绍请上网查看,在此我们直接进入实战。
本文以jasmine1.3为例,因为最新版的Karma v0.12.9 使用的为jasmine1.3。
参考文档:http://jasmine.github.io/1.3/introduction.html
jasmine测试用例的书写格式:
describe("用户登录功能", function() { it("密码验证", function() { expect(true).toBe(true); }); it("重复密码", function() { expect(true).toBe(true); }); it("登录事件", function() { expect(true).toBe(true); }); it("登录界面", function() { expect(true).toBe(true); }); }); //测试套件的嵌套 describe("用户管理", function() { describe("用户登录功能", function() { it("密码验证", function() { expect(true).toBe(true); }); it("重复密码", function() { expect(true).toBe(true); }); it("登录事件", function() { expect(true).toBe(true); }); it("登录界面", function() { expect(true).toBe(true); }); }); });
可用的匹配器:
expect(true).toBe(true); expect(false).not.toBe(true); expect(a).toEqual(12); expect(message).toMatch(/bar/); expect(message).toMatch('bar'); expect(message).not.toMatch(/quux/); expect(a.foo).toBeDefined(); expect(a.bar).not.toBeDefined(); expect(a.foo).not.toBeUndefined(); expect(a.bar).toBeUndefined(); expect(null).toBeNull(); expect(a).toBeNull(); expect(foo).not.toBeNull(); expect(foo).toBeTruthy(); expect(a).not.toBeTruthy(); expect(a).toBeFalsy(); expect(foo).not.toBeFalsy(); expect(a).toContain('bar'); expect(a).not.toContain('quux'); expect(e).toBeLessThan(pi); expect(pi).not.toBeLessThan(e); expect(pi).toBeGreaterThan(e); expect(e).not.toBeGreaterThan(pi); expect(pi).not.toBeCloseTo(e, 2); expect(pi).toBeCloseTo(e, 0); expect(foo).not.toThrow(); expect(bar).toThrow();
测试用例的前置和后置函数
http://powertech.iteye.com/blog/2065922
beforeEach afterEach
describe("用户登录功能", function() { beforeEach(function(){ console.log('前置函数,下面的每个测试用例之前执行一次'); }); afterEach(function(){ console.log('前置函数,下面的每个测试用例之后执行一次'); }); it("密码验证", function() { expect(true).toBe(true); }); it("重复密码", function() { expect(true).toBe(true); }); it("登录事件", function() { expect(true).toBe(true); }); it("登录界面", function() { expect(true).toBe(true); }); });
探测器:探测函数的执行过程,以及动态修改
函数的参数和返回值。
http://powertech.iteye.com/blog/2065922
describe("A spy", function() { var foo, bar = null; beforeEach(function() { foo = { setBar: function(value) { bar = value; } }; spyOn(foo, 'setBar'); foo.setBar(123); foo.setBar(456, 'another param'); }); it("tracks that the spy was called", function() { expect(foo.setBar).toHaveBeenCalled(); }); it("tracks its number of calls", function() { expect(foo.setBar.calls.length).toEqual(2); }); it("tracks all the arguments of its calls", function() { expect(foo.setBar).toHaveBeenCalledWith(123); expect(foo.setBar).toHaveBeenCalledWith(456, 'another param'); }); it("allows access to the most recent call", function() { expect(foo.setBar.mostRecentCall.args[0]).toEqual(456); }); it("allows access to other calls", function() { expect(foo.setBar.calls[0].args[0]).toEqual(123); }); it("stops all execution on a function", function() { expect(bar).toBeNull(); }); });
探测器的类型:
http://powertech.iteye.com/blog/2065922
andCallThrough 监听函数的执行过程。
it('andCallThrough',funciton(){ spyOn(myObj,'fun').andCallThrough(); //判断是否返回了期望的结果 var result = myObj.fun(222); expect(result).toBe(234) //可以使用toHaveBeenCalled判断函数是否执行, expect(myObj.fun).toHaveBeenCalled(11); //使用toHaveBeenCalledWith判断是否传入了期望的参数 expect(myObj.fun).toHaveBeenCalledWith(11); });
andReturn:伪造函数的返回值,一般用来在测试用例执行前
为测试用例提前配置好测试环境,减少函数间的依赖。
it('andCallThrough',funciton(){ spyOn(myObj,'getLoginUserID').andReturn(function(para){ //将函数myObj.getLoginUserID的返回值修改为123 return 123; }); var id = myObj.getLoginUserID(para); var user = myObj.getUser(id); } });
andCallFake:伪造函数的调用过程。
it('andCallThrough',funciton(){ spyOn(myObj,'fun').andCallFake(function(para){ //将函数myObj.fun的执行过程改为下面的代码 var i= i+1; return 123; }); myObj.fun1 = function(para){ var ss = myObj.fun(para); return ss*10; } //判断是否返回了期望的结果 var result = myObj.fun(222); expect(result).toBe(1230) });
createSpy:请查看原文档
createSpyObj:请查看原文档
测试用例的同步代码支持:
在测试的时候,有时我们需要某个测试执行时,等待5秒钟之后再开始,
或者满足某个条件后才开始,比如,执行用户管理测试,需要先调用
登录代码后,等待1秒再开始其它测试。
runs(funciton(){ 代码块1 }) runs(funciton(){ 代码块2 })
用于序列化执行的的代码块,多个runs块按顺序执行。
waits(毫秒),执行完此函数,会引起等待,等待结束然后再执行下一个runs代码块或下一个
it测试用例
waitsFor(function(){ //满足条件时返回true if(condition){ return true; } },'失败说明',5000);
waitsFor代码块在5000毫秒内返回true,则执行下一下runs块
如果在5000毫秒内不能返回true,则测试用例失败,不再执行下一个runs代码块。
实例:
describe('等待啊等待',function(){ it('开始,配置环境',funciton(){ //发起一个异步的ajax登录 myusr.login(); //下一个it执行前等待500毫秒, //保证登录已完成。 waits(500); }); it('顺序执行',funciton(){ this.user = myojb.loginUser; runs(function(){ this.user .setName('小花'); }); runs(function(){ this.user .setAge(26); }); waitFor(function(){ if(findFriends(this.user)){ this.friends = findFriends(this.user); return true; } },'条件不具备',5000); runs(function(){ console.log(this.friends); expect(this.friends).toBe('程序员'); }); }); })
和karma的配合
http://powertech.iteye.com/blog/2065922
karma默认每个包含的文件,都是用<script src="my.js"></script>这种格式包含进一个HTML文档里。
console.log($(document))即可看到:
引用
<!-- Dynamically replaced with <script> tags -->
<script type="text/javascript" src="/absoluteC:/Users/consumer/AppData/Roaming/npm/node_modules/karma-jasmine/lib/jasmine.js?437512c57124d57f5ec77e2e82bfb4e3cdd15cce"></script>
<script type="text/javascript" src="/absoluteC:/Users/consumer/AppData/Roaming/npm/node_modules/karma-jasmine/lib/adapter.js?8758b57ed804b1772f97ced0c9165fbc2ae4b92f"></script>
<script type="text/javascript" src="/base/public_html/lib/jquery.js?b08cf5128a86aea81cc62981679dd1612cad97a1"></script>
<script type="text/javascript" src="/base/public_html/lib/jquery.cookie.js?bfe7d4d0c3bfb70871cab51bd8f462ca78a38ad3"></script>
<script type="text/javascript" src="/base/public_html/lib/jquery.md5.js?44c1e596e0ade9981f1309503ee505588c27ec8c"></script>
<script type="text/javascript" src="/base/public_html/lib/bootstrap3.1.1/js/bootstrap.min.js?5814e91bb6276f4de8b7951c965f2f190a03978d"></script>
<script type="text/javascript" src="/base/public_html/lib/underscore-min.js?08092373bfbdb7924dd01795779e171e66f038cd"></script>
<script type="text/javascript" src="/base/public_html/lib/backbone.js?ae0af2f4065288db615051160ce7d9a7c609421c"></script>
<script type="text/javascript" src="/base/public_html/js/base/Distance.js?b302ee794838832c74089b938b0983694e41bb41"></script>
<script type="text/javascript" src="/absoluteC:/Users/consumer/AppData/Roaming/npm/node_modules/karma-jasmine/lib/jasmine.js?437512c57124d57f5ec77e2e82bfb4e3cdd15cce"></script>
<script type="text/javascript" src="/absoluteC:/Users/consumer/AppData/Roaming/npm/node_modules/karma-jasmine/lib/adapter.js?8758b57ed804b1772f97ced0c9165fbc2ae4b92f"></script>
<script type="text/javascript" src="/base/public_html/lib/jquery.js?b08cf5128a86aea81cc62981679dd1612cad97a1"></script>
<script type="text/javascript" src="/base/public_html/lib/jquery.cookie.js?bfe7d4d0c3bfb70871cab51bd8f462ca78a38ad3"></script>
<script type="text/javascript" src="/base/public_html/lib/jquery.md5.js?44c1e596e0ade9981f1309503ee505588c27ec8c"></script>
<script type="text/javascript" src="/base/public_html/lib/bootstrap3.1.1/js/bootstrap.min.js?5814e91bb6276f4de8b7951c965f2f190a03978d"></script>
<script type="text/javascript" src="/base/public_html/lib/underscore-min.js?08092373bfbdb7924dd01795779e171e66f038cd"></script>
<script type="text/javascript" src="/base/public_html/lib/backbone.js?ae0af2f4065288db615051160ce7d9a7c609421c"></script>
<script type="text/javascript" src="/base/public_html/js/base/Distance.js?b302ee794838832c74089b938b0983694e41bb41"></script>
文件的加载顺序和配置顺序是一样的。
所以可以写一些前置的测试用例,用来初始化测试环境,比如设置登录用户,预加载页面内容
伪造服务器响应,修改服务器地址,设置全局变量,使用waits等待加载等。
当这些测试用测跑完,相当于走了一个初始化过程,再开始其它的测试用例,会省去很多重
复代码。
如:
引用
start config\karma.conf.js
INFO [karma]: Karma v0.12.9 server started at http://localhost:9876/
INFO [launcher]: Starting browser Chrome
INFO [Chrome 34.0.1847 (Windows 7)]: Connected on socket wxF-ypt_qN_FJCIwnwtA with id 65078817
Chrome 34.0.1847 (Windows 7): Executed 0 of 14 SUCCESS (0 secs / 0 secs)
LOG: 'XX测试,初始化...'
Chrome 34.0.1847 (Windows 7): Executed 0 of 14 SUCCESS (0 secs / 0 secs)
Chrome 34.0.1847 (Windows 7): Executed 1 of 14 SUCCESS (0 secs / 0.133 secs)
LOG: '模拟用户登录……'
Chrome 34.0.1847 (Windows 7): Executed 1 of 14 SUCCESS (0 secs / 0.133 secs)
INFO [karma]: Karma v0.12.9 server started at http://localhost:9876/
INFO [launcher]: Starting browser Chrome
INFO [Chrome 34.0.1847 (Windows 7)]: Connected on socket wxF-ypt_qN_FJCIwnwtA with id 65078817
Chrome 34.0.1847 (Windows 7): Executed 0 of 14 SUCCESS (0 secs / 0 secs)
LOG: 'XX测试,初始化...'
Chrome 34.0.1847 (Windows 7): Executed 0 of 14 SUCCESS (0 secs / 0 secs)
Chrome 34.0.1847 (Windows 7): Executed 1 of 14 SUCCESS (0 secs / 0.133 secs)
LOG: '模拟用户登录……'
Chrome 34.0.1847 (Windows 7): Executed 1 of 14 SUCCESS (0 secs / 0.133 secs)
作完这些操作后,其它的测试用例跑起来很方便。
karma里测试文件的加载方式:
http://powertech.iteye.com/blog/2065922
默认情况下,所有文件都使用<script>标签直接加载到浏览器里,后台相当于存在一个小服务器。也可以将文件加载到服务器,在地址档访问,或Ajax加载。
files: [ //直接加载到浏览器 'public_html/lib/jquery.js', 'public_html/lib/jquery.cookie.js', 'public_html/lib/jquery.md5.js', 'public_html/lib/bootstrap3.1.1/js/bootstrap.min.js', 'public_html/lib/underscore-min.js', 'public_html/lib/backbone.js', 'public_html/js/base/*.js', //将文件加载到服务器后端,需要时再访问 //访问路径http://localhost:9876/base/public_html/js/somefile.js {pattern: 'public_html/**/*.html', watched: false, included: false, served: true}, {pattern: 'public_html/js/**/*.js', watched: false, included: false, served: true}, ],
发表评论
-
解决eclipse在修改js卡顿现象
2018-02-09 15:49 1378新版eclipse编辑含有javascript内容的jsp时, ... -
chosen 数据的动态更新
2016-09-08 15:28 1769chosen是个不错的复合下拉组件,缺点是文档较少 源码在gi ... -
优秀的弹层组件
2016-04-20 18:19 662http://layer.layui.com/ -
googleapis.com域名访问慢的解决办法
2016-04-13 12:09 9721、安装火狐 2、安装插件ReplaceGoogleCDN -
国内常用前端公共库CDN服务
2015-11-15 14:00 945BAIDU http://cdn.code.baidu.co ... -
jquery validate 1.14
2015-10-12 20:14 797<!DOCTYPE html PUB ... -
jquery 事件处理handler函数的参数
2015-02-08 23:22 2585jquery 事件处理handler函 ... -
jquery tr rowindex
2014-11-30 13:42 905var tr = $(this).parents('tr' ... -
jqgrid please select row warning
2014-11-23 19:42 1730引入ui.jqgrid.css即可解决 -
改变多个jquery.ready的默认顺序
2014-11-23 15:37 1298$(document).ready 这个函数的解释: 引用 D ... -
javascript 错误的继承方式
2014-11-02 23:02 727var parent = {t:1,m:2,} pare ... -
JS图片格式验证
2014-07-03 16:48 922function pic(file){ var r ... -
更改underscorejs默认的匹配符
2014-06-14 11:51 848/** 修改underscore.js默认的< ... -
uglifyjs批量压缩js
2014-06-13 16:34 2434jquery官方使用uglifyjs进行压缩的,压缩比较高 ... -
html5 canvas作的手写板【兼容手机】
2014-05-21 15:56 5287<!DOCTYPE html> <ht ... -
backbone.js model和view视图的单元测试
2014-05-20 17:32 1360backbone的模块化开发,需要引入测试流程保证代码的质量, ... -
由正则表达式html或xml标签配对说起【括号编组和正负向预查】
2014-05-15 14:17 2475经常会查找xml或HTM ... -
javascript的代理和切面
2014-05-15 13:39 743Java里有面向切面的实现方式,可以监控包、对象、函数 ... -
backbone.js路由Router的使用
2014-05-09 11:33 1582路由的使用很简单,路由的转向 router.navigate( ... -
backbone.js的View里的事件重复调用
2014-05-09 11:18 1996backbone的一个视图被初始化多次后,发现一个按钮事 ...
相关推荐
《NetBeans平台软件开发单元测试技术的研究》一文深入探讨了在NetBeans平台上进行软件开发时,如何有效地实施单元测试,以确保代码质量和提高开发效率。以下是对该论文中的核心知识点的详细阐述: ### 一、单元测试...
netbeans配置及xdebug 调试 单元调试 单独流程调试
本篇笔记将带你进入JUnit与NetBeans的结合使用世界,让你在NetBeans中更高效地进行单元测试。 首先,我们需要安装JUnit库到NetBeans。在NetBeans中,打开“工具”菜单,选择“库”,然后点击“新建库”。在弹出的...
它提供了一整套工具,包括代码编辑器、调试器、版本控制系统集成以及项目管理功能,帮助开发者高效地编写和测试代码。 标题“NetBeans 源代码和二进制构建文件”表明了这个压缩包包含了NetBeans的源码和构建出的二...
NetBeans Java 快速入门指南 本指南提供了使用 NetBeans IDE 创建 Java 控制台应用程序的步骤指南,涵盖了项目创建、编译和运行等基本步骤。通过这篇指南,读者将学习如何使用 NetBeans IDE 创建、编译和运行 Java ...
NetBeans IDE作为一个强大的开源集成开发环境,提供了对JUnit的内置支持,让开发者能够无缝地在NetBeans中进行单元测试。本篇文章将详细讲解如何在NetBeans中使用JUnit进行测试。 首先,确保你已经安装了支持JUnit...
NetBeans提供了内建的测试框架,可以创建单元测试和集成测试。完成开发后,右键点击项目,选择“部署”到jBoss服务器,NetBeans会自动处理部署过程。 9. **调试与优化**: NetBeans的调试工具对于Seam应用同样...
本资源为NetBeans IDE 6.0 Java快速入门指南,旨在指导用户快速了解NetBeans IDE的工作流程和基本功能。以下是本资源的详细知识点: 一、NetBeans IDE概述 * NetBeans IDE是一个集成开发环境(IDE),提供了一个...
### NetBeans使用教程入门篇知识点详解 #### 一、NetBeans简介及安装 - **NetBeans概述**:NetBeans是一款开源且免费的集成开发环境(IDE),由Oracle公司支持(原Sun Microsystems)。它支持多种编程语言,包括...
第二篇为NetBeans集成开发环境的高级应用篇,本篇结合具体的实例讲解如何进行JUnit单元测试、代码性能分析、代码版本控制、开发Web应用程序、企业级应用程序、进行UML建模,以及开发SOA应用程序。第三篇介绍如何使用...
在编写和测试应用程序后,可进行"清理并构建"。这一步将清除之前编译产生的临时文件,并重新构建整个项目,确保所有代码都已更新并正确编译。对于部署应用,NetBeans还提供了一系列工具,如打包成JAR文件或构建Web...
总之,通过安装和配置Netbeans、Tomcat以及Emmet插件,开发者可以构建高效的工作环境,方便地进行Web应用程序的开发和测试。Emmet的强大功能使得HTML和CSS编码变得更加便捷,是前端开发者的得力助手。
相关教程涵盖了IDE的更多高级特性,例如调试、单元测试、代码重构、版本控制集成等,帮助你更深入地探索和利用NetBeans IDE的潜力。 总之,NetBeans IDE 5.5是一个功能齐全、用户友好的开发工具,对于初学者和经验...
本资源摘要信息将指导用户使用 NetBeans IDE 5.0 进行 JSP 快速开发。该资源涵盖了从安装必要的软件到创建和编辑 web 应用程序代码文件的所有步骤。 一、安装必要的软件 在开始编写代码之前,我们必须安装正确的...
通过这个视频录像,观众将能学习到如何在NetBeans环境中高效地管理数据库连接,进行数据查询和测试,以及如何将数据库集成到Java应用程序中。无论你是初学者还是经验丰富的开发者,这个教程都将提供宝贵的知识,帮助...
### NetBeans IDE 6.0 Java 快速入门指南知识点详解 #### 一、NetBeans IDE简介 NetBeans IDE是一款开源且免费的集成开发环境,适用于多种编程语言,包括Java、C/C++、PHP等。它由Oracle公司支持,现已被收归至...
对于Liferay插件开发,NetBeans提供了特定的Liferay插件开发工具包,使得开发者能更便捷地创建、部署和测试Liferay相关的应用程序。 2. **Liferay Portal**:Liferay是一个基于Java的开源企业级内容管理和门户平台...
当你完成应用程序的开发后,可以通过NetBeans的“Build”或“Run”选项进行编译和运行。NetBeans会自动处理项目的依赖关系,生成可执行文件,让你能够快速测试和部署你的桌面应用。 在学习NetBeans桌面程序开发的...