可以通过TFS构建使用Karma

big*_*zhu 19 tfs karma-runner

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

问候,君

big*_*zhu 9

这是我使用C#helper类在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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)