private void GetValue(Dictionary <string, TmpTestNodeMethod> resultDictionary, XElement test) { try { var result = new TmpTestNodeMethod(test.Attribute("name").Value); result.State = Switch.Into <TestNodeState>() .From(test.Attribute("result").Value) .Case("Pass", TestNodeState.Success) .Case("Skip", TestNodeState.Inactive) .Case("Fail", TestNodeState.Failure) .Default(TestNodeState.Inconclusive); if (result.State != TestNodeState.Success) { result.Message = test.Descendants(XName.Get("message", "")) .Select(d => d.Value).MaySingle().Else(""); result.StackTrace = test.Descendants(XName.Get("stack-trace", "")).Select(d => d.Value).MaySingle().Else(""); result.Message = result.Message + "\n" + result.StackTrace; } resultDictionary.Add(result.Name, result); } catch (Exception e) { _log.Error("Log file parsing error", e); } }
private void GetValue(Dictionary<string, TmpTestNodeMethod> resultDictionary, XElement test) { try { var result = new TmpTestNodeMethod(test.Attribute("name").Value); result.State = Switch.Into<TestNodeState>() .From(test.Attribute("result").Value) .Case("Pass", TestNodeState.Success) .Case("Skip", TestNodeState.Inactive) .Case("Fail", TestNodeState.Failure) .Default(TestNodeState.Inconclusive); if (result.State != TestNodeState.Success) { result.Message = test.Descendants(XName.Get("message", "")) .Select(d => d.Value).MaySingle().Else(""); result.StackTrace = test.Descendants(XName.Get("stack-trace", "")).Select(d => d.Value).MaySingle().Else(""); result.Message = result.Message + "\n" + result.StackTrace; } resultDictionary.Add(result.Name, result); } catch (Exception e) { _log.Error("Log file parsing error", e); } }
public async Task <MutantTestResults> RunTests( string inputFile, string outputFile) { _log.Debug("Running tests on: " + inputFile); try { ProcessResults results = await RunNUnitConsole(_nUnitConsolePath, inputFile, outputFile); _log.Debug("Process finished."); if (!_svc.FileSystem.File.Exists(outputFile)) { string output = results.StandardOutput .Concat(results.StandardError) .Aggregate((a, b) => a + "\n" + b); if (output.Contains("Process is terminated due to StackOverflowException.")) { TmpTestNodeMethod node = new TmpTestNodeMethod("One of the tests."); node.State = TestNodeState.Failure; node.Message = "One of the tests threw StackOverflowException."; _log.Info("XUnit: One of the tests threw StackOverflowException."); return(new MutantTestResults(new List <TmpTestNodeMethod> { node })); } else { throw new Exception("Test results in file: " + outputFile + " not found. Output: " + output); } } else { Dictionary <string, TmpTestNodeMethod> tresults = _parser.ProcessResultFile(outputFile); List <TmpTestNodeMethod> testResults = tresults.Values.ToList(); var count = testResults .Select(t => t.State).GroupBy(t => t) .ToDictionary(t => t.Key, t => t.Count()); _log.Info(string.Format("XUnit test results: Passed: {0}, Failed: {1}, Inconc: {2}", count.GetOrDefault(TestNodeState.Success), count.GetOrDefault(TestNodeState.Failure), count.GetOrDefault(TestNodeState.Inconclusive))); return(new MutantTestResults(testResults)); } } catch (OperationCanceledException) { _log.Error("Test run cancelled."); return(new MutantTestResults(cancelled: true)); } }
public async Task <MutantTestResults> RunTests( string inputFile, string outputFile) { _log.Debug("Running tests on: " + inputFile); try { ProcessResults results = await RunNUnitConsole(_nUnitConsolePath, inputFile, outputFile); if (!_svc.FileSystem.File.Exists(outputFile)) { throw new Exception("Test results in file: " + outputFile + " not found. Output: " + results.StandardOutput.Aggregate((a, b) => a + "\n" + b)); } else { if (results.StandardError.Length > 0 || results.StandardOutput.Any(p => p.Contains("NUnitEngineException:"))) { var stb = new StringBuilder(); stb.Append(results.StandardOutput); stb.Append(results.StandardError); throw new Exception(stb.ToString()); } //it fails when we mutate exe file instead of dll Dictionary <string, MyTestResult> tresults = _parser.ProcessResultFile(outputFile); IList <MyTestResult> testResults = tresults.Values.ToList(); var list = new List <TmpTestNodeMethod>(); foreach (var myTestResult in testResults) { TmpTestNodeMethod node = new TmpTestNodeMethod(myTestResult.Name); node.State = myTestResult.Success ? TestNodeState.Success : TestNodeState.Failure; node.Message = myTestResult.Message + "\n" + myTestResult.StackTrace; list.Add(node); } return(new MutantTestResults(list)); } } catch (OperationCanceledException) { _log.Error("Test run cancelled."); return(new MutantTestResults(cancelled: true)); } }
public Dictionary <string, TmpTestNodeMethod> ProcessResultFile(string fileName) { _log.Debug("Processing result file: " + fileName); var s = new XmlReaderSettings { CheckCharacters = false }; var resultDictionary = new Dictionary <string, TmpTestNodeMethod>(); using (XmlReader reader = XmlReader.Create(fileName, s)) { var doc = XDocument.Load(reader); foreach (XElement testResult in doc.Root.DescendantsAnyNs("UnitTestResult")) { string value = testResult.Attribute("testId").Value; var unitTest = doc.Root.DescendantsAnyNs("UnitTest") .Single(n => n.Attribute("id").Value == value); var testMethod = unitTest.ElementAnyNs("TestMethod"); string methodName = testMethod.Attribute("name").Value; string longClassName = testMethod.Attribute("className").Value; string fullClassName = longClassName.Substring(0, longClassName.IndexOf(",")); var node = new TmpTestNodeMethod(fullClassName + "." + methodName); node.State = TranslateTestResultStatus(testResult.Attribute("outcome").Value); if (node.State == TestNodeState.Failure) { var errorInfo = testResult.DescendantsAnyNs("ErrorInfo").Single(); node.Message = errorInfo.ElementAnyNs("Message").Value; } resultDictionary.Add(node.Name, node); } } return(resultDictionary); }
public Dictionary<string, TmpTestNodeMethod> ProcessResultFile(string fileName) { _log.Debug("Processing result file: " + fileName); var s = new XmlReaderSettings {CheckCharacters = false}; var resultDictionary = new Dictionary<string, TmpTestNodeMethod>(); using(XmlReader reader = XmlReader.Create(fileName, s)) { var doc = XDocument.Load(reader); foreach (XElement testResult in doc.Root.DescendantsAnyNs("UnitTestResult")) { string value = testResult.Attribute("testId").Value; var unitTest = doc.Root.DescendantsAnyNs("UnitTest") .Single(n => n.Attribute("id").Value == value); var testMethod = unitTest.ElementAnyNs("TestMethod"); string methodName = testMethod.Attribute("name").Value; string longClassName = testMethod.Attribute("className").Value; string fullClassName = longClassName.Substring(0, longClassName.IndexOf(",")); var node = new TmpTestNodeMethod(fullClassName + "." + methodName); node.State = TranslateTestResultStatus(testResult.Attribute("outcome").Value); if (node.State == TestNodeState.Failure) { var errorInfo = testResult.DescendantsAnyNs("ErrorInfo").Single(); node.Message = errorInfo.ElementAnyNs("Message").Value; } resultDictionary.Add(node.Name, node); } } return resultDictionary; }
public async Task<MutantTestResults> RunTests( string inputFile, string outputFile) { _log.Debug("Running tests on: " + inputFile); try { ProcessResults results = await RunNUnitConsole(_nUnitConsolePath, inputFile, outputFile); _log.Debug("Process finished."); if (!_svc.FileSystem.File.Exists(outputFile)) { string output = results.StandardOutput .Concat(results.StandardError) .Aggregate((a, b) => a + "\n" + b); if (output.Contains("Process is terminated due to StackOverflowException.")) { TmpTestNodeMethod node = new TmpTestNodeMethod("One of the tests."); node.State = TestNodeState.Failure; node.Message = "One of the tests threw StackOverflowException."; _log.Info("XUnit: One of the tests threw StackOverflowException."); return new MutantTestResults(new List<TmpTestNodeMethod> { node }); } else { throw new Exception("Test results in file: " + outputFile + " not found. Output: " + output); } } else { Dictionary<string, TmpTestNodeMethod> tresults = _parser.ProcessResultFile(outputFile); List<TmpTestNodeMethod> testResults = tresults.Values.ToList(); var count = testResults .Select(t => t.State).GroupBy(t => t) .ToDictionary(t => t.Key, t => t.Count()); _log.Info(string.Format("XUnit test results: Passed: {0}, Failed: {1}, Inconc: {2}", count.GetOrDefault(TestNodeState.Success), count.GetOrDefault(TestNodeState.Failure), count.GetOrDefault(TestNodeState.Inconclusive))); return new MutantTestResults(testResults); } } catch (OperationCanceledException) { _log.Error("Test run cancelled."); return new MutantTestResults(cancelled: true); } }
public async Task<MutantTestResults> RunTests( string inputFile, string outputFile) { _log.Debug("Running tests on: " + inputFile); try { ProcessResults results = await RunNUnitConsole(_nUnitConsolePath, inputFile, outputFile); if (!_svc.FileSystem.File.Exists(outputFile)) { throw new Exception("Test results in file: " + outputFile + " not found. Output: " + results.StandardOutput.Aggregate((a, b) => a + "\n" + b)); } else { Dictionary<string, MyTestResult> tresults = _parser.ProcessResultFile(outputFile); IList<MyTestResult> testResults = tresults.Values.ToList(); var list = new List<TmpTestNodeMethod>(); foreach (var myTestResult in testResults) { TmpTestNodeMethod node = new TmpTestNodeMethod(myTestResult.Name); node.State = myTestResult.Success ? TestNodeState.Success : TestNodeState.Failure; node.Message = myTestResult.Message + "\n" + myTestResult.StackTrace; list.Add(node); } return new MutantTestResults(list); } } catch (OperationCanceledException) { _log.Error("Test run cancelled."); return new MutantTestResults(cancelled: true); } }