在客户端测试Javascript
Testing Javascript on Client end
我写了一个实时js应用程序,它有以下堆栈:
- 服务器的Node.js
- Socket.io作为通信层
- JQuery在前端操作dom等
对于#1,我的测试绝对没有问题。我目前正在使用nodeunit,它做得非常好。
对于#3,我在试图弄清楚我的测试方法时遇到了一些小麻烦。
我的浏览器端代码通常是这样的:
var user = {
// Rendered by html
id: null,
roomId: null,
foo: null,
// Set by node server.
socket: null,
clientId: null,
...
}
$('button#ready').click(function() {
socket.emit('READY');
});
socket.on('INIT', function(clientId, userIds, serverName) {
user.clientId = clientId;
user.foo = (serverName == 'bar') ? 'bar' : 'baz';
});
我想测试的主要部分包括检查浏览器端的js是否会在服务器触发带有指定参数的特定数据包时做出相应反应:
即。user.foo=(serverName=='bar')?'bar':'baz'
关于如何处理这一问题,有什么好的建议吗?
看看Mocha。它支持在节点和浏览器中运行。我发现它比其他选择(Jasmine,Vows)要好得多。
此外,我没有运行像Selenium这样的重量级集成设置,而是使用Zombie在一个进程中运行服务器测试和浏览器测试。它允许一些漂亮的集成工作流(比如在浏览器上触发一些东西,然后在服务器上验证效果)。
然而,YMMV作为僵尸依赖于JSDOM(在Javascript中重新实现DOM)。有粗糙的边缘,但修补/固定,东西断裂。如果这是一个问题,请使用真实的浏览器在浏览器中运行Mocha(可能是通过Selenium实现的)。
尽管Pivotal对jasmine的支持有点偶然(最少的新开发,github上有很多未回答的问题/拉取请求),但jasmine是一个非常好的测试客户端代码的工具,主要是因为jasmine jquery。
Jasmine的通用方法非常可靠,Jasmine Jquery有很多很棒的匹配器来测试DOM,以及很棒的DOM沙箱。
我发现客户端测试是一个挑战,主要是因为我必须停止在测试中过于死板和规范。
通常,您应该以一种"模糊"的方式进行客户端测试,过于具体地测试DOM层次结构是一条通往地狱的道路。测试诸如"页面是否包含这些单词"over"div id#mydiv是否包含一个包含3个li的ul,其内容与此regex匹配"
后者是我开始做测试的方式,但我发现它非常耗时和脆弱;如果设计者(我)想打乱结构,可能会不必要地破坏许多测试。解决这个问题的唯一方法是为每个组件创建"小部件",这将是理想的,但正如我所说,非常耗时,这实际上成了我办公室里的一个笑话:"蒂姆,你这周做了多少次测试?2?3?哇,3次测试。干得好。"
无论如何…
通过松散地进行测试,并专注于重要的内容,例如工作流和数据在页面层次结构中特定位置的特定内容上的"存在性",可以获得客户端测试90%的好处。
edit:此外,请确保尽可能地将业务逻辑分解为独立于DOM的单元。这会让你的生活变得更轻松,通常会带来更好的架构,这是一个好处。
编辑2:您可能想了解一下Rails世界是如何使用Capybara/Cucumber或Selenium来实现这一点的。
- 模糊事件的Javascript测试
- 如何使用ReSharper自定义HTML工具进行JavaScript测试
- 如何安装Jasmin:Velocity项目上的javascript测试工具
- javascript测试是否存在两个标志中的任何一个
- 如何使用gulp-test和karma在浏览器中调试Javascript测试文件
- Infovis-针对graph.ready的Javascript测试
- Javascript 测试是否设置了变量
- Javascript 测试中的假日期对象
- Regex:使用javascript测试最后一个单词后的url中是否存在最后一个斜杠
- 使用Phantom.js进行无头Browserify JavaScript测试
- javascript测试用于设置cookie的变量
- 创建一个假DOM以在JavaScript测试套件中进行测试
- 如何使用SeleniumWebDriver通过断点调试Node.js上的javascript测试
- JavaScript测试localStorage是否持久
- javascript测试一个值是否是一个数字和一个大于0的数字
- 针对falsy值的Javascript测试正则表达式
- 使用Mocha.js进行Javascript测试:如何模拟Mocha中的回调
- Javascript测试-通过Javascript触发模式弹出
- Javascript测试-使用Array.prototype以随机顺序显示选项
- 使用 Javascript 测试选定的 asp 列表框项