Beispiel #1
0
 public TestRun()
 {
     Result = new TestResult();
 }
Beispiel #2
0
        public async Task<TestResult> Run(TestRun run)
        {
            var test = run.Case;
            var agent = run.Queue.Agent;
            var session = run.Queue.Session;
            var build = session.Build;

            //get test's feature file
            string workFile = Path.Combine(build.LocalPath, test.Location);
            string outputFileName = test.FullName + ".html";
            var outputFile = new FileInfo(Path.Combine(session.LocalPath, outputFileName));
            if (!outputFile.Directory.Exists)
                outputFile.Directory.Create();

            //find ruby folder for startProgram
            //const string startProgram = @"c:\ruby200-x64\bin\cucumber.bat";
            var rubyDir = new DirectoryInfo(@"c:\").GetDirectories("ruby*", SearchOption.TopDirectoryOnly).FirstOrDefault();
            if (rubyDir == null) throw new DirectoryNotFoundException("ruby installation not found on " + agent.Name);
            string startProgram = string.Format(@"c:\{0}\bin\cucumber.bat", rubyDir.Name);
            string startProgramArgs = string.Format("\"{0}\" --tag @Name_{1} -f html --out \"{2}\"", workFile, test.Name, outputFile.FullName);

            var pi = new ProcessStartInfo(startProgram, startProgramArgs);
            pi.EnvironmentVariables.Add(session.Config.Key, session.Config.Value);
            await ProcessEx.RunAsync(pi);

            outputFile.Refresh();
            if (!outputFile.Exists)
                throw new FileNotFoundException("result file not found", outputFile.FullName);

            //parse result from output file
            string text = null;
            int attempts = 0;
            while (text == null && attempts++ < 5)
            {
                try
                {
                    using (var sr = outputFile.OpenText())
                    {
                        text = await sr.ReadToEndAsync();
                    }
                }
                catch (Exception ex)
                {
                    Trace.TraceError("error when parsing result file, retry: {0}, error: {1}", attempts, ex.ToString());
                }
            }
            var summaryMatch = RxSummary.Match(text);
            var failMatch = RxFail.Match(text);

            var result = new TestResult
            {
                Output = Path.Combine(session.GetPathOnAgent(agent), outputFileName),
                Summary = summaryMatch.Groups[1].Value + " " + summaryMatch.Groups[2].Value,
                PassOrFail = !failMatch.Success
            };
            if (result.PassOrFail == false)
            {
                var q = from Match m in RxFailDetails.Matches(failMatch.Groups[1].Value)
                        select m.Groups[1].Value;
                result.ErrorDetails = string.Join("\n", q);
            }

            return result;
        }