JavaScript单元测试与CruiseControl.NET集成

5
我正在寻找一个可以为JS提供单元测试的框架。我之后需要将其与CruiseControl.NET集成。我有很多使用JS的ASP网站,需要自动化测试。例如,我曾经使用过本地的JSUnit(也可能是其他框架),这对我来说非常简单,但我不知道如何将其与CC.NET集成。也许你能向我展示如何开始?注意:必须使用CC.NET,但单元测试框架未指定。
1个回答

3
我知道这是一个相当古老的问题,但我有类似的兴趣,所以我想发布一个答案。我假设你正在编写面向对象风格的JavaScript,并希望测试这些对象。
人们通常推荐的解决方案是运行JsTestDriver,这确实是一个很棒的工具;但是,它需要在您的计算机上安装JVM以及构建服务器。除了需要JVM之外,JsTestDriver仍然依赖于运行一个或多个“从属”浏览器。就我的个人意见而言,如果单元测试JavaScript对象是重点,那么这不应该是一个问题。如果重点是UI测试,则使用诸如WatiN之类的工具并且在我看来这是一种不同类型的测试。浏览器应该像使用JSMockJsMockito(我最喜欢)来模拟任何其他视图一样。
为此,我多年来一直使用Windows Script Host运行我的JavaScript单元测试。这有几个优点:
  1. 不需要浏览器(对我来说是好事)。
  2. CScript已经在每台Windows机器上自XP以来就存在,因此无需安装。
  3. 在后台进程中运行,并且在运行测试时不需要交互式UI。
  4. 由于在MSTest、NUnit或xUnit等内部运行,与CC.NET、Hudson或TeamCity集成就像作为构建的一部分运行您的单元测试一样容易。
  5. 通过在调试器中运行单元测试来提供完整的调试支持。

当然也有一些缺点:

  1. 运行单元测试的计算机必须具有生成新进程(CSCript)以实际运行测试的能力(尚未出现问题)。
  2. 比运行常规单元测试慢(如果单独运行,则在旧双核上每分钟略高于1,000次 - 即未捆绑在单个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编写普通单元测试一样。


我不明白 - 你必须编写C#代码来包装每个JavaScript测试,还是你在C#中编写测试? - JonnyRaa
@Johnny 上面的例子是用C#代码包装JavaScript测试,但这不是首选方法...在Wiki https://github.com/cbaxter/JSTest.NET/wiki中可以找到与xUnit/nUnit/MSTest的清洁集成,并允许使用C#测试工具包编写JavaScript测试。还可以在https://github.com/cbaxter/JSTest.NET/tree/master/src/Examples中找到示例。 - Chris Baxter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接