public TestRun() { Result = new TestResult(); }
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; }