簡體   English   中英

與CruiseControl.NET集成的JavaScript單元測試

[英]JavaScript Unit Testing integrated with CruiseControl.NET

我正在尋找為JS提供單元測試的框架。 后來,我將不得不將它與CruiseControl.NET集成。 我有很多使用JS的asp網站,我需要自動化測試。 例如,我使用本地JSUnit(可能是其他框架),這對我來說很容易,但我不知道如何將它與CC.NET集成。 也許你可以告訴我如何開始?

注意:它必須是CC.NET,未指定單元測試的框架

我意識到這是一個相當古老的問題,但我有類似的興趣所以我想我會發布一個答案,無論如何。 我假設您正在編寫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. 只需在調試器中運行單元測試即可獲得完全調試支持。

當然有幾個缺點:

  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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM