一般单元测试JavaScript针对不同浏览器的概念/实践?

时间:2009-08-31 00:58:03

标签: javascript unit-testing continuous-integration cross-browser

我一直在用强类型语言编写单元测试,我对它有一个很好的理解。在JavaScript中编写单元测试以验证某些功能在某些浏览器中是否正常工作时,我将重新进行手动测试。我不知道它是如何工作的。 因为JavaScript旨在缩小数据与演示文稿之间的差距,并使其更具交互性。一切都在浏览器中发生,而且更多的是与UI有关。所以我假设如果我要编写单元测试,我会写一些像(在伪代码中):

run function A
check DOM if certain element has been created
  if not then fail
check if element is visible
  if not then fail
check for the content of that element
  if null then fail
etc…

编写这些测试对我来说似乎是“硬编码”,缺少的是测试无法判断它是否已正确呈现,它只进行纯粹的功能测试。所以我想知道是否有人可以向我解释JavaScript中正确的测试程序是什么,如何构建自动化以及这样做的一些一般概念。我只是看着John Resig's project testswarm,但还没弄明白它是什么。我现在也在阅读QUnit

我正在寻找一些关于我可以开始的概念/实践的介绍性材料。我不是在寻找特定的库或工具,除非他们对这些概念有很好的介绍。

感谢。

5 个答案:

答案 0 :(得分:4)

这绝对是一个令人困惑和动态的网络开发领域。在我看来,JS测试有一些重要的特征区别:

  • 纯单元测试,测试普通的Javascript代码。你可以断言a+b=3或其他什么。我们只有一些适合这一类别的问题。讨论选项时,JSUnit(JUnit端口)有很多替代方案。他们分解为TDD与BDD并在这些类别中命名选择。
  • Javascript + DOM测试。如今编写的代码中有很多是关于操纵DOM的。例如。 assertEqual('<a><div /></a>', $('div').wrap('a'));对于基于DOM的JS测试,您需要转到浏览器内测试,或者使用像env.js这样的库。
  • 还有嘲笑&amp;存根(烟雾),异步和其他助手

有两个地方可以运行测试:

  • 浏览器外测试(通常运行速度更快,因此可以在TDD环境中使用)
  • 浏览器内测试(更慢,更复杂,但提供更准确的跨浏览器测试结果)

Selenium在浏览器中运行,因此非常适合集成测试。如果你没有其他工作,这是一个很好的起点。它已经存在了几年,并支持大多数流行的浏览器和语言。观看a screencast like this可能会有所帮助。而this documentation可能会让你了解测试的样子。还有很多其他的教程和截屏视频,但其中很多都陷入了你不关心的技术难题中,所以你必须有选择性。

最后,这是blue ridge的一个示例,它是为Rails进行浏览器外测试(以及手动浏览器内测试)的工具集合:

Screw.Unit(function() {
    describe("Your application javascript", function() {
        it("accesses the DOM from fixtures/application.html", function() {
            expect($$('.select_me').length).to(equal, 2);
        });
    });
});

这是使用类似rspec的语法测试测试的单个测试,其中有几个元素。希望这有帮助!

答案 1 :(得分:2)

检查jsTestDriver。我认为这是最好的之一:

  

JsTestDriver的目标是构建一个   JavaScript测试运行者:

     

易于与连续集成   构建系统并允许运行   快速测试多个浏览器   缓解TDD风格的发展。

http://code.google.com/p/js-test-driver/

答案 2 :(得分:1)

您可能需要考虑使用JavaScript的演示者模式,并使用简单的单元测试。 Google测试博客有一些不错的资源。

我从这里开始:

http://googletesting.blogspot.com/2009/02/with-all-sport-drug-scandals-of-late.html

我已经在我的所有UI代码的Flex(ActionScript)项目中完成了这项工作,并发现它一直运行良好。您希望隔离您的功能,以避免测试浏览器供应商已广泛测试的内容。

答案 3 :(得分:0)

我有时会听到Selenium。我从来没有用过它,但也许它可以帮到你。

  

Selenium Remote Control(RC)运行您的   在多个浏览器中测试和   平台。调整您的测试   首选语言。

我还发现了一篇博客文章:Unit Testing in JavaScript,其中提及:Looking for a better JavaScript unit test tool

答案 4 :(得分:0)

您可以尝试使用Test Swarm