与CruiseControl.NET集成的JavaScript单元测试

时间:2010-07-07 08:18:08

标签: javascript unit-testing cruisecontrol.net

我正在寻找为JS提供单元测试的框架。后来,我将不得不将它与CruiseControl.NET集成。我有很多使用JS的asp网站,我需要自动化测试。例如,我使用本地JSUnit(可能是其他框架),这对我来说很容易,但我不知道如何将它与CC.NET集成。也许你可以告诉我如何开始?

注意:它必须是CC.NET,未指定单元测试的框架

1 个答案:

答案 0 :(得分:3)

我意识到这是一个相当古老的问题,但我有类似的兴趣所以我想我会发布一个答案,无论如何。我假设您正在编写OO样式的JavaScript并希望测试这些对象。

人们推荐的常见解决方案是运行JsTestDriver,这绝对是一个很好的工具;话虽这么说,它需要在您的机器和构建服务器上安装JVM。除了需要JVM之外,JsTestDriver仍然依赖于运行一个或多个“Slave”浏览器。就个人而言,我认为单元测试JavaScript对象时不应该担心。如果焦点是UI测试,那么使用诸如WatiN之类的工具,在我看来是一种不同类型的测试。浏览器应该模拟出来,就像使用JSMockJsMockito(我最喜欢)模拟任何其他视图一样。

为此,我使用Windows Script Host来运行我的JavaScript单元测试多年。这有几个好处:

  1. 不需要浏览器(对我来说这是一件好事)。
  2. 自XP以来,CScript已经出现在每台Windows机器上;所以无需安装。
  3. 在后台进程中运行,在运行测试时不需要交互式UI。
  4. 由于在MSTest,NUnit或xUnit等内部运行,与CC.NET,Hudson或TeamCity集成就像在构建中运行单元测试一样简单。
  5. 只需在调试器中运行单元测试即可获得完全调试支持。
  6. 当然有几个缺点:

    1. 运行单元测试的机器必须能够产生新进程(CSCript)才能实际运行测试(尚未成为问题)。
    2. 运行常规单元测试较慢(如果单独运行,则在较旧的双核上稍微超过1,000 /分钟 - 即,未在单个CSCript进程中捆绑在一起)。
    3. 使用JSTest.NET(我已经使用多年的方法,但刚刚在网上发布),您最终会得到一个可能与以下内容类似的测试夹具:

      using JSTest;
      using JSTest.ScriptLibraries;
      using Xunit;
      
      namespace JSTest.Sample
      {
        public class EventDispatcherTests
        {
          private readonly TestScript _testScript = new TestScript();
      
          public EventDispatcherTests()
          {
            //Append File(s) Under Test.
            _testScript.AppendFile(@"..\..\..\Web\Scripts\eventDispatcher.js");
      
            //Append Mock/Assertion libraries.
            _testScript.AppendBlock(new JsHamcrestLibrary());
            _testScript.AppendBlock(new JsMockitoLibrary());
      
            //Append Common "Setup" Scripts.
            _testScript.AppendBlock(@"var dispatcher = new EventDispatcher();
                                      var mockHandler = JsMockito.mockFunction();
                                      var mockPredicate = JsMockito.mockFunction();
                                      var fakeEvent = { eventType: 'CommentAdded', data: 'Sample Comment' };
                                    ");
          }
      
          [Fact]
          public void ProcessEventInvokesAttachedHandler()
          {
            ...
          }
      
          [Fact]
          public void ProcessEventGracefullyHandlesPredicateException()
          {
            _testScript.RunTest(@"var mockPredicateAlternate = JsMockito.mockFunction();
      
                                  JsMockito.when(mockPredicateAlternate)(fakeEvent).thenThrow('MyException');
      
                                  dispatcher.attachListener(mockHandler, mockPredicateAlternate);
                                  dispatcher.processEvent(fakeEvent);
      
                                  JsMockito.verify(mockPredicateAlternate)(fakeEvent);
                                  JsMockito.verifyZeroInteractions(mockHandler);
                                ");
          }
        }
      }
      

      这种方法对我很有用,设置非常简单。基本上,它就像编写常规单元测试,但使用JavaScript。