// // Copyright © 2018 Ranorex All rights reserved // using System; using System.Collections.Generic; using Ranorex.Core.Testing; using Ranorex.Core.Reporting; namespace Ranorex.AutomationHelpers.Modules { /// /// When placed in a test container with a retry count >= 1, collects all error messages even if one of the retries /// was successful and adds them to the report. /// [TestModule("E4E50BBC-20F8-461F-B39A-863B6F69DE89", ModuleType.UserCode)] public class CollectRetryErrorMessagesModule : ITestModule { private static List errorMessages = new List(); private static string lastTestContainerName; private static int retryIteration; private static bool registered; public CollectRetryErrorMessagesModule() { // Do not delete - a parameterless constructor is required! } void ITestModule.Run() { Mouse.DefaultMoveTime = 300; Keyboard.DefaultKeyPressTime = 100; Delay.SpeedFactor = 1.0; Run(); } private static void Run() { // Delegate must be registered only once if (!registered) { //Messages will be added to the report at the very end of the TestSuite TestSuite.TestSuiteCompleted += LogErrorMessages; registered = true; } // Store name of TestContainer and reset retryIteration in case of new TestContainer if (!string.IsNullOrEmpty(lastTestContainerName)) { if (lastTestContainerName != TestReport.CurrentTestContainerActivity.FullDisplayName) { retryIteration = 1; } else { retryIteration++; } } if (string.IsNullOrEmpty(lastTestContainerName)) { lastTestContainerName = TestReport.CurrentTestContainerActivity.FullDisplayName; retryIteration = 1; } // GetErrorMessages from TestContainer var container = TestReport.CurrentTestContainerActivity; // Only collect error messages if the test run failed if (container.Status == ActivityStatus.Failed) { GetErrorMessages(container); } } /// /// Recursively collects all error messages from given test container /// /// private static void GetErrorMessages(ITestContainerActivity container) { foreach (var containerChild in container.Children) { // Check if TestContainerActivity var testContainerActivity = containerChild as ITestContainerActivity; if (testContainerActivity != null) { GetErrorMessages(testContainerActivity); } // Check if TestModuleActivity var testModuleActivity = containerChild as ITestModuleActivity; if (testModuleActivity != null) { AddErrorMessages( testModuleActivity.TestModuleName, container.FullDisplayName, testModuleActivity.Children); } } } private static void AddErrorMessages( string testModuleActivityFullDisplayName, string containerFullDisplayName, IEnumerable items) { foreach (var testModuleChild in items) { // Check if testModuleChild is ReportItem var reportItem = testModuleChild as ReportItem; if (reportItem != null && (reportItem.Level == ReportLevel.Error || reportItem.Level == ReportLevel.Failure)) { // Store error message for report on test suite completed event errorMessages.Add( string.Format( "Module: {0} | Parent (Iteration): {1}({2}) ReportLevel: {3} | Message: {4}", testModuleActivityFullDisplayName, containerFullDisplayName, retryIteration, reportItem.Level, reportItem.Message)); } } } /// /// Logs all collected error messages to the "After Test Suite" section of the Ranorex report /// private static void LogErrorMessages(object sender, EventArgs e) { // End report TestReport.EndTestModule(); // Report collected error messages foreach (var message in errorMessages) { Report.Info("RetryError", message); } } } }