日期:2014-05-16  浏览次数:20531 次

高效JavaScript单元测试
一个损坏的JavaScript代码示例

Web应用程序面临的一个最大挑战是支持不同版本的Web浏览器。能在Safari上运行的JavaScript代码不一定能在Windows? Internet Explorer (IE)、Firefox或Google Chrome上运行。这个挑战的根源是呈现层中的JavaScript代码从一开始就没有进行测试。如果没有对代码进行单元测试,那么在升级或支持新浏览器后,组织可能需要花钱反复测试Web应用程序。本文将展示如何通过高效的JavaScript代码单元测试降低测试成本。

一个常见用例是登录表单JavaScript验证。考虑清单1中的表单。

清单 1.登录表单

?<FORM> ?    <table> ?        <tr> ?            <td>Username</td> ?            <td><input type="text" id="username"/></td> ?            <td><span id="usernameMessage"></span></td> ?        </tr> ?        <tr> ?            <td>Password</td> ?            <td><input type="password" id="password"/></td> ?            <td><span id="passwordMessage"></span></td> ?        </tr>     ?        <tr> ?            <td><input type="button" onclick="new appnamespace.  ?            ApplicationUtil().validateLoginForm()" value="Submit"/></td> ?        </tr> ?    </table> ?</FORM> 这个表单很简单,仅包含用户名和密码字段。单击提交按钮时,将通过ApplicationUtil执行一个特定的表单验证。以下是负责验证HTML表单的JavaScript对象。清单2显示了ApplicationUtil对象的代码。

清单 2.损坏的ApplicationUtil对象代

?appnamespace = {};  ? ?appnamespace.ApplicationUtil = function() {};  ? ?appnamespace.ApplicationUtil.prototype.validateLoginForm =  function(){  ?    var error = true;  ?    document.getElementById("usernameMessage").innerText = "";  ?    document.getElementById("passwordMessage").innerText = "";    ? ?    if (!document.getElementById("username").value) {  ?        document.getElementById("usernameMessage").innerText =   ?        "This field is required";  ?        error = false;  ?    }  ?      ?    if (!document.getElementById("password").value) {  ?        document.getElementById("passwordMessage").innerText =   ?        "This field is required";  ?        error = false;  ?    }         ? ?    return error;         ?}; 在清单 2中,ApplicationUtil对象提供一个简单验证:用户名和密码字段都已填充。如果某个字段为空,就会显示一条错误消息:This field is required。

上面的代码能够在Internet Explorer 8和Safari 5.1上工作,但无法在 Firefox 3.6 上工作,原因是Firefox不支持innerText属性。通常,(上述代码和其他类似JavaScript代码中的)主要问题是不容易发现编写的JavaScript代码是不是跨浏览器兼容的。

这个问题的一个解决方案是进行自动化单元测试,检查代码是不是跨浏览器兼容。

JsTestDriver

JsTestDriver library是最好的JavaScript单元测试框架之一,它为JavaScript代码提供了跨浏览器测试。

捕获不同的浏览器之后,服务器会负责将JavaScript测试用例运行程序代码加载到浏览器中。可以通过命令行捕获浏览器,也可以通过将浏览器指向服务器URL来捕获浏览器。一旦捕获到浏览器,该浏览器就被称为从属浏览器。服务器可以加载JavaScript代码,在每个浏览器上执行测试用例,然后将结果返回给客户端。

客户端(命令行)需要以下两个主要项目:

?JavaScript文件,即源文件和测试文件
?配置文件,用于组织源文件和测试文件的加载
这个架构比较灵活,允许单个服务器从网络中的其他机器捕获任意数量的浏览器。例如,如果您的代码在Linux上运行但您想针对另一个Windows