- 浏览: 1335900 次
- 性别:
- 来自: 湖南澧縣
文章分类
最新评论
-
虾米小尹:
不行啊!2.2-0.25=1.9500000000000002 ...
JavaScript浮点数运算 —— 精度问题 -
heluping000000:
引用String a= "abc",首先在 ...
String,到底创建了多少个对象? -
mack:
谢谢分享matcher.appendReplacement(s ...
string.replaceAll()中的特殊字符($ \)与matcher.appendReplacement -
wzt3309:
完全理解,比网上其他资料都要详细
String,到底创建了多少个对象? -
u014771876:
Java中十六进制转换 Integer.toHexString()
JsUnit与JUnit对比
JsUnit也有setUp()与tearDown(),不过现在作为函数,而不是方法;测试函数(而不是测试方法)分成多个测试页(而不是测试类);另外JsUnit提供了自己的基于HTML的测试运行工具。
JUnit |
JsUnit |
Test 类扩展 TestCase |
测试页包含 jsUnitCore.js |
测试方法 |
测试函数 |
Test 类 |
基于 HTML 的测试页 |
TestSuite |
基于 HTML 的测试集 |
多个测试运行工具 |
基于 HTML/JavaScript 的测试运行工具 |
setUp() 和 tearDown() 方法 |
setUp() 和 tearDown() 函数 |
在虚拟机中运行 |
在浏览器中运行 |
用 Java 编写 |
用 JavaScript 编写 |
起步
对于JsUnit,起步很简单,只需从JsUnit网站(http://www.jsunit.net/ 或 直接进入http://sourceforge.net/projects/jsunit/files/ 在下载页面里还可以下载eclipse的jsunit插件 )下载JsUnit zip文件。 把这个压缩文件解开,会得到一个jsunit文件夹,可以把Web服务器放在这里,这样整个团队或者整个组织就能更容易地使用JsUnit。JsUnit的大部分“核心”都在jsunit/app目录中,在这里可以看到jsUnitCore.js、jsUnitTracer.js和jsUnitTestManager.js,另外还有其他一些文件。如果你想运行具体的JsUnit测试,可以使用testRunner.html来运行jsunit/tests目录中找到的任何测试页。
编写测试
用JsUnit编写测试与用JUnit编写测试很相似。测试函数不能有任何参数,必须有一个前缀test ,例如testDateValidation()。测试函数包含在一个测试页(test page)中,这类似于JUnit中的一个Test类。测试页必须包含jsUnitCore.js 文件,解开JsUnit zip文件后,就会在jsunit/app目录中找到这个文件。包含这个JavaScript文件实际上就是把一个外部JavaScript文件增加到页面中;只需使用脚本元素<script language="JavaScript" src="jsUnitCore.js"></script> 来引用这个文件。
一般地,JsUnit会自动发现测试函数,就像JUnit会发现所有测试方法一样。不过,有些操作系统/浏览器不能合作。如果你发现不能如你所愿地发现测试函数,使用exposeTestFunctionNames() 方法就能解决这个问题。
断言方法
assert([comment], booleanValue) assertTrue([comment], booleanValue) assertFalse([comment], booleanValue) assertEquals([comment], value1, value2) assertNotEquals([comment], value1, value2) assertNull([comment], value) assertNotNull([comment], value) assertUndefined([comment], value) assertNotUndefined([comment], value) assertNaN([comment], value) assertNotNaN([comment], value) fail(comment)
以上使用可以参考jsunit\tests\jsUnitAssertionTests.html
第一个简单示例
这个例子中有一个简单的函数,会让两个数相加,而且有两个测试:一个用于正整数的相加,另一个用于负整数相加。要测试这个函数,先创建一个简单的Web页面,其中包含了jsUnitCore.js文件与要测试的simpleJS.js文件。
simpleJS.js清单:
function addTwoNumbers(value1, value2) { return parseInt(value1) + parseInt(value2); }
简单的测试页smimpleTest.html清单:
<html> <head> <title>Test Page</title> <!-- 首先这里要导入核心文件jsUnitCore.js --> <script language="JavaScript" src="jsunit/app/jsUnitCore.js"></script> <!-- 要测试的js文件 --> <script language="JavaScript" src="simpleJS.js"></script> <script language="JavaScript"> //测试方式要以test开头,且不带有参数 function testValidArgs() { //与Junit一样使用断言来进行测试 assertEquals("2 + 2 is 4", 4, addTwoNumbers(2, 2)); } function testWithNegativeNumbers() { assertEquals("negative numbers: -2 + -2 is -4", -4, addTwoNumbers(-2, -2)); } </script> </head> <body> This is a simple test page for the simpleJS file. </body> </html>
测试结果:
可以看到,两个测试函数会自动被发现,而且通常都是这样。不过,如果打开测试页,点击Run之后什么也没有发生,可能就需要使用exposeTestFunctionNames(),
以确保JsUnit能找到你的测试,如下代码:
exposeTest.html清单:
<html> <head> <title>A Test Page With exposeTestFunctions</title> <script language="JavaScript" src="jsunit/app/jsUnitCore.js"></script> <script language="JavaScript" src="simpleJS.js"></script> <script language="JavaScript"> //不是标准的测试方法,因为没有以test开头 function validArgs() { assertEquals("2 + 2 is 4", 4, addTwoNumbers(2, 2)); } function withNegativeNumbers() { assertEquals("negative numbers: -2 + -2 is -4", -4, addTwoNumbers(-2, -2)); } //如果找不到测试方法或要测试的方法不是以标准的test开头时,使用如下方法进行手动指定 function exposeTestFunctionNames() { var tests = new Array(2); tests[0] = "validArgs"; tests[1] = "withNegativeNumbers"; return tests; } </script> </head> <body> This is a simple test page that uses exposeTestFunctionNames. </body> </html>
setUp()和tearDown()
像JUnit一样,JsUnit也支持setUp()和tearDown()。JsUnit与JUnit有一点是一样的,即setUp()和tearDown()是可选的 ,而且setUp()会在每个测试之前调用 ,tearDown()会在每个测试之后调用 。在大量使用setUp()和tearDown()之前,需要了解JUnit与JsUnit中setUp()和tearDown()方法的实现有两个重要区别。在JUnit中,每次测试运行会导致创建Test类的一个新实例,这说明,声明的所有实例变量在下一次测试运行时会“重置”。不过,JsUnit有所不同,它不会为每次测试运行重新加载测试页,所以变量状态会在多次测试之间保留 。还有一个重要区别与测试顺序有关,使用JUnit的话,测试方法执行的顺序是不能保证的。在JsUnit中,测试会按测试页中声明的顺序执行测试方法,先从最上面的测试开始(注:但不要依赖于这种顺序)。
下面显示了一个相当复杂的例子,其中使用了setUp()和tearDown()方法。这里同样以前面创建的add方法为基础,但是这一次会增加一个表单。你要使用setUp()填写这个表单,然后使用tearDown()方法自行清空。
setUptearDownTest.html清单:
<html> <head> <title>Using setUp and tearDown</title> <script language="JavaScript" src="jsunit/app/jsUnitCore.js"></script> <script language="JavaScript" src="simpleJS.js"></script> <script language="JavaScript"> //在测试方法执行前执行 function setUp() { document.getElementById("value1").value = "2"; document.getElementById("value2").value = "2"; } function testValidArgs() { assertEquals("2 + 2 should equal 4", 4, addNumbers()); } function addNumbers() { var val1 = document.getElementById("value1").value; var val2 = document.getElementById("value2").value; return addTwoNumbers(val1, val2); } //在所有测试方法执行完后执行 function tearDown() { document.getElementById("value1").value = ""; document.getElementById("value2").value = ""; } </script> </head> <body> <form id="test"> <input type="text" size="3" id="value1"/> <input type="text" size="3" id="value2"/> <input type="button" value="Add" onclick="addNumbers()"/> </form> </body> </html>
setUpPage()
JsUnit还包含另外一个特性:setUpPage()函数(一次性启动方法),这是JUnit中所没有的。setUpPage()函数只对每个测试页调用一次(注,在测试集不起作用,只能在测试页里使用),即在所有测试函数调用之前调用。现在,你可能已经发现,这里很适合完成预处理,特别是在运行测试之前如果需要向页面加载一些数据,setUpPage()函数就非常有用 。不同于setUp()和tearDown()函数的是,使用setUpPage()不只是把处理放在这个函数中就行了的,如果确实选择使用这个特性,还得要保证函数完成时要把setUpPageStatus变量设置为complete,这就告诉JsUnit可以继续,接下来可以执行测试页上的测试了,否则如果未设置或设置成另外的值时,代码执行为阻止,浏览器将处理等待状态。
下面再来看前面的simpleJS.js文件,再增加3个函数,补充更多的数学特性。在此包括减法、乘法和除法函数,如代如下所示。
simpleJS2.js清单:
function addTwoNumbers(value1, value2) { return parseInt(value1) + parseInt(value2); } function subtractTwoNumbers(value1, value2) { return parseInt(value1) - parseInt(value2); } function multiplyTwoNumbers(value1, value2) { return parseInt(value1) * parseInt(value2); } function divideTwoNumbers(value1, value2) { return parseInt(value1) / parseInt(value2); }
下面使用setUpPage()函数建立一些简单的测试数据,请注意函数最后一行,必须告诉JsUnit你已经建好了测试页。
setUpPageTest.html清单:
<html> <head> <title>Using setUpPage</title> <script language="JavaScript" src="jsunit/app/jsUnitCore.js"></script> <script language="JavaScript" src="simpleJS2.js"></script> <script language="JavaScript"> var arg1; var arg2; function setUpPage() { arg1 = 2; arg2 = 2; //完成后一定要设置这个,否则会进入阻塞状态 setUpPageStatus = "complete"; } function testAddValidArgs() { assertEquals("2 + 2 should equal 4", 4, addTwoNumbers(arg1, arg2)); } function testSubtractValidArgs() { assertEquals("2 - 2 should equal 0", 0, subtractTwoNumbers(arg1, arg2)); } function testMultiplyValidArgs() { assertEquals("2 * 2 should equal 4", 4, multiplyTwoNumbers(arg1, arg2)); } function testDivideValidArgs() { assertEquals("2 / 2 should equal 1", 1, divideTwoNumbers(arg1, arg2)); } </script> </head> <body> This is an example of using setUpPage. </body> </html>
测试集
有了一些测试页之后,你可能想把它们组织为测试集(test suite,也称测试套件),这与JUnit中的TestSuite很相似。测试集把不同的测试页分组组织,这样只需运行一个测试集就能一次运行类似的一组测试。测试集其实就是一些特殊的测试页,其中包含的测试页或其他测试集(相应地就有了一个主测试集)会按顺序运行。
可以采用定义测试页的方式来定义测试集,不过有两个例外。首先,测试集中不能包含任何测试函数 ;其次,你的测试集必须包含一个返回JsUnitTestSuite对象的suite()函数 。可以使用两个方法向测试集中增加测试页或子测试集:addTestPage(testPage) 和addTestSuite(testSuite)。 前者向测试集中增加单个的测试页;后者向测试集中增加另一个测试集。要记住,向测试集中增加一个测试页时,需要提供一个完全限定名,或者要提供测试页文件相对于测试运行工具的相对路径名。如果想向测试集中增加其他的测试集,要记住,提供给addTestSuite的参数类型必须为JsUnitTestSuite,它还要在suite函数所在的同一个页面中声明 。
testSuit.html清单:
<html> <head> <title>Sample Test Suite</title> <script language="JavaScript" src="jsunit/app/jsUnitCore.js"></script> <script language="JavaScript"> function sampleSuite() { var sampleSuite = new top.jsUnitTestSuite(); sampleSuite.addTestPage("../smimpleTest.html"); sampleSuite.addTestPage("../setUpPageTest.html"); sampleSuite.addTestPage("../setUptearDownTest.html"); return sampleSuite; } //测试集中一定要有以下这个方法 function suite() { var testSuite = new top.jsUnitTestSuite(); //如果想向测试集中增加其他的测试集,要记住,提供给addTestSuite的参数类 //型必须为JsUnitTestSuite,它还要在suite函数所在的同一个页面中声明。 testSuite.addTestSuite(sampleSuite()); testSuite.addTestPage("../exposeTest.html"); return testSuite; } </script> </head> <body> This is a simple test suite. </body> </html>
跟踪和日志
编写JavaScript时最困难的一部分就是跟踪代码。因为JavaScript不同于其他许多语言,没有一个得力的日志库来帮助你,因此无法以一种一致的方式打印语句,相反,你必须使用alert()。当然,alert()也不是不行,但它肯定不是最理想的方法。为了查找一个问题,要“沿路”布下一大堆alert()函数,这是很讨厌的,而且一旦修正了bug,还要再把这一大堆alert()代码统统去掉。当然,等你删除掉所有额外的alert()函数后,没准又会出现另一个bug,而且就出现在上一个bug的附近,这就要求你又得把所有alert()函数再加上。你现在应该知道,为什么没有多少人喜欢JavaScript了吧!
为了让JavaScript开发人员的日子更好过,JsUnit支持跟踪!JsUnit包含以下3个函数,任何测试都可以调用(注意,在每个函数中,value参数是可选的):
warn(message, [value])
inform(message, [value])
debug(message, [value])
JsUnit支持3个跟踪级别:warn(警告)、info(信息)和debug(调试)。运行测试时,要指定你想在哪个级别上输出。这3个级别按以下顺序层叠:warn, info, debug。这说明,如果运行测试时选择debug,就会看到warn()、inform()或debug()函数发出的所有消息。如果选择warn,则只会显示由warn()函数发出的消息,选择info则会显示由warn()和inform()发出的消息。默认值为no tracing(不跟踪)。下面向这个简单例子增加一些跟踪函数,来看看会发生什么。
testTrace.html清单:
<html> <head> <title>A Simple Test Page with Tracing</title> <script language="JavaScript" src="jsunit/app/jsUnitCore.js"></script> <script language="JavaScript"> function addTwoNumbers(value1, value2) { warn("this is a warning message"); warn("this is a warning message with a value", value1); return value1 + value2; } function testValidArgs() { inform("this is an inform message"); assertEquals("2 + 2 is 4", 4, addTwoNumbers(2, 2)); } function testWithNegativeNumbers() { debug("this is a debug message"); assertEquals("negative numbers: -2 + -2 is -4", -4, addTwoNumbers(-2, -2)); } </script> </head> <body> This is a simple test page for addTwoNumbers(value1, value2) with tracing. </body> </html>
要看跟踪函数得到的输出,需要在测试运行工具中启用跟踪,并选择适当的跟踪级别。如果选择debug,可以看到来自这3个函数的全部消息,“Close Old Trace Window on New Run”(下一次运行测试时关闭上一个跟踪窗口)复选框的作用是,如果你愿意,可以保留以前运行测试的跟踪结果。
跟踪日志显示结果:
运行测试
你已经写了一些测试,下面需要运行它们,为此可以使用JsUnit测试运行工具。你已经看到启动测试运行工具的许多例子,不过这是怎么做到的呢?为了访问这个运行工具,要把浏览器指向jsunit文件夹中的testRunner.html文件。
这个测试运行工具非常类似于JUnit中常用的图形化运行工具。(不过,有意思的是,我们期盼已久的JUnit 4并没有包括图形测试运行工具,而且以后也不会增加。)要运行一个测试,可以点击Choose File(注,本来是有这个按钮的,在IE6上有,IE7上就显示不出来,在firefox3.5上也有,但在firefox3.5上好像不能运行起来),来选择要运行的文件。不出所料,在测试运行工具发现失败之前,进度条一直是绿的。Runs字段指示测试函数的总数,还可能报告错误或失败。
错误(error)来自浏览器,指示测试页出现了某个问题,失败(failure)指示你的某个断言失败。
特定的错误或失败会显示在Errors and Failures文本框中。要了解一个错误或失败的更详细的信息,可以双击相应测试函数。或者,选中这个测试函数,再选择Show Selected。如果是失败,就会出现一个警告,显示出期望值和实际值,另外还会显示你在断言中增加的所有消息。如果看到一个错误,相应的消息(可能)会帮助你缩小查找的范围,更快地找到问题所在。
下面再来看以下错误代码
errorTest.html代码清单:
<html> <head> <title>Using setUpPage</title> <script language="JavaScript" src="jsunit/app/jsUnitCore.js"></script> <script language="JavaScript" src="simpleJS2.js"></script> <script language="JavaScript"> var arg1; var arg2; function setUpPage() { arg1 = 2; arg2 = 2; setUpPageStatus = "complete"; } function testAddValidArgs() { //结果应该是4 assertEquals("2 + 2 should equal 4", 5, addTwoNumbers(arg1, arg2)); } function testSubtractValidArgs() { //无subtractTwoNumbers11111方法 assertEquals("2 - 2 should equal 0", 0, subtractTwoNumbers11111(arg1, arg2)); } function testMultiplyValidArgs() { assertEquals("2 * 2 should equal 4", 4, multiplyTwoNumbers(arg1, arg2)); } function testDivideValidArgs() { assertEquals("2 / 2 should equal 1", 1, divideTwoNumbers(arg1, arg2)); } </script> </head> <body> This is an example of using setUpPage. </body> </html>
运行结果如下:
双击列表框中的错误信息项或点击“Show all”,会显示错误的详细信息,如下图:
发表评论
-
HTML、JS、JSON特殊字符
2010-12-13 23:47 25878JS到HTML特殊字符转换 这几天做项目,发现从服务器端以J ... -
HTML — HTTP URL 中的特殊字符
2009-10-31 18:16 32951. + URL中的+号表示空格 ... -
HTML — CSS选择器
2009-10-25 21:11 2157一个样式规则由两部分组成:选择器和样式声明。选择器表明要为哪一 ... -
部分解决JsUnit无法在firefox3、safari 测试的问题
2009-10-25 07:03 1438在上一篇中出现了一个问题,就是用 jsunit2.2alpha ... -
JsUnit——eclipse插件(四)
2009-10-25 06:59 2445这节我们来看看如何通过JsUnit插件来运行前几节所测试过的测 ... -
10、JavaScript跨浏览器需注意的问题——ajax基础笔记
2009-10-21 22:19 1370向表中追加行 创建表格行时,我们要把创建的 tr 追加到 t ... -
JsUnit详解——Web服务方式(三)
2009-10-21 00:21 2451上两节提到过以Web方式来运行JsUnit,不过不是很详细,这 ... -
JsUnit详解——《ajax基础》笔记(二)
2009-10-20 22:38 2524使用标准/定制查询串 如此说来,测试运行工具是很强大的,但是 ... -
使用Firefox的Web开发插件
2009-10-18 17:53 1474Firefox的Web开发插件为Firefox浏览器增加了大量 ... -
9、访问WEB服务(REST)——ajax基础笔记
2009-10-18 17:24 4022最其名的WEB服务实现是S ... -
8、读取响应头部——ajax基础笔记
2009-10-18 17:20 6753你有时可能需要从服务器获取一些内容,例如,可能想“ping”一 ... -
7、使用JSON向服务器发送数据——ajax基础笔记
2009-10-18 17:20 5213看过前面的例子后(使用XML向服务器发送复杂的数据结构),你可 ... -
6、请求参数作为XML发送——ajax基础笔记
2009-10-18 17:20 1772如果只是使用一个包含 名/值 对的简单查询串,这可能不够健壮, ... -
4、将使用W3C DOM动态生成页面——ajax基础笔记
2009-10-18 17:19 1432使用W3C DOM动态生成页面 dynamicContent ... -
3、将响应解析为XML——ajax基础笔记
2009-10-18 17:18 1062将响应解析为XML parseXML.xml清单: < ... -
2、使用innerHTML属性创建动态内容——ajax基础笔记
2009-10-18 17:17 1923使用innerHTML属性创建动态内容 如果结合作用HTML ... -
1、使用XMLHttpRequest对象——ajax基础笔记
2009-10-18 17:17 2018XMLHttpRequest最早是在 IE5 中以active ... -
30、JavaScript代码优化
2009-10-16 21:25 1566JavaScript代码的速度被分成两部分:下载时间和执行速度 ... -
JavaScript代码优化(二)
2009-10-16 01:32 1196◆字符串的使用 在IE6和IE7中因字符串级联导致的主要问题 ... -
JavaScript代码优化(一)
2009-10-15 23:47 1260尽可能避免使用全局变量和函数.全局的变量和函数其实等价于 wi ...
相关推荐
**JsUnit详解——《ajax基础》笔记(二)** JsUnit是一个JavaScript单元测试框架,它允许开发者对JavaScript代码进行测试,确保代码的质量和功能的正确性。本篇笔记主要聚焦在JsUnit的使用方法和与Ajax基础的结合,...
JavaScript Unit Testing,通常简称为JsUnit,是一种针对JavaScript代码进行单元测试的框架。在Web服务开发中,单元测试是确保代码质量、可维护性和可扩展性的重要环节。本篇文章将详细探讨JsUnit在Web服务场景下的...
**JsUnit——Eclipse插件(四)** JsUnit是一款用于JavaScript单元测试的框架,它为JavaScript开发者提供了类似于Java JUnit的测试环境。在本文中,我们将深入探讨如何在Eclipse集成开发环境中安装和使用JsUnit插件...
本书重点介绍Ajax及相关的工具和技术,主要内容包括XMLHttpRequest对象及其属性和方法、发送请求和处理响应、构建完备的Ajax开发工具、使用JsUnit测试JavaScript、分析JavaScript调试工具和技术,以及Ajax开发模式和...
这一过程将乐趣无穷,我们衷心地希望,有一天能看到你开发的基于ajax的一流应用!... 目录 译者序. 前言 致谢 关于技术审校 第1章 ajax简介 1 1.1 web应用简史 1 1.2 浏览器历史 2 1.3 web应用的发展历程 3 ...
根据提供的信息,《征服ASP.NET 2.0 Ajax——Web开发技术详解》这本书旨在全面介绍如何利用ASP.NET 2.0结合Ajax进行高效、现代化的Web开发。书中通过丰富的示例来帮助读者掌握这一领域的关键技术。 ##### 运行环境 ...
《Ajax基础教程.chm》 Ajax技术可以提供高度交互的Web应用,给予用户更丰富的页面浏览体验。本书重点介绍Ajax及相关的工具和技术,主要内容包括XMLHttpRequest对象及其属性和方法、发送请求和处理响应、构建完备的...
### Ajax基础教程知识点详解 #### 一、Ajax技术概览 **1.1 Web应用** - **起源与发展:** - 最早的互联网是为连接少数顶尖研究机构而设计的,用户需要掌握复杂的系统。 - 早期互联网的雏形(如ARPANET)为后续...
本书重点介绍Ajax及相关的工具和技术,主要内容包括XMLHttpRequest对象及其属性和方法、发送请求和处理响应、构建完备的Ajax开发工具、使用JsUnit测试JavaScript、分析JavaScript调试工具和技术,以及Ajax开发模式和...
本书重点介绍Ajax及相关的工具和技术,包括XMLHttpRequest对象及其属性和方法、发送请求和处理响应、构建完备的Ajax开发工具、使用JsUnit测试JavaScript、分析JavaScript调试工具和技术,以及Ajax开发模式和框架等。...
本书重点介绍Ajax及相关的工具和技术,主要内容包括XMLHttpRequest对象及其属性和方法、发送请求和处理响应、构建完备的Ajax开发工具、使用JsUnit测试JavaScript、分析JavaScript调试工具和技术,以及Ajax开发模式和...
本书重点介绍Ajax及相关的工具和技术,主要内容包括 XMLHttpRequest对象及其属性和方法、发送请求和处理响应、构建完备的Ajax开发工具、使用JsUnit测试JavaScript、分析 JavaScript调试工具和技术,以及Ajax开发模式...
### Ajax基础教程知识点详解 #### 第1章:Ajax简介 - **1.1 Web应用简史** Web应用的历史可以追溯到互联网的早期发展阶段。从最初的文本交换到图形界面的引入,再到如今的动态交互体验,Web技术经历了翻天覆地的...
jsUnit 是一个专门用于 JavaScript 的单元测试框架,版本 2.2 提供了更稳定和强大的测试支持。在本篇文章中,我们将深入探讨 JavaScript 单元测试的重要性和 jsUnit 2.2 的关键特性,以及如何有效地使用它进行测试。...
本书重点介绍Ajax及相关的工具和技术,主要内容包括XMLHttpRequest对象及其属性和方法、发送请求和处理响应、构建完备的Ajax开发工具、使用JsUnit测试JavaScript、分析JavaScript调试工具和技术,以及Ajax开发模式和...
要开始使用JSUnit,你需要创建测试用例类,继承自JSUnit提供的基础测试类,如`JSUnit.TestCase`。然后,你可以定义一系列测试方法,每个方法代表一个特定的测试点。这些方法通常以`test`开头,例如`testAddition`。...
本书重点介绍Ajax及相关的工具和技术,主要内容包括XMLHttpRequest对象及其属性和方法、发送请求和处理响应、构建完备的Ajax开发工具、使用JsUnit测试JavaScript、分析JavaScript调试工具和技术,以及Ajax开发模式和...