可以通过TFS构建使用Karma

时间:2013-04-16 00:17:39

标签: tfs karma-runner

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

此致 君

2 个答案:

答案 0 :(得分:9)

这是我使用C#helper类在TFS中运行业力的伪代码。基本思路是:

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

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

答案 1 :(得分:1)

自最初的问答以来,已经发生了很多变化。

但是,我们通过运行Grunt任务让我们的TFS版本中运行了Karma(我确信Gulp /你可以使用任何任务运行程序都可以实现这一点)。我们之前使用的是C#,但最近改变了。

  1. 运行grunt build任务。
  2. 之后添加Grunt任务
  3. 指向gruntfile.js的文件路径并运行test任务。此任务将运行karma:single。 grunt-cli位置可能是node_modules/grunt-cli/bin/grunt

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

  4. 添加“发布测试结果”步骤。测试结果文件= **/*.trx
  5. More information about publishing Karma Test Results