在TFS构建中使用业力的可能性

在TFS构建中使用业力的可能性,tfs,karma-runner,Tfs,Karma Runner,我是新约者(现在是业力)。但是我发现它对于自动跨浏览器JS测试来说非常强大。所以我想知道是否有可能将其作为TFS构建过程的一部分来进行自动JS代码单元测试?如果有人以前有经验,请告诉我们注意什么,这样我们就不会走错路了 问候,, Jun这是我使用C#helper类在TFS中运行karma的伪代码。基本思想是: 使用C#单元测试来使用Karma测试js文件 捕获业力的输出以在构建日志中显示 使用单独的过程运行业力 将所有Karma文件打包到一个zip文件中,将其解压缩到每个构建的临时文件夹中,这样

我是新约者(现在是业力)。但是我发现它对于自动跨浏览器JS测试来说非常强大。所以我想知道是否有可能将其作为TFS构建过程的一部分来进行自动JS代码单元测试?如果有人以前有经验,请告诉我们注意什么,这样我们就不会走错路了

问候,,
Jun

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

  • 使用C#单元测试来使用Karma测试js文件
  • 捕获业力的输出以在构建日志中显示
  • 使用单独的过程运行业力
  • 将所有Karma文件打包到一个zip文件中,将其解压缩到每个构建的临时文件夹中,这样不同版本Karma的构建就不会相互冲突
  • 生成后清理临时文件夹
  • -


    从最初的问题和答案开始,情况发生了很大变化

    然而,我们已经通过运行Grunt任务在TFS构建中运行了Karma(我相信Gulp/任何您拥有的任务运行程序都可以实现这一点)。我们以前使用C#,但最近有所改变

  • 运行
    grunt构建
    任务
  • 在此之后添加一个Grunt任务
  • 将文件路径指向
    grunfile.js
    并运行
    测试任务。此任务将运行
    karma:single
    。grunt cli位置可以是
    节点\模块/grunt cli/bin/grunt

    grunt.registerTask('test')[
    ‘因果报应:单身’
    ]);

  • 添加发布测试结果步骤。测试结果文件=
    ***.trx

  • 我会非常乐意阅读有关这方面的反馈。我也希望在TFS构建期间运行Karma测试。你在这方面有什么进展吗?是的,当然。现在,我有一个用C#编写的web项目,用于后端,Html/JS用于前端。我刚刚创建了一个TestRunner类,用于在TFS服务器上运行Karma。有关详细信息,请参阅我对自己的回答。谢谢,这很有趣。但是,您不显示如何检查单元测试是否通过。我的意思是,如果某个Karma测试失败了,您如何确保您的构建会失败?在任何情况下,任何Karma测试失败,我认为Karma TestRunner都不会返回0退出代码。那么单元测试将失败,从而导致整个构建。ExecuteConsoleProcess方法的内容是什么?@Marius很抱歉没有及时回复,它只是使用System.Diagnostics.process在路径中创建了一个控制台进程,并为Karma传入了必要的参数,例如--“远程调试器端口”等。请记住,您需要在上述代码中将OutputDataReceived处理程序与OutputDataReceived函数连接起来。@bigbearzhu--谢谢您的回答。我试着运行一个bat文件,并且能够得到输出。0-所有测试均通过,1-部分测试失败。但我也想知道哪些测试失败了,这会让开发人员知道哪些代码需要修复。这能做到吗?谢谢
    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);
                }
            }
        }
    }