2013-04-16 14 views
18

我是新来的Testacular(现在的Karma)。但是我发现它对于自动跨浏览器JS测试来说非常强大。所以我想知道是否有可能将它作为TFS构建过程的一部分来执行自动JS代码单元测试?如果任何人有以前的经验,请让我们知道要注意什么,以便我们不会采取错误的方式。使用Karma与TFS搭建的可能性

问候, 君

+0

我在关于阅读反馈非常intested。我也想在TFS Build期间运行Karma测试。你有没有在这方面取得进展? – Sam

+0

是的,当然。此时,我在C#中有一个用于后端的Web项目,前端有一个Html/JS。我刚刚创建了一个用于在TFS服务器上运行Karma的测试运行器类。细节请参阅我对自己的回答。 – bigbearzhu

回答

9

这里是我的伪代码使用C#辅助类运行在TFS的业力。基本思想是:

  1. 使用C#单元测试使用Karma测试您的js文件。
  2. 捕获Karma的输出以显示在您的构建日志中。
  3. 使用单独的过程来运行Karma。
  4. 将所有Karma文件打包成一个zip文件,并将其提取到每个构建的临时文件夹中,以便具有不同版本业力的构建不会相互冲突。
  5. 生成后清理临时文件夹。

-

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); 
     } 
    } 
} 

然后使用它是这样的:因为原来的问题和答案

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

谢谢,这非常有趣。然而,你不会显示你是如何检查你的单元测试是否已经通过。我的意思是如果一个Karma测试失败了,你如何确保你的构建失败? – Sam

+0

在任何情况下,任何Karma测试失败,我认为KarmaTestRunner不会返回0退出代码。然后单元测试会失败,因此整个构建。 – bigbearzhu

+0

ExecuteConsoleProcess方法的内容是什么? – Marius

0

发生了很多变化。然而,我们已经通过运行一个Grunt任务(我敢肯定,Gulp /任何你所拥有的任务跑步者也可能会这样做)获得了Karma在我们的TFS构建中运行。我们之前使用过C#,但最近发生了变化。

  1. 有一个grunt build任务运行。
  2. 添加咕噜任务
  3. 点后的文件路径您gruntfile.js和运行test任务。该任务将运行karma:single。咕噜声的位置可能是node_modules/grunt-cli/bin/grunt

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

  4. 添加发布测试结果的一步。测试结果文件= **/*.trx

More information about publishing Karma Test Results