private TestRunResult RunInternal(TestRun testRun, ITestRunLogger logger, out TestRunExecutionContext context) { if (testRun == null) { throw new ArgumentNullException(nameof(testRun)); } if (logger == null) { logger = new ConsoleTestRunLogger(); } logger.LogWithTime($"Started to run \"{testRun.Name}\" test."); context = new TestRunExecutionContext { StartedAt = DateTime.Now, Logger = logger }; Initialize(context); context.Logger.LogWithTime("Run OnBeforeTestRun."); OnBeforeTestRun(context); var result = new TestRunResult(testRun.Name); context.Logger.LogWithTime("Run Test."); InvokeTestRun(testRun, context, result, logger); return(result); }
private void InvokeStep(ITestRunStep step, TestRunExecutionContext context, TestRunResult result, ITestRunLogger logger) { context.Step = step; try { step.Run(context); } catch (TestRunAssertException) { result.AddStep(new TestRunStepResult(context.StepNumber, step.ToString(), false)); throw; } catch (Exception ex) { result.IsSuccess = false; if (context.FirstException == null) { result.FailException = ex; context.FirstException = ex; } else { context.LastException = ex; } } result.AddStep(new TestRunStepResult(context.StepNumber, step.ToString(), result.IsSuccess)); }
/// <summary> /// Dump result state to logger. /// </summary> /// <param name="logger">Logger to be used.</param> public void Dump(ITestRunLogger logger) { logger.Log(new string('-', 96)); logger.Log(string.Format("{0,-90}{1,6}", TruncateString(Name, 90), GetSuccessString(IsSuccess))); foreach (TestRunStepResult step in Steps) { logger.Log(string.Format("{0,-4}{1,-86}{2,6}", "#" + step.StepNum, TruncateString(step.Name, 86), GetSuccessString(step.IsSuccess))); } logger.Log(new string('-', 96)); }
/// <summary> /// Run test run. /// </summary> /// <param name="testRun">Test run.</param> /// <param name="logger">Logger. Console is used by default.</param> /// <returns>Test run result.</returns> public virtual TestRunResult Run(TestRun testRun, ITestRunLogger logger = null) { TestRunExecutionContext context = null; try { return(RunInternal(testRun, logger, out context)); } finally { context?.Logger.LogWithTime("Run OnAfterTestRun."); OnAfterTestRun(context); } }
/// <summary> /// Run multiple test runs from test run loader. /// </summary> /// <param name="testRunLoader">Test run loader.</param> /// <param name="logger">Logger to be used.</param> /// <returns>Results.</returns> public virtual IList <TestRunResult> Run(ITestRunLoader testRunLoader, ITestRunLogger logger = null) { if (testRunLoader == null) { throw new ArgumentNullException(nameof(testRunLoader)); } if (logger == null) { logger = new ConsoleTestRunLogger(); } var results = new List <TestRunResult>(); foreach (TestRun testRun in testRunLoader.Get()) { Run(testRun, logger); } return(results); }
/// <summary> /// Run test run with assert method. OnAfterTestRun will be called afterwards. /// </summary> /// <param name="testRun">Test run.</param> /// <param name="assert">Assert method.</param> /// <param name="logger">Logger. Console is used by default.</param> /// <returns>Test run result.</returns> public virtual TestRunResult RunWithAssert( TestRun testRun, Action <TestRun, TestRunResult> assert, ITestRunLogger logger = null) { TestRunExecutionContext context = null; try { var result = RunInternal(testRun, logger, out context); context.Logger.LogWithTime("Run asserts."); assert(testRun, result); return(result); } finally { context?.Logger.LogWithTime("Run OnAfterTestRun."); OnAfterTestRun(context); } }
private void InvokeTestRun(TestRun testRun, TestRunExecutionContext context, TestRunResult result, ITestRunLogger logger) { context.TestRun = testRun; context.ServiceProvider = ServiceProviderFactory.Create(); OnBeforeTestRun(context); try { int stepNumber = 1; foreach (ITestRunStep testRunStep in testRun.Steps) { context.StepNumber = stepNumber++; InvokeStep(testRunStep, context, result, logger); } } finally { context.Step = null; var disposableServiceProvider = context.ServiceProvider as IDisposable; disposableServiceProvider?.Dispose(); OnAfterTestRun(context); } }
/// <summary> /// Log text with current date time prepend. /// </summary> /// <param name="logger">Logger instance.</param> /// <param name="log">Log text.</param> public static void LogWithTime(this ITestRunLogger logger, string log) { logger.Log($"[{DateTime.Now:yy-MM-dd hh:mm:ss}] {log}"); }