用Javascript应该测试什么?


12

在工作中,我们刚刚开始使用基于Javascript的大量应用程序(实际上仍在使用Coffeescript,但仍在使用),我一直在使用JsTestDriver和fabric来实现自动化测试系统。

我们从来没有用这么多的Javascript编写任何东西,所以到目前为止,我们从未进行过任何Javascript测试。我不确定在单元测试中到底应该测试什么。我们已经为各种事物编写了JQuery插件,因此很明显,应该使用JsTestDriver尽可能多地验证它们的正确性,但是我们团队中的其他所有人似乎都认为我们也应该测试页面级Javascript。

我认为我们不应该将页面级Javascript作为单元测试进行测试,而应该使用Selenium之类的系统来验证一切是否按预期进行。我这样做的主要理由是,目前确保页面级Javascript测试通过JsTestDriver失败,因为它们正在尝试访问DOM上可能不存在的元素。

那么,应该使用Javascript对哪些内容进行单元测试?


3
您可以隔离编写到模块中的所有JavaScript代码。然后,您只需测试这些模块的输入和输出。任何处理DOM的模块都意味着您必须测试DOM。使用更好的工具,然后使用jsTestDriver。
雷诺斯

您应该进行单元测试业务逻辑。如果您的业务逻辑和DOM上的元素交织在一起,则说明您存在设计缺陷。从页面元素中尽可能多地提取业务逻辑,以便可以对其进行正确的单元测试。对于DOM元素交互验证,您应该使用Selenium。
maple_shaft

1
@NathanHoad您编写了可以在浏览器中运行的单元测试,nodeunit,qunit和jasmine是明智的工具。在浏览器中运行时,您具有DOM。您可以使用诸如testling之类的工具来自动化浏览器测试。
雷诺斯2011年

1
谢谢。我一直在寻找jsTestDriver,因为它声称可以在浏览器中运行,尽管从技术上讲是正确的,但我发现它与使用QUnit运行并不相同。目前,我一直在使用QUnit和自定义Django调试工具栏面板来开发自己的工具。使用Selenium,我将能够检测失败的测试。另外,我怀疑我的老板会为测试付出代价,尽管看起来确实不错!
内森·霍德

Answers:


4

尽一切可能测试。

纯逻辑可以轻松测试。

如果您的代码与DOM或网络交互,则要困难得多。

如果您可以抽象出一段代码来处理任意DOM元素而不是特定的DOM元素,则可以更轻松地对其进行测试。(使元素在参数上起作用)。

可以通过简单地使用固定数据调用回调函数来测试使用Ajax的代码。我进行了一些测试,在这些测试中我$.ajax用自己的功能改写了代码。只要确保完成后就放回真正的那只!

您会发现,“页面级javascript”实际上意味着“紧密耦合的代码”,如果您将代码的各个部分解耦,则可以独立测试它们。

(Selenium不是一个单元测试工具。它对于高级场景非常有用,但是您不能对其进行测试驱动,并且它不能在隔离的环境中工作。)


jasmine可以模拟函数调用和响应数据,您可以研究它而不是覆盖函数。
史蒂夫

我需要澄清-每个页面上都有函数等。我在谈论更多关于测试内部执行的代码$(document).ready(...)
内森·霍德

1
这完全取决于它的...大小。:-)我觉得您应该可以将其简化为一个经过测试的命名函数。然后,您未经测试的代码就是一行。(现在,这是一个目标,而不是既定目标。实际上,我总是有多行未经测试的代码。)
Sean McMillan

@SeanMcMillan-我发现很难测试仅影响DOM的应用程序部分,例如,仅将多个事件绑定到某些DOM元素的函数。您将如何检查这些事件是否正确编写?单元测试无法执行的操作,而是真正的浏览器单击和检查(使用硒或其他方法)
vsync

@vsync:例如,您可以轻松地将点击处理程序附加到给定的DOM元素上进行测试。我认为无法测试'click'是正确的处理程序,并且已经将其附加到正确的元素上了。
肖恩·麦克米兰2015年

5

测试算法。与GUI密切相关的部分更依赖于特定的浏览器,因此必须使用类似硒的utils进行测试。

当然,您的代码必须包含作为独立代码段的算法,如果没有,那么几乎不可能进行单元测试。

jQuery插件btw并非易于单元测试。


所有的好点!我同意,根据编写方式的不同,它们也不容易进行单元测试。
内森·霍德

-1

我曾经使用过Java,因此我发现单元测试Java比JavaScript单元测试更容易,因为Java更严格。

我认为测试驱动的开发是最好的,所以我也在探索如何对JavaScript进行单元测试。在Java中,我模拟了与数据库,数据访问对象建立连接的代码,并将其与JavaScript中更改DOM的代码和进行AJAX调用服务器的代码进行了比较。

我要说的是,在我看来,应该测试的是明确的逻辑。例如,您不希望在运行单元测试时进行AJAX调用,因为(a)您需要服务器在运行,并且(b)速度很慢,并且单元测试的准则之一就是必须超快,这样开发人员就不会避免像每分钟一样运行它们。

另一个准则是持续集成过程发送一封电子邮件,指出它发现单元测试失败。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.