2013-04-16 11 views
18

Jestem nowy w Testacular (teraz Karma). Zauważyłem jednak, że jest naprawdę potężny i doskonały do ​​automatycznego testowania JS w różnych przeglądarkach. Więc chcę wiedzieć, czy można go używać jako części procedury budowania TFS do przeprowadzania automatycznego testowania jednostek kodu JS? Jeśli ktoś ma wcześniejsze doświadczenie, czy mógłbyś nam powiedzieć, co zwrócić uwagę, abyśmy nie poszli w niewłaściwy sposób.Możliwość używania karmy z kompilacjami TFS

Pozdrowienia, czerwca

+0

Byłbym bardzo intested w Reading Graficznych o tym. Też chciałbym uruchomić testy Karmy podczas budowania TFS. Czy zrobiłeś jakieś postępy w tej sprawie? – Sam

+0

Tak, jasne. W tej chwili mam projekt WWW w języku C# dla zaplecza i Html/JS dla front end. Właśnie utworzyłem klasę testową dla uruchamiania serwera Karma na TFS. Zobacz moją odpowiedź na moje szczegóły. – bigbearzhu

Odpowiedz

9

Oto mój pseudo kod do uruchomienia karmę w TFS przy użyciu C# klasy pomocnika. Podstawową ideą jest:

  1. Użyj testu C#, aby przetestować pliki js za pomocą Karmy.
  2. Uchwyć wyjście Karmy, aby pokazać, że w dzienniku kompilacji.
  3. Użyj oddzielnej procedury, aby uruchomić Karmę.
  4. Spakuj wszystkie pliki Karmy do pliku zip, rozpakuj je do folderu tymczasowego dla każdej kompilacji, aby kompilacje z inną wersją karmy nie były ze sobą w konflikcie.
  5. Wyczyść folder tymczasowy po kompilacji.

-

namespace Test.Javascript.CrossBrowserTests 
{ 
    public class KarmaTestRunner : IDisposable 
    { 
     private const string KarmaPath = @".\node_modules\karma\bin\karma"; 

     private string NodeBasePath { get; set; } 
     private string NodeFullPath { get { return NodeBasePath + @"\node\node.exe"; } } 
     private string NpmFullPath { get { return NodeBasePath + @"\node\npm.cmd"; } } 

     public KarmaTestRunner() 
     { 
      ExtractKarmaZip(); 
      LinkGlobalKarma(); 
     } 

     public int Execute(params string[] arguments) 
     { 
      Process consoleProcess = RunKarma(arguments); 
      return consoleProcess.ExitCode; 
     } 

     public void Dispose() 
     { 
      UnlinkGlobalKarma(); 
      RemoveTempKarmaFiles(); 
     } 

     private void ExtractKarmaZip() 
     { 
      NodeBasePath = Path.GetTempPath() + Path.GetRandomFileName(); 
      byte[] resourceBytes = Assembly.GetExecutingAssembly().GetEmbeddedResourceBytes(typeof(KarmaTestRunner).Namespace + "." + "karma0.9.4.zip"); 

      ZipFile file = ZipFile.Read(resourceBytes); 
      file.ExtractAll(NodeBasePath); 
     } 

     private void LinkGlobalKarma() 
     { 
      ExecuteConsoleProcess(NpmFullPath, "link", "karma"); 
     } 

     private Process RunKarma(IEnumerable<string> arguments) 
     { 
      return ExecuteConsoleProcess(NodeFullPath, new[] { KarmaPath }.Concat(arguments).ToArray()); 
     } 

     private static Process ExecuteConsoleProcess(string path, params string[] arguments) 
     { 
      //Create a process to run karma with arguments 
      //Hook up the OutputDataReceived envent handler on the process 
     } 

     static void OnOutputLineReceived(string message) 
     { 
      if (message != null) 
       Console.WriteLine(message); 
     } 

     private void UnlinkGlobalKarma() 
     { 
      ExecuteConsoleProcess(NpmFullPath, "uninstall", "karma"); 
     } 

     private void RemoveTempKarmaFiles() 
     { 
      Directory.Delete(NodeBasePath, true); 
     } 
    } 
} 

następnie używać go tak:

namespace Test.Javascript.CrossBrowserTests 
{ 
    [TestClass] 
    public class CrossBrowserJSUnitTests 
    { 
     [TestMethod] 
     public void JavascriptTestsPassForAllBrowsers() 
     { 
      using (KarmaTestRunner karmaRunner = new KarmaTestRunner()) 
      { 
       int exitCode = karmaRunner.Execute("start", @".\Test.Project\Javascript\Karma\karma.conf.js"); 
       exitCode.ShouldBe(0); 
      } 
     } 
    } 
} 
+0

Dzięki, to bardzo interesujące. Nie pokazujesz jednak, w jaki sposób sprawdzasz, czy twój test jednostki minął. Mam na myśli to, że jeśli jeden z testów Karmy się nie powiódł, w jaki sposób upewnisz się, że twoja kompilacja się nie powiedzie? – Sam

+0

W każdym razie testy karmy zawiodły, myślę, że KarmaTestRunner nie zwróciłby 0 kodu wyjścia. Wtedy test jednostkowy zakończy się niepowodzeniem, a tym samym całą kompilacją. – bigbearzhu

+0

Jaka jest zawartość metody ExecuteConsoleProcess? – Marius

0

Wiele zmieniło się od pierwotnego pytania i odpowiedzi.

Jednakże, dostaliśmy karmę, aby działała w naszym systemie TFS, wykonując zadanie Grunt (jestem pewien, że to samo jest możliwe z Gulpem/dowolnym biegaczem zadań, który posiadasz). Używaliśmy C# wcześniej, ale ostatnio zmieniliśmy.

  1. Wykonaj zadanie grunt build.
  2. Dodaj zadanie Grunt po tym
  3. punktu ścieżkę pliku do gruntfile.js i uruchomić zadanie test. To zadanie będzie działać pod numerem karma:single. Lokalizacja gruntu-cli może być node_modules/grunt-cli/bin/grunt.

    grunt.registerTask('test', [ 'karma:single' ]);

  4. dodać Publish Wyniki testu krok. Wyniki testu Files = **/*.trx

More information about publishing Karma Test Results

Powiązane problemy