【问题标题】:JavaScript Unit Testing integrated with CruiseControl.NET与 CruiseControl.NET 集成的 JavaScript 单元测试
【发布时间】:2010-07-07 08:18:08
【问题描述】:

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

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

【问题讨论】:

    标签: javascript unit-testing cruisecontrol.net


    【解决方案1】:

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

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

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

    1. 不需要浏览器(对我来说这是一件好事)。
    2. 自 XP 以来,每台 Windows 机器上都已安装了 CScript;所以没有什么可安装的。
    3. 在后台进程中运行,运行测试时不需要交互式 UI。
    4. 由于在 MSTest、NUnit 或 xUnit 等内部运行,因此与 CC.NET、Hudson 或 TeamCity 集成就像在构建过程中运行单元测试一样简单。
    5. 只需在调试器中运行单元测试即可获得完整的调试支持。

    当然有几个缺点:

    1. 运行单元测试的机器必须能够生成新进程 (CSCript) 才能实际运行测试(尚未成为问题)。
    2. 比运行常规单元测试要慢(如果单独运行,则在较旧的双核上每分钟超过 1000 次 - 即,不捆绑在单个 CSCript 进程中)。

    使用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。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-05
    • 2010-09-21
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    • 2012-01-01
    • 1970-01-01
    相关资源
    最近更新 更多