/// <summary> /// runs the given test /// </summary> /// <param name="testPath"></param> /// <param name="errorReason"></param> /// <param name="runCancelled">cancellation delegate, holds the function that checks cancellation</param> /// <returns></returns> public TestRunResults RunTest(string testPath, ref string errorReason, RunCancelledDelegate runCancelled) { TestRunResults runDesc = new TestRunResults(); ConsoleWriter.ActiveTestRun = runDesc; ConsoleWriter.WriteLine(DateTime.Now.ToString(Launcher.DateFormat) + " Running: " + testPath); runDesc.ReportLocation = Helper.CreateTempDir(); runDesc.ErrorDesc = errorReason; runDesc.TestPath = testPath; runDesc.TestState = TestState.Unknown; if (!Helper.IsServiceTestInstalled()) { runDesc.TestState = TestState.Error; runDesc.ErrorDesc = string.Format(Resources.LauncherStNotInstalled, System.Environment.MachineName); ConsoleWriter.WriteErrLine(runDesc.ErrorDesc); Environment.ExitCode = (int)Launcher.ExitCodeEnum.Failed; return runDesc; } _runCancelled = runCancelled; if (!_stCanRun) { runDesc.TestState = TestState.Error; runDesc.ErrorDesc = Resources.STExecuterNotFound; return runDesc; } string fileName = Path.Combine(_stExecuterPath, STRunnerName); if (!File.Exists(fileName)) { runDesc.TestState = TestState.Error; runDesc.ErrorDesc = Resources.STExecuterNotFound; ConsoleWriter.WriteErrLine(Resources.STExecuterNotFound); return runDesc; } Stopwatch s = Stopwatch.StartNew(); runDesc.TestState = TestState.Running; if (!ExecuteProcess(fileName, String.Format("{0} \"{1}\" {2} \"{3}\" ", STRunnerTestArg, testPath, STRunnerReportArg, runDesc.ReportLocation), ref errorReason)) { runDesc.TestState = TestState.Error; runDesc.ErrorDesc = errorReason; runDesc.Runtime = s.Elapsed; return runDesc; } else { runDesc.ReportLocation = Path.Combine(runDesc.ReportLocation, "Report"); } runDesc.Runtime = s.Elapsed; return runDesc; }
private testsuite CreateXmlFromLRRunResults(TestRunResults testRes) { testsuite lrts = new testsuite(); int totalTests = 0, totalFailures = 0, totalErrors = 0; string resultFileFullPath = testRes.ReportLocation + "\\SLA.xml"; if (File.Exists(resultFileFullPath)) { try { XmlDocument xdoc = new XmlDocument(); xdoc.Load(resultFileFullPath); foreach (XmlNode childNode in xdoc.DocumentElement.ChildNodes) { if (childNode.Attributes != null && childNode.Attributes["FullName"] != null) { testRes.TestGroup = testRes.TestPath; testcase lrtc = CreateXmlFromUFTRunResults(testRes); lrtc.name = childNode.Attributes["FullName"].Value; if (childNode.InnerText.ToLowerInvariant().Contains("failed")) { lrtc.status = "fail"; totalFailures++; } else if (childNode.InnerText.ToLowerInvariant().Contains("passed")) { lrtc.status = "pass"; lrtc.error = new error[] { }; } totalErrors += lrtc.error.Length; lrts.AddTestCase(lrtc); totalTests++; } } } catch (System.Xml.XmlException) { } } lrts.name = testRes.TestPath; lrts.tests = totalTests.ToString(); lrts.errors = totalErrors.ToString(); lrts.failures = totalFailures.ToString(); lrts.time = testRes.Runtime.TotalSeconds.ToString(); return lrts; }
public static TestState GetTestStateFromLRReport(TestRunResults runDesc, string[] resultFiles) { foreach (string resultFileFullPath in resultFiles) { string desc = ""; runDesc.TestState = GetTestStateFromLRReport(resultFileFullPath, out desc); if (runDesc.TestState == TestState.Failed) { runDesc.ErrorDesc = desc; break; } } return(runDesc.TestState); }
public static TestState GetTestStateFromUFTReport(TestRunResults runDesc, string[] resultFiles) { try { TestState finalState = TestState.Unknown; foreach (string resultsFileFullPath in resultFiles) { finalState = TestState.Unknown; string desc = ""; TestState state = GetStateFromUFTResultsFile(resultsFileFullPath, out desc); if (finalState == TestState.Unknown || finalState == TestState.Passed) { finalState = state; if (!string.IsNullOrWhiteSpace(desc)) { if (finalState == TestState.Error) { runDesc.ErrorDesc = desc; } if (finalState == TestState.Failed) { runDesc.FailureDesc = desc; } } } } if (finalState == TestState.Unknown) { finalState = TestState.Passed; } if (finalState == TestState.Failed && string.IsNullOrWhiteSpace(runDesc.FailureDesc)) { runDesc.FailureDesc = "Test failed"; } runDesc.TestState = finalState; return(runDesc.TestState); } catch (Exception) { return(TestState.Unknown); } }
/// <summary> /// gets test index given it's name /// </summary> /// <param name="strName"></param> /// <param name="results"></param> /// <returns></returns> public int GetIdxByTestName(string strName, TestSuiteRunResults results) { TestRunResults res = null; int retVal = -1; for (int i = 0; i < results.TestRuns.Count(); ++i) { res = results.TestRuns[i]; if (res != null && res.TestName == strName) { retVal = i; break; } } return(retVal); }
public static TestState GetTestStateFromReport(TestRunResults runDesc) { try { if (!Directory.Exists(runDesc.ReportLocation)) { runDesc.ErrorDesc = string.Format(Resources.DirectoryNotExistError, runDesc.ReportLocation); runDesc.TestState = TestState.Error; return(runDesc.TestState); } //if there is Result.xml -> UFT //if there is sla.xml file -> LR string[] resultFiles = Directory.GetFiles(runDesc.ReportLocation, "Results.xml", SearchOption.TopDirectoryOnly); if (resultFiles.Length == 0) { resultFiles = Directory.GetFiles(runDesc.ReportLocation, "run_results.xml", SearchOption.TopDirectoryOnly); } //resultFiles = Directory.GetFiles(Path.Combine(runDesc.ReportLocation, "Report"), "Results.xml", SearchOption.TopDirectoryOnly); if (resultFiles != null && resultFiles.Length > 0) { return(GetTestStateFromUFTReport(runDesc, resultFiles)); } resultFiles = Directory.GetFiles(runDesc.ReportLocation, "SLA.xml", SearchOption.AllDirectories); if (resultFiles != null && resultFiles.Length > 0) { return(GetTestStateFromLRReport(runDesc, resultFiles)); } //no LR or UFT => error runDesc.ErrorDesc = string.Format("no results file found for " + runDesc.TestName); runDesc.TestState = TestState.Error; return(runDesc.TestState); } catch (Exception e) { return(TestState.Unknown); } }
/// <summary> /// Set the error for a test when the report path is invalid. /// </summary> /// <param name="runResults"> The test run results </param> /// <param name="errorReason"> The error reason </param> /// <param name="testInfo"> The test informatio </param> public static void SetTestReportPathError(TestRunResults runResults, ref string errorReason, TestInfo testInfo) { // Invalid path was provided, return useful description errorReason = string.Format(Resources.InvalidReportPath, runResults.ReportLocation); // since the report path is invalid, the test should fail runResults.TestState = TestState.Error; runResults.ErrorDesc = errorReason; // output the error for the current test run ConsoleWriter.WriteErrLine(runResults.ErrorDesc); // include the error in the summary ConsoleWriter.ErrorSummaryLines.Add(runResults.ErrorDesc); // provide the appropriate exit code for the launcher Environment.ExitCode = (int)Launcher.ExitCodeEnum.Failed; }
/// <summary> /// runs the given test QTP and returns results /// </summary> /// <param name="testResults">the test results object containing test info and also receiving run results</param> /// <returns></returns> private GuiTestRunResult ExecuteQTPRun(TestRunResults testResults) { RunResultsOptions options = CreateRunResultOptions(testResults); if (_runCancelled()) { return(HandleExecutionCanceled(testResults)); } try { ConsoleWriter.WriteLine(string.Format(Resources.FsRunnerRunningTest, testResults.TestPath)); _qtpApplication.Options.Run.RunMode = _uftRunMode; _qtpApplication.Test.Run(options, false, _qtpParameters); WaitForTestExecutionComplete(testResults); if (_runCancelled()) { CloseTARobot(); return(HandleExecutionCanceled(testResults)); } return(AnalyzeLastRunResults(testResults)); } catch (Exception e2) { ConsoleWriter.WriteLine(string.Format(Resources.GeneralErrorWithStack, e2.Message, e2.StackTrace)); CloseTARobot(); GuiTestRunResult result = new GuiTestRunResult(); result.ReportPath = options.ResultsLocation; testResults.TestState = TestState.Error; testResults.ReportLocation = result.ReportPath; if (String.IsNullOrEmpty(testResults.ErrorDesc)) { testResults.ErrorDesc = Resources.QtpRunError; } result.IsSuccess = false; return(result); } }
private void UpdateCounters(TestRunResults test, TestSuiteRunResults testSuite) { if (test.TestState != TestState.Running && test.TestState != TestState.Waiting && test.TestState != TestState.Unknown) { ++testSuite.NumTests; } if (test.TestState == TestState.Failed) { ++testSuite.NumFailures; } if (test.TestState == TestState.Error) { ++testSuite.NumErrors; } }
/// <summary> /// Try to set the custom report path for a given test. /// </summary> /// <param name="runResults"> The test run results </param> /// <param name="testInfo"> The test information </param> /// <param name="errorReason"> The error reason </param> /// <returns> True if the report path was set, false otherwise </returns> public static bool TrySetTestReportPath(TestRunResults runResults, TestInfo testInfo, ref string errorReason) { string testName = testInfo.TestName.Substring(testInfo.TestName.LastIndexOf('\\') + 1) + "_"; string reportLocation = Helper.GetNextResFolder(testInfo.ReportPath, testName); // set the report location for the run results runResults.ReportLocation = reportLocation; try { Directory.CreateDirectory(runResults.ReportLocation); } catch (Exception) { SetTestReportPathError(runResults, ref errorReason, testInfo); return(false); } return(true); }
private GuiTestRunResult AnalyzeLastRunResults(TestRunResults testResults) { GuiTestRunResult result = new GuiTestRunResult { IsSuccess = true }; result.ReportPath = Path.Combine(testResults.ReportLocation, "Report"); string lastError = _qtpApplication.Test.LastRunResults.LastError; //read the lastError if (!String.IsNullOrEmpty(lastError)) { testResults.TestState = TestState.Error; testResults.ErrorDesc = lastError; } // the way to check the logical success of the target QTP test is: app.Test.LastRunResults.Status == "Passed". if (_qtpApplication.Test.LastRunResults.Status.Equals("Passed")) { testResults.TestState = TestState.Passed; } else if (_qtpApplication.Test.LastRunResults.Status.Equals("Warning")) { testResults.TestState = TestState.Passed; testResults.HasWarnings = true; if (Launcher.ExitCode != Launcher.ExitCodeEnum.Failed && Launcher.ExitCode != Launcher.ExitCodeEnum.Aborted) { Launcher.ExitCode = Launcher.ExitCodeEnum.Unstable; } } else { testResults.TestState = TestState.Failed; testResults.FailureDesc = "Test failed"; Launcher.ExitCode = Launcher.ExitCodeEnum.Failed; } return(result); }
private void AnalyzeRunResult(TestRunResults runResult) { //if fail was terminated before this step, continue if (runResult.TestState != TestState.Failed) { if (runResult.TestState != TestState.Error) { Helper.GetTestStateFromReport(runResult); } else { if (string.IsNullOrEmpty(runResult.ErrorDesc)) { if (RunCancelled()) { runResult.ErrorDesc = HpToolsLauncher.Properties.Resources.ExceptionUserCancelled; } else { runResult.ErrorDesc = HpToolsLauncher.Properties.Resources.ExceptionExternalProcess; } } runResult.ReportLocation = null; runResult.TestState = TestState.Error; } } if (runResult.TestState == TestState.Passed && runResult.HasWarnings) { runResult.TestState = TestState.Warning; ConsoleWriter.WriteLine(Resources.FsRunnerTestDoneWarnings); } else { ConsoleWriter.WriteLine(string.Format(Resources.FsRunnerTestDone, runResult.TestState)); } ConsoleWriter.WriteLine(DateTime.Now.ToString(Launcher.DateFormat) + " Test complete: " + runResult.TestPath + "\n-------------------------------------------------------------------------------------------------------"); UpdateCounters(runResult.TestState); }
/// <summary> /// Try to set the custom report path for a given test. /// </summary> /// <param name="runResults"> The test run results </param> /// <param name="testInfo"> The test information </param> /// <param name="errorReason"> The error reason </param> /// <returns> True if the report path was set, false otherwise </returns> public static bool TrySetTestReportPath(TestRunResults runResults, TestInfo testInfo, ref string errorReason) { // set the report location for the run results runResults.ReportLocation = testInfo.ReportPath; // no need to create it if (Directory.Exists(runResults.ReportLocation)) { return(true); } try { Directory.CreateDirectory(runResults.ReportLocation); } catch (Exception) { SetTestReportPathError(runResults, ref errorReason, testInfo); return(false); } return(true); }
private testsuite CreateXmlFromLRRunResults(TestRunResults testRes) { testsuite lrts = new testsuite(); int totalTests = 0, totalFailures = 0, totalErrors = 0; // two LR report files may be generated: RunReport.xml, SLA.xml string lrRunReportFile = Path.Combine(testRes.ReportLocation, "RunReport.xml"); string lrSLAFile = Path.Combine(testRes.ReportLocation, "SLA.xml"); LRRunGeneralInfo generalInfo = new LRRunGeneralInfo(); List <LRRunSLAGoalResult> slaGoals = new List <LRRunSLAGoalResult>(); try { XmlDocument xdoc = new XmlDocument(); XmlElement slaNode = null; if (File.Exists(lrRunReportFile)) { xdoc.Load(lrRunReportFile); // General node var generalNode = xdoc.DocumentElement.SelectSingleNode("General"); if (generalNode != null) { var vUsersNode = generalNode.SelectSingleNode("VUsers") as XmlElement; if (vUsersNode != null) { if (vUsersNode.HasAttribute("Count")) { int vUsersCount = 0; if (int.TryParse(vUsersNode.Attributes["Count"].Value, out vUsersCount)) { generalInfo.VUsersCount = vUsersCount; } } } } // SLA node slaNode = xdoc.DocumentElement.SelectSingleNode("SLA") as XmlElement; } else if (File.Exists(lrSLAFile)) { xdoc.Load(lrSLAFile); slaNode = xdoc.DocumentElement; } if (slaNode != null) { var slaGoalNodes = slaNode.SelectNodes("SLA_GOAL"); if (slaGoalNodes != null) { foreach (var slaGoalNode in slaGoalNodes) { var slaGoalElement = slaGoalNode as XmlElement; if (slaGoalElement != null) { slaGoals.Add(new LRRunSLAGoalResult { TransactionName = slaGoalElement.GetAttribute("TransactionName"), Percentile = slaGoalElement.GetAttribute("Percentile"), FullName = slaGoalElement.GetAttribute("FullName"), Measurement = slaGoalElement.GetAttribute("Measurement"), GoalValue = slaGoalElement.GetAttribute("GoalValue"), ActualValue = slaGoalElement.GetAttribute("ActualValue"), Status = slaGoalElement.InnerText }); } } } } } catch (XmlException) { } lrts.name = testRes.TestPath; // testsuite properties lrts.properties = new property[] { new property { name = "Total vUsers", value = IntToString(generalInfo.VUsersCount) } }; double totalSeconds = testRes.Runtime.TotalSeconds; lrts.time = DoubleToString(totalSeconds); // testcases foreach (var slaGoal in slaGoals) { testcase tc = new testcase { name = slaGoal.TransactionName, classname = slaGoal.FullName + ": " + slaGoal.Percentile, report = testRes.ReportLocation, type = testRes.TestType, time = DoubleToString(totalSeconds / slaGoals.Count) }; switch (slaGoal.Status.Trim().ToLowerInvariant()) { case "failed": case "fail": tc.status = "fail"; tc.AddFailure(new failure { message = string.Format("The goal value '{0}' does not equal to the actual value '{1}'", slaGoal.GoalValue, slaGoal.ActualValue) }); totalFailures++; break; case "error": case "err": tc.status = "error"; tc.AddError(new error { message = testRes.ErrorDesc }); totalErrors++; break; case "warning": case "warn": tc.status = "warning"; break; default: tc.status = "pass"; break; } lrts.AddTestCase(tc); totalTests++; } lrts.tests = IntToString(totalTests); lrts.errors = IntToString(totalErrors); lrts.failures = IntToString(totalFailures); return(lrts); }
/// <summary> /// runs all tests given to this runner and returns a suite of run resutls /// </summary> /// <returns>The rest run results for each test</returns> public override TestSuiteRunResults Run() { //create a new Run Results object TestSuiteRunResults activeRunDesc = new TestSuiteRunResults(); double totalTime = 0; try { var start = DateTime.Now; foreach (var test in _tests) { if (RunCancelled()) { break; } var testStart = DateTime.Now; string errorReason = string.Empty; TestRunResults runResult = null; try { runResult = RunHPToolsTest(test, ref errorReason); } catch (Exception ex) { runResult = new TestRunResults(); runResult.TestState = TestState.Error; runResult.ErrorDesc = ex.Message; runResult.TestName = test.TestName; } //get the original source for this test, for grouping tests under test classes runResult.TestGroup = test.TestGroup; activeRunDesc.TestRuns.Add(runResult); //if fail was terminated before this step, continue if (runResult.TestState != TestState.Failed) { if (runResult.TestState != TestState.Error) { Helper.GetTestStateFromReport(runResult); } else { if (string.IsNullOrEmpty(runResult.ErrorDesc)) { if (RunCancelled()) { runResult.ErrorDesc = HpToolsLauncher.Properties.Resources.ExceptionUserCancelled; } else { runResult.ErrorDesc = HpToolsLauncher.Properties.Resources.ExceptionExternalProcess; } } runResult.ReportLocation = null; runResult.TestState = TestState.Error; } } if (runResult.TestState == TestState.Passed && runResult.HasWarnings) { runResult.TestState = TestState.Warning; ConsoleWriter.WriteLine(Resources.FsRunnerTestDoneWarnings); } else { ConsoleWriter.WriteLine(string.Format(Resources.FsRunnerTestDone, runResult.TestState)); } ConsoleWriter.WriteLine(DateTime.Now.ToString(Launcher.DateFormat) + " Test complete: " + runResult.TestPath + "\n-------------------------------------------------------------------------------------------------------"); UpdateCounters(runResult.TestState); var testTotalTime = (DateTime.Now - testStart).TotalSeconds; } totalTime = (DateTime.Now - start).TotalSeconds; } finally { activeRunDesc.NumTests = _tests.Count; activeRunDesc.NumErrors = _errors; activeRunDesc.TotalRunTime = TimeSpan.FromSeconds(totalTime); activeRunDesc.NumFailures = _fail; foreach (IFileSysTestRunner cleanupRunner in _colRunnersForCleanup.Values) { cleanupRunner.CleanUp(); } } return(activeRunDesc); }
/// <summary> /// runs the given test /// </summary> /// <param name="testinf"></param> /// <param name="errorReason"></param> /// <param name="runCancelled">cancellation delegate, holds the function that checks cancellation</param> /// <returns></returns> public TestRunResults RunTest(TestInfo testinf, ref string errorReason, RunCancelledDelegate runCancelled) { TestRunResults runDesc = new TestRunResults(); ConsoleWriter.ActiveTestRun = runDesc; ConsoleWriter.WriteLine(DateTime.Now.ToString(Launcher.DateFormat) + " Running: " + testinf.TestPath); runDesc.TestPath = testinf.TestPath; // default report location is the test path runDesc.ReportLocation = testinf.TestPath; // check if the report path has been defined if (!String.IsNullOrEmpty(testinf.ReportPath)) { if (!Helper.TrySetTestReportPath(runDesc, testinf, ref errorReason)) { return(runDesc); } } runDesc.ErrorDesc = errorReason; runDesc.TestState = TestState.Unknown; if (!Helper.IsServiceTestInstalled()) { runDesc.TestState = TestState.Error; runDesc.ErrorDesc = string.Format(Resources.LauncherStNotInstalled, System.Environment.MachineName); ConsoleWriter.WriteErrLine(runDesc.ErrorDesc); Environment.ExitCode = (int)Launcher.ExitCodeEnum.Failed; return(runDesc); } _runCancelled = runCancelled; if (!_stCanRun) { runDesc.TestState = TestState.Error; runDesc.ErrorDesc = Resources.STExecuterNotFound; return(runDesc); } string fileName = Path.Combine(_stExecuterPath, STRunnerName); if (!File.Exists(fileName)) { runDesc.TestState = TestState.Error; runDesc.ErrorDesc = Resources.STExecuterNotFound; ConsoleWriter.WriteErrLine(Resources.STExecuterNotFound); return(runDesc); } //write the input parameter xml file for the API test string paramFileName = Guid.NewGuid().ToString().Replace("-", string.Empty).Substring(0, 10); string tempPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "TestParams"); Directory.CreateDirectory(tempPath); string paramsFilePath = Path.Combine(tempPath, "params" + paramFileName + ".xml"); string paramFileContent = testinf.GenerateAPITestXmlForTest(); string argumentString = ""; if (!string.IsNullOrWhiteSpace(paramFileContent)) { File.WriteAllText(paramsFilePath, paramFileContent); argumentString = String.Format("{0} \"{1}\" {2} \"{3}\" {4} \"{5}\"", STRunnerTestArg, testinf.TestPath, STRunnerReportArg, runDesc.ReportLocation, STRunnerInputParamsArg, paramsFilePath); } else { argumentString = String.Format("{0} \"{1}\" {2} \"{3}\"", STRunnerTestArg, testinf.TestPath, STRunnerReportArg, runDesc.ReportLocation); } Stopwatch s = Stopwatch.StartNew(); runDesc.TestState = TestState.Running; if (!ExecuteProcess(fileName, argumentString, ref errorReason)) { runDesc.TestState = TestState.Error; runDesc.ErrorDesc = errorReason; } else { runDesc.ReportLocation = Path.Combine(runDesc.ReportLocation, "Report"); if (!File.Exists(Path.Combine(runDesc.ReportLocation, "Results.xml")) && !File.Exists(Path.Combine(runDesc.ReportLocation, "run_results.html"))) { runDesc.TestState = TestState.Error; runDesc.ErrorDesc = "No Results.xml or run_results.html file found"; } } //File.Delete(paramsFilePath); runDesc.Runtime = s.Elapsed; return(runDesc); }
private bool IsTestFailed(TestRunResults runResult) { return(runResult.TestState == TestState.Failed || runResult.TestState == TestState.Error); }
private testcase CreateXmlFromLRRunResults(TestRunResults testRes) { return(CreateXmlFromUFTRunResults(testRes)); }
/// <summary> /// runs all tests given to this runner and returns a suite of run resutls /// </summary> /// <returns>The rest run results for each test</returns> public override TestSuiteRunResults Run() { //create a new Run Results object TestSuiteRunResults activeRunDesc = new TestSuiteRunResults(); double totalTime = 0; try { var start = DateTime.Now; foreach (var test in _tests) { if (RunCancelled()) break; var testStart = DateTime.Now; string errorReason = string.Empty; TestRunResults runResult = null; try { runResult = RunHPToolsTest(test, ref errorReason); } catch (Exception ex) { runResult = new TestRunResults(); runResult.TestState = TestState.Error; runResult.ErrorDesc = ex.Message; runResult.TestName = test.TestName; } //get the original source for this test, for grouping tests under test classes runResult.TestGroup = test.TestGroup; activeRunDesc.TestRuns.Add(runResult); //if fail was terminated before this step, continue if (runResult.TestState != TestState.Failed) { if (runResult.TestState != TestState.Error) { Helper.GetTestStateFromReport(runResult); } else { if (string.IsNullOrEmpty(runResult.ErrorDesc)) { if (RunCancelled()) { runResult.ErrorDesc = HpToolsLauncher.Properties.Resources.ExceptionUserCancelled; } else { runResult.ErrorDesc = HpToolsLauncher.Properties.Resources.ExceptionExternalProcess; } } runResult.ReportLocation = null; runResult.TestState = TestState.Error; } } if (runResult.TestState == TestState.Passed && runResult.HasWarnings) { runResult.TestState = TestState.Warning; ConsoleWriter.WriteLine(Resources.FsRunnerTestDoneWarnings); } else { ConsoleWriter.WriteLine(string.Format(Resources.FsRunnerTestDone, runResult.TestState)); } ConsoleWriter.WriteLine(DateTime.Now.ToString(Launcher.DateFormat) + " Test complete: " + runResult.TestPath + "\n-------------------------------------------------------------------------------------------------------"); UpdateCounters(runResult.TestState); var testTotalTime = (DateTime.Now - testStart).TotalSeconds; } totalTime = (DateTime.Now - start).TotalSeconds; } finally { activeRunDesc.NumTests = _tests.Count; activeRunDesc.NumErrors = _errors; activeRunDesc.TotalRunTime = TimeSpan.FromSeconds(totalTime); activeRunDesc.NumFailures = _fail; foreach (IFileSysTestRunner cleanupRunner in _colRunnersForCleanup.Values) { cleanupRunner.CleanUp(); } } return activeRunDesc; }
/// <summary> /// runs the given test and returns resutls /// </summary> /// <param name="testPath"></param> /// <param name="errorReason"></param> /// <param name="runCanclled"></param> /// <returns></returns> public TestRunResults RunTest(TestInfo testinf, ref string errorReason, RunCancelledDelegate runCanclled) { var testPath = testinf.TestPath; TestRunResults runDesc = new TestRunResults(); ConsoleWriter.ActiveTestRun = runDesc; ConsoleWriter.WriteLine(DateTime.Now.ToString(Launcher.DateFormat) + " Running: " + testPath); runDesc.ReportLocation = testPath; runDesc.TestPath = testPath; runDesc.TestState = TestState.Unknown; _runCancelled = runCanclled; if (!Helper.IsQtpInstalled()) { runDesc.TestState = TestState.Error; runDesc.ErrorDesc = string.Format(Resources.GeneralQtpNotInstalled, System.Environment.MachineName); ConsoleWriter.WriteErrLine(runDesc.ErrorDesc); Environment.ExitCode = (int)Launcher.ExitCodeEnum.Failed; return(runDesc); } try { ChangeDCOMSettingToInteractiveUser(); var type = Type.GetTypeFromProgID("Quicktest.Application"); lock (_lockObject) { _qtpApplication = Activator.CreateInstance(type) as Application; Version qtpVersion = Version.Parse(_qtpApplication.Version); if (qtpVersion.Equals(new Version(11, 0))) { runDesc.ReportLocation = Path.Combine(testPath, "Report"); if (Directory.Exists(runDesc.ReportLocation)) { Directory.Delete(runDesc.ReportLocation, true); Directory.CreateDirectory(runDesc.ReportLocation); } } // Check for required Addins LoadNeededAddins(testPath); if (!_qtpApplication.Launched) { if (_runCancelled()) { QTPTestCleanup(); KillQtp(); runDesc.TestState = TestState.Error; return(runDesc); } // Launch application after set Addins _qtpApplication.Launch(); _qtpApplication.Visible = false; } } } catch (Exception e) { errorReason = Resources.QtpNotLaunchedError; runDesc.TestState = TestState.Error; runDesc.ReportLocation = ""; runDesc.ErrorDesc = e.Message; return(runDesc); } if (_qtpApplication.Test != null && _qtpApplication.Test.Modified) { var message = Resources.QtpNotLaunchedError; errorReason = message; runDesc.TestState = TestState.Error; runDesc.ErrorDesc = errorReason; return(runDesc); } _qtpApplication.UseLicenseOfType(_useUFTLicense ? tagUnifiedLicenseType.qtUnifiedFunctionalTesting : tagUnifiedLicenseType.qtNonUnified); if (!HandleInputParameters(testPath, ref errorReason, testinf.GetParameterDictionaryForQTP())) { runDesc.TestState = TestState.Error; runDesc.ErrorDesc = errorReason; return(runDesc); } GuiTestRunResult guiTestRunResult = ExecuteQTPRun(runDesc); runDesc.ReportLocation = guiTestRunResult.ReportPath; if (!guiTestRunResult.IsSuccess) { runDesc.TestState = TestState.Error; return(runDesc); } if (!HandleOutputArguments(ref errorReason)) { runDesc.TestState = TestState.Error; runDesc.ErrorDesc = errorReason; return(runDesc); } QTPTestCleanup(); return(runDesc); }
private void SetTestResults(ITSTest currentTest, IExecutionStatus executionStatus, ITestSet targetTestSet, TestRunResults activeTestDesc, TestSuiteRunResults runDesc, string testPath, string abortFilename) { // write the status for each test for (int k = 1; k <= executionStatus.Count; ++k) { if (System.IO.File.Exists(abortFilename)) { break; } TestExecStatus testExecStatusObj = executionStatus[k]; currentTest = targetTestSet.TSTestFactory[testExecStatusObj.TSTestId]; if (currentTest == null) { ConsoleWriter.WriteLine(string.Format("currentTest is null for test.{0} after whole execution", k)); continue; } activeTestDesc = UpdateTestStatus(runDesc, targetTestSet, testExecStatusObj, false); UpdateCounters(activeTestDesc, runDesc); activeTestDesc.TestPath = testPath; } }
/// <summary> /// runs the given test and returns resutls /// </summary> /// <param name="testPath"></param> /// <param name="errorReason"></param> /// <param name="runCanclled"></param> /// <returns></returns> public TestRunResults RunTest(TestInfo testinf, ref string errorReason, RunCancelledDelegate runCanclled) { var testPath = testinf.TestPath; TestRunResults runDesc = new TestRunResults(); ConsoleWriter.ActiveTestRun = runDesc; ConsoleWriter.WriteLine(DateTime.Now.ToString(Launcher.DateFormat) + " Running: " + testPath); runDesc.ReportLocation = testPath; runDesc.TestPath = testPath; runDesc.TestState = TestState.Unknown; _runCancelled = runCanclled; if (!Helper.IsQtpInstalled()) { runDesc.TestState = TestState.Error; runDesc.ErrorDesc = string.Format(Resources.GeneralQtpNotInstalled, System.Environment.MachineName); ConsoleWriter.WriteErrLine(runDesc.ErrorDesc); Environment.ExitCode = (int)Launcher.ExitCodeEnum.Failed; return(runDesc); } string reason = string.Empty; if (!Helper.CanUftProcessStart(out reason)) { runDesc.TestState = TestState.Error; runDesc.ErrorDesc = reason; ConsoleWriter.WriteErrLine(runDesc.ErrorDesc); Environment.ExitCode = (int)Launcher.ExitCodeEnum.Failed; return(runDesc); } try { ChangeDCOMSettingToInteractiveUser(); var type = Type.GetTypeFromProgID("Quicktest.Application"); lock (_lockObject) { _qtpApplication = Activator.CreateInstance(type) as Application; Version qtpVersion = Version.Parse(_qtpApplication.Version); if (qtpVersion.Equals(new Version(11, 0))) { runDesc.ReportLocation = Path.Combine(testPath, "Report"); if (Directory.Exists(runDesc.ReportLocation)) { Directory.Delete(runDesc.ReportLocation, true); Directory.CreateDirectory(runDesc.ReportLocation); } } // Check for required Addins LoadNeededAddins(testPath); // set Mc connection and other mobile info into rack if neccesary #region Mc connection and other mobile info // Mc Address, username and password if (!string.IsNullOrEmpty(_mcConnection.MobileHostAddress)) { _qtpApplication.TDPierToTulip.SetTestOptionsVal(MOBILE_HOST_ADDRESS, _mcConnection.MobileHostAddress); if (!string.IsNullOrEmpty(_mcConnection.MobileHostPort)) { _qtpApplication.TDPierToTulip.SetTestOptionsVal(MOBILE_HOST_PORT, _mcConnection.MobileHostPort); } } if (!string.IsNullOrEmpty(_mcConnection.MobileUserName)) { _qtpApplication.TDPierToTulip.SetTestOptionsVal(MOBILE_USER, _mcConnection.MobileUserName); } if (!string.IsNullOrEmpty(_mcConnection.MobilePassword)) { string encriptedMcPassword = WinUserNativeMethods.ProtectBSTRToBase64(_mcConnection.MobilePassword); if (encriptedMcPassword == null) { ConsoleWriter.WriteLine("ProtectBSTRToBase64 fail for mcPassword"); throw new Exception("ProtectBSTRToBase64 fail for mcPassword"); } _qtpApplication.TDPierToTulip.SetTestOptionsVal(MOBILE_PASSWORD, encriptedMcPassword); } // ssl and proxy info _qtpApplication.TDPierToTulip.SetTestOptionsVal(MOBILE_USE_SSL, _mcConnection.MobileUseSSL); if (_mcConnection.MobileUseProxy == 1) { _qtpApplication.TDPierToTulip.SetTestOptionsVal(MOBILE_USE_PROXY, _mcConnection.MobileUseProxy); _qtpApplication.TDPierToTulip.SetTestOptionsVal(MOBILE_PROXY_SETTING_ADDRESS, _mcConnection.MobileProxySetting_Address); _qtpApplication.TDPierToTulip.SetTestOptionsVal(MOBILE_PROXY_SETTING_PORT, _mcConnection.MobileProxySetting_Port); _qtpApplication.TDPierToTulip.SetTestOptionsVal(MOBILE_PROXY_SETTING_AUTHENTICATION, _mcConnection.MobileProxySetting_Authentication); _qtpApplication.TDPierToTulip.SetTestOptionsVal(MOBILE_PROXY_SETTING_USERNAME, _mcConnection.MobileProxySetting_UserName); string encriptedMcProxyPassword = WinUserNativeMethods.ProtectBSTRToBase64(_mcConnection.MobileProxySetting_Password); if (encriptedMcProxyPassword == null) { ConsoleWriter.WriteLine("ProtectBSTRToBase64 fail for mc proxy Password"); throw new Exception("ProtectBSTRToBase64 fail for mc proxy Password"); } _qtpApplication.TDPierToTulip.SetTestOptionsVal(MOBILE_PROXY_SETTING_PASSWORD, encriptedMcProxyPassword); } // Mc info (device, app, launch and terminate data) if (!string.IsNullOrEmpty(_mobileInfo)) { _qtpApplication.TDPierToTulip.SetTestOptionsVal(MOBILE_INFO, _mobileInfo); } #endregion if (!_qtpApplication.Launched) { if (_runCancelled()) { QTPTestCleanup(); KillQtp(); runDesc.TestState = TestState.Error; return(runDesc); } // Launch application after set Addins _qtpApplication.Launch(); _qtpApplication.Visible = false; } } } catch (Exception e) { errorReason = Resources.QtpNotLaunchedError; runDesc.TestState = TestState.Error; runDesc.ReportLocation = ""; runDesc.ErrorDesc = e.Message; return(runDesc); } if (_qtpApplication.Test != null && _qtpApplication.Test.Modified) { var message = Resources.QtpNotLaunchedError; errorReason = message; runDesc.TestState = TestState.Error; runDesc.ErrorDesc = errorReason; return(runDesc); } _qtpApplication.UseLicenseOfType(_useUFTLicense ? tagUnifiedLicenseType.qtUnifiedFunctionalTesting : tagUnifiedLicenseType.qtNonUnified); if (!HandleInputParameters(testPath, ref errorReason, testinf.GetParameterDictionaryForQTP())) { runDesc.TestState = TestState.Error; runDesc.ErrorDesc = errorReason; return(runDesc); } GuiTestRunResult guiTestRunResult = ExecuteQTPRun(runDesc); runDesc.ReportLocation = guiTestRunResult.ReportPath; if (!guiTestRunResult.IsSuccess) { runDesc.TestState = TestState.Error; return(runDesc); } if (!HandleOutputArguments(ref errorReason)) { runDesc.TestState = TestState.Error; runDesc.ErrorDesc = errorReason; return(runDesc); } QTPTestCleanup(); return(runDesc); }
/// <summary> /// runs the given test QTP and returns results /// </summary> /// <param name="testResults">the test results object containing test info and also receiving run results</param> /// <returns></returns> private GuiTestRunResult ExecuteQTPRun(TestRunResults testResults) { GuiTestRunResult result = new GuiTestRunResult { IsSuccess = true }; try { Type runResultsOptionstype = Type.GetTypeFromProgID("QuickTest.RunResultsOptions"); var options = (RunResultsOptions)Activator.CreateInstance(runResultsOptionstype); options.ResultsLocation = testResults.ReportLocation; _qtpApplication.Options.Run.RunMode = "Fast"; //Check for cancel before executing if (_runCancelled()) { testResults.TestState = TestState.Error; testResults.ErrorDesc = Resources.GeneralTestCanceled; ConsoleWriter.WriteLine(Resources.GeneralTestCanceled); result.IsSuccess = false; return result; } ConsoleWriter.WriteLine(string.Format(Resources.FsRunnerRunningTest, testResults.TestPath)); _qtpApplication.Test.Run(options, false, _qtpParameters); result.ReportPath = Path.Combine(testResults.ReportLocation, "Report"); int slept = 0; while (slept < 20000 && _qtpApplication.GetStatus().Equals("Ready")) { Thread.Sleep(50); slept += 50; } while (!_runCancelled() && (_qtpApplication.GetStatus().Equals("Running") || _qtpApplication.GetStatus().Equals("Busy"))) { Thread.Sleep(200); if (_timeLeftUntilTimeout - _stopwatch.Elapsed <= TimeSpan.Zero) { _qtpApplication.Test.Stop(); testResults.TestState = TestState.Error; testResults.ErrorDesc = Resources.GeneralTimeoutExpired; ConsoleWriter.WriteLine(Resources.GeneralTimeoutExpired); result.IsSuccess = false; return result; } } if (_runCancelled()) { QTPTestCleanup(); KillQtp(); testResults.TestState = TestState.Error; testResults.ErrorDesc = Resources.GeneralTestCanceled; ConsoleWriter.WriteLine(Resources.GeneralTestCanceled); Launcher.ExitCode = Launcher.ExitCodeEnum.Aborted; result.IsSuccess = false; return result; } string lastError = _qtpApplication.Test.LastRunResults.LastError; //read the lastError if (!String.IsNullOrEmpty(lastError)) { testResults.TestState = TestState.Error; testResults.ErrorDesc = lastError; } // the way to check the logical success of the target QTP test is: app.Test.LastRunResults.Status == "Passed". if (_qtpApplication.Test.LastRunResults.Status.Equals("Passed")) { testResults.TestState = TestState.Passed; } else if (_qtpApplication.Test.LastRunResults.Status.Equals("Warning")) { testResults.TestState = TestState.Passed; testResults.HasWarnings = true; if (Launcher.ExitCode != Launcher.ExitCodeEnum.Failed && Launcher.ExitCode != Launcher.ExitCodeEnum.Aborted) Launcher.ExitCode = Launcher.ExitCodeEnum.Unstable; } else { testResults.TestState = TestState.Failed; testResults.FailureDesc = "Test failed"; Launcher.ExitCode = Launcher.ExitCodeEnum.Failed; } } catch (NullReferenceException e) { ConsoleWriter.WriteLine(string.Format(Resources.GeneralErrorWithStack, e.Message, e.StackTrace)); testResults.TestState = TestState.Error; testResults.ErrorDesc = Resources.QtpRunError; result.IsSuccess = false; return result; } catch (SystemException e) { KillQtp(); ConsoleWriter.WriteLine(string.Format(Resources.GeneralErrorWithStack, e.Message, e.StackTrace)); testResults.TestState = TestState.Error; testResults.ErrorDesc = Resources.QtpRunError; result.IsSuccess = false; return result; } catch (Exception e2) { ConsoleWriter.WriteLine(string.Format(Resources.GeneralErrorWithStack, e2.Message, e2.StackTrace)); testResults.TestState = TestState.Error; testResults.ErrorDesc = Resources.QtpRunError; result.IsSuccess = false; return result; } return result; }
private testcase CreateXmlFromLRRunResults(TestRunResults testRes) { return CreateXmlFromUFTRunResults(testRes); }
/// <summary> /// runs the given test and returns resutls /// </summary> /// <param name="testPath"></param> /// <param name="errorReason"></param> /// <param name="runCanclled"></param> /// <returns></returns> public TestRunResults RunTest(string testPath, ref string errorReason, RunCancelledDelegate runCanclled) { TestRunResults runDesc = new TestRunResults(); ConsoleWriter.ActiveTestRun = runDesc; ConsoleWriter.WriteLine(DateTime.Now.ToString(Launcher.DateFormat) + " Running: " + testPath); runDesc.ReportLocation = testPath; runDesc.TestPath = testPath; runDesc.TestState = TestState.Unknown; _runCancelled = runCanclled; if (!Helper.IsQtpInstalled()) { runDesc.TestState = TestState.Error; runDesc.ErrorDesc = string.Format(Resources.GeneralQtpNotInstalled, System.Environment.MachineName); ConsoleWriter.WriteErrLine(runDesc.ErrorDesc); Environment.ExitCode = (int)Launcher.ExitCodeEnum.Failed; return runDesc; } try { ChangeDCOMSettingToInteractiveUser(); var type = Type.GetTypeFromProgID("Quicktest.Application"); lock (_lockObject) { _qtpApplication = Activator.CreateInstance(type) as Application; Version qtpVersion = Version.Parse(_qtpApplication.Version); if (qtpVersion.Equals(new Version(11,0))) { runDesc.ReportLocation = Path.Combine(testPath, "Report"); if (Directory.Exists(runDesc.ReportLocation)) { Directory.Delete(runDesc.ReportLocation, true); Directory.CreateDirectory(runDesc.ReportLocation); } } // Check for required Addins LoadNeededAddins(testPath); if (!_qtpApplication.Launched) { if (_runCancelled()) { QTPTestCleanup(); KillQtp(); runDesc.TestState = TestState.Error; return runDesc; } // Launch application after set Addins _qtpApplication.Launch(); _qtpApplication.Visible = false; } } } catch (Exception e) { errorReason = Resources.QtpNotLaunchedError; runDesc.TestState = TestState.Error; runDesc.ReportLocation = ""; runDesc.ErrorDesc = e.Message; return runDesc; } if (_qtpApplication.Test != null && _qtpApplication.Test.Modified) { var message = Resources.QtpNotLaunchedError; errorReason = message; runDesc.TestState = TestState.Error; runDesc.ErrorDesc = errorReason; return runDesc; } _qtpApplication.UseLicenseOfType(_useUFTLicense ? tagUnifiedLicenseType.qtUnifiedFunctionalTesting : tagUnifiedLicenseType.qtNonUnified); if (!HandleInputParameters(testPath, ref errorReason)) { runDesc.TestState = TestState.Error; runDesc.ErrorDesc = errorReason; return runDesc; } GuiTestRunResult guiTestRunResult = ExecuteQTPRun(runDesc); runDesc.ReportLocation = guiTestRunResult.ReportPath; if (!guiTestRunResult.IsSuccess) { runDesc.TestState = TestState.Error; return runDesc; } if (!HandleOutputArguments(ref errorReason)) { runDesc.TestState = TestState.Error; runDesc.ErrorDesc = errorReason; return runDesc; } QTPTestCleanup(); return runDesc; }
/// <summary> /// runs the given test and returns resutls /// </summary> /// <param name="testPath"></param> /// <param name="errorReason"></param> /// <param name="runCanclled"></param> /// <returns></returns> public TestRunResults RunTest(TestInfo testinf, ref string errorReason, RunCancelledDelegate runCanclled) { var testPath = testinf.TestPath; TestRunResults runDesc = new TestRunResults(); ConsoleWriter.ActiveTestRun = runDesc; ConsoleWriter.WriteLine(DateTime.Now.ToString(Launcher.DateFormat) + " Running test: " + testPath + " ..."); runDesc.TestPath = testPath; // check if the report path has been defined if (!string.IsNullOrWhiteSpace(testinf.ReportPath)) { runDesc.ReportLocation = Path.GetFullPath(testinf.ReportPath); ConsoleWriter.WriteLine(DateTime.Now.ToString(Launcher.DateFormat) + " Report path is set explicitly: " + runDesc.ReportLocation); } else if (!String.IsNullOrEmpty(testinf.ReportBaseDirectory)) { testinf.ReportBaseDirectory = Path.GetFullPath(testinf.ReportBaseDirectory); if (!Helper.TrySetTestReportPath(runDesc, testinf, ref errorReason)) { return(runDesc); } ConsoleWriter.WriteLine(DateTime.Now.ToString(Launcher.DateFormat) + " Report path is generated under base directory: " + runDesc.ReportLocation); } else { // default report location is the next available folder under test path // for example, "path\to\tests\GUITest1\Report123", the name "Report123" will also be used as the report name string reportBasePath = Path.GetFullPath(testPath); string testReportPath = Path.Combine(reportBasePath, "Report" + DateTime.Now.ToString("ddMMyyyyHHmmssfff")); int index = 0; while (index < int.MaxValue) { index++; string dir = Path.Combine(reportBasePath, "Report" + index.ToString()); if (!Directory.Exists(dir)) { testReportPath = dir; break; } } runDesc.ReportLocation = testReportPath; ConsoleWriter.WriteLine(DateTime.Now.ToString(Launcher.DateFormat) + " Report path is automatically generated: " + runDesc.ReportLocation); } runDesc.TestState = TestState.Unknown; _runCancelled = runCanclled; if (!Helper.IsQtpInstalled()) { runDesc.TestState = TestState.Error; runDesc.ErrorDesc = string.Format(Resources.GeneralQtpNotInstalled, System.Environment.MachineName); ConsoleWriter.WriteErrLine(runDesc.ErrorDesc); Environment.ExitCode = (int)Launcher.ExitCodeEnum.Failed; return(runDesc); } string reason = string.Empty; if (!Helper.CanUftProcessStart(out reason)) { runDesc.TestState = TestState.Error; runDesc.ErrorDesc = reason; ConsoleWriter.WriteErrLine(runDesc.ErrorDesc); Environment.ExitCode = (int)Launcher.ExitCodeEnum.Failed; return(runDesc); } try { ConsoleWriter.WriteLine(DateTime.Now.ToString(Launcher.DateFormat) + " " + Properties.Resources.LaunchingTestingTool); ChangeDCOMSettingToInteractiveUser(); var type = Type.GetTypeFromProgID("Quicktest.Application"); lock (_lockObject) { // before creating qtp automation object which creates UFT process, // try to check if the UFT process already exists bool uftProcessExist = false; bool isNewInstance; using (Mutex m = new Mutex(true, "per_process_mutex_UFT", out isNewInstance)) { if (!isNewInstance) { uftProcessExist = true; } } // this will create UFT process _qtpApplication = Activator.CreateInstance(type) as Application; // try to get qtp status via qtp automation object // this might fail if UFT is launched and waiting for user input on addins manage window bool needKillUFTProcess = false; // status: Not launched / Ready / Busy / Running / Recording / Waiting / Paused string status = _qtpApplication.GetStatus(); switch (status) { case "Not launched": if (uftProcessExist) { // UFT process exist but the status retrieved from qtp automation object is Not launched // it means the UFT is launched but not shown the main window yet // in which case it shall be considered as UFT is not used at all // so here can kill the UFT process to continue needKillUFTProcess = true; } break; case "Ready": case "Waiting": // UFT is launched but not running or recording, shall be considered as UFT is not used // no need kill UFT process here since the qtp automation object can work properly break; case "Busy": case "Running": case "Recording": case "Paused": // UFT is launched and somehow in use now, shouldn't kill UFT process // here make the test fail errorReason = Resources.UFT_Running; runDesc.TestState = TestState.Error; runDesc.ReportLocation = ""; runDesc.ErrorDesc = errorReason; return(runDesc); default: // by default, let the tool run test, the behavior might be unexpected break; } if (needKillUFTProcess) { Process[] procs = Process.GetProcessesByName("uft"); if (procs != null) { foreach (Process proc in procs) { proc.Kill(); } } } Version qtpVersion = Version.Parse(_qtpApplication.Version); if (qtpVersion.Equals(new Version(11, 0))) { // use the defined report path if provided if (!string.IsNullOrWhiteSpace(testinf.ReportPath)) { runDesc.ReportLocation = Path.Combine(testinf.ReportPath, "Report"); } else if (!string.IsNullOrWhiteSpace(testinf.ReportBaseDirectory)) { runDesc.ReportLocation = Path.Combine(testinf.ReportBaseDirectory, "Report"); } else { runDesc.ReportLocation = Path.Combine(testPath, "Report"); } if (Directory.Exists(runDesc.ReportLocation)) { int lastIndex = runDesc.ReportLocation.IndexOf("\\"); var location = runDesc.ReportLocation.Substring(0, lastIndex); var name = runDesc.ReportLocation.Substring(lastIndex + 1); runDesc.ReportLocation = Helper.GetNextResFolder(location, name); Console.WriteLine("Report location is:" + runDesc.ReportLocation); Directory.CreateDirectory(runDesc.ReportLocation); } } // Check for required Addins LoadNeededAddins(testPath); // set Mc connection and other mobile info into rack if neccesary #region Mc connection and other mobile info // Mc Address, username and password if (!string.IsNullOrEmpty(_mcConnection.MobileHostAddress)) { _qtpApplication.TDPierToTulip.SetTestOptionsVal(MOBILE_HOST_ADDRESS, _mcConnection.MobileHostAddress); if (!string.IsNullOrEmpty(_mcConnection.MobileHostPort)) { _qtpApplication.TDPierToTulip.SetTestOptionsVal(MOBILE_HOST_PORT, _mcConnection.MobileHostPort); } } if (!string.IsNullOrEmpty(_mcConnection.MobileUserName)) { _qtpApplication.TDPierToTulip.SetTestOptionsVal(MOBILE_USER, _mcConnection.MobileUserName); } if (!string.IsNullOrEmpty(_mcConnection.MobileTenantId)) { _qtpApplication.TDPierToTulip.SetTestOptionsVal(MOBILE_TENANT, _mcConnection.MobileTenantId); } if (!string.IsNullOrEmpty(_mcConnection.MobilePassword)) { string encriptedMcPassword = WinUserNativeMethods.ProtectBSTRToBase64(_mcConnection.MobilePassword); if (encriptedMcPassword == null) { ConsoleWriter.WriteLine("ProtectBSTRToBase64 fail for mcPassword"); throw new Exception("ProtectBSTRToBase64 fail for mcPassword"); } _qtpApplication.TDPierToTulip.SetTestOptionsVal(MOBILE_PASSWORD, encriptedMcPassword); } // ssl and proxy info _qtpApplication.TDPierToTulip.SetTestOptionsVal(MOBILE_USE_SSL, _mcConnection.MobileUseSSL); if (_mcConnection.MobileUseProxy == 1) { _qtpApplication.TDPierToTulip.SetTestOptionsVal(MOBILE_USE_PROXY, _mcConnection.MobileUseProxy); _qtpApplication.TDPierToTulip.SetTestOptionsVal(MOBILE_PROXY_SETTING_ADDRESS, _mcConnection.MobileProxySetting_Address); _qtpApplication.TDPierToTulip.SetTestOptionsVal(MOBILE_PROXY_SETTING_PORT, _mcConnection.MobileProxySetting_Port); _qtpApplication.TDPierToTulip.SetTestOptionsVal(MOBILE_PROXY_SETTING_AUTHENTICATION, _mcConnection.MobileProxySetting_Authentication); _qtpApplication.TDPierToTulip.SetTestOptionsVal(MOBILE_PROXY_SETTING_USERNAME, _mcConnection.MobileProxySetting_UserName); string encriptedMcProxyPassword = WinUserNativeMethods.ProtectBSTRToBase64(_mcConnection.MobileProxySetting_Password); if (encriptedMcProxyPassword == null) { ConsoleWriter.WriteLine("ProtectBSTRToBase64 fail for mc proxy Password"); throw new Exception("ProtectBSTRToBase64 fail for mc proxy Password"); } _qtpApplication.TDPierToTulip.SetTestOptionsVal(MOBILE_PROXY_SETTING_PASSWORD, encriptedMcProxyPassword); } // Mc info (device, app, launch and terminate data) if (!string.IsNullOrEmpty(_mobileInfo)) { _qtpApplication.TDPierToTulip.SetTestOptionsVal(MOBILE_INFO, _mobileInfo); } #endregion if (!_qtpApplication.Launched) { if (_runCancelled()) { QTPTestCleanup(); KillQtp(); runDesc.TestState = TestState.Error; return(runDesc); } // Launch application after set Addins _qtpApplication.Launch(); _qtpApplication.Visible = false; } } } catch (Exception e) { string errorMsg = e.Message; string errorStacktrace = string.IsNullOrWhiteSpace(e.StackTrace) ? string.Empty : e.StackTrace; errorReason = Resources.QtpNotLaunchedError + "\n" + string.Format(Resources.ExceptionDetails, errorMsg, errorStacktrace); if (e is SystemException) { errorReason += "\n" + Resources.QtpNotLaunchedError_PossibleSolution_RegModellib; } runDesc.TestState = TestState.Error; runDesc.ReportLocation = ""; runDesc.ErrorDesc = errorReason; return(runDesc); } if (_qtpApplication.Test != null && _qtpApplication.Test.Modified) { var message = Resources.QtpNotLaunchedError; errorReason = message; runDesc.TestState = TestState.Error; runDesc.ErrorDesc = errorReason; return(runDesc); } _qtpApplication.UseLicenseOfType(_useUFTLicense ? tagUnifiedLicenseType.qtUnifiedFunctionalTesting : tagUnifiedLicenseType.qtNonUnified); Dictionary <string, object> paramList = testinf.GetParameterDictionaryForQTP(); if (!HandleInputParameters(testPath, ref errorReason, testinf.GetParameterDictionaryForQTP(), testinf)) { runDesc.TestState = TestState.Error; runDesc.ErrorDesc = errorReason; return(runDesc); } GuiTestRunResult guiTestRunResult = ExecuteQTPRun(runDesc); // consider backward compatibility, here move the report folder one outside // that is, after test run, the report file might be at "path\to\tests\GUITest1\Report123\Report\run_results.html" // here move the last directory "Report" one level outside, which is, "path\to\tests\GUITest1\Report123\run_results.html" // steps: // 1. move directory "path\to\tests\GUITest1\Report123" to "path\to\tests\GUITest1\tmp_ddMMyyyyHHmmssfff" string guiTestReportPath = guiTestRunResult.ReportPath; // guiTestReportPath: path\to\tests\GUITest1\Report123\Report string targetReportDir = Path.GetDirectoryName(guiTestReportPath); // reportDir: path\to\tests\GUITest1\Report123 string reportBaseDir = Path.GetDirectoryName(targetReportDir); // reportBaseDir: path\to\tests\GUITest1 string tmpDir = Path.Combine(reportBaseDir, "tmp_" + DateTime.Now.ToString("ddMMyyyyHHmmssfff")); // tmpDir: path\to\tests\GUITest1\tmp_ddMMyyyyHHmmssfff // 1.a) directory move may fail because UFT might still be writting report files, need retry const int maxMoveDirRetry = 30; int moveDirRetry = 0; bool dirMoved = false; do { try { Directory.Move(targetReportDir, tmpDir); dirMoved = true; break; } catch (IOException) { moveDirRetry++; if (moveDirRetry == 1) { ConsoleWriter.WriteLine(DateTime.Now.ToString(Launcher.DateFormat) + string.Format(" Report is not ready yet, wait up to {0} seconds ...", maxMoveDirRetry)); } Thread.Sleep(1000); } } while (moveDirRetry < maxMoveDirRetry); if (dirMoved) { // 2. move directory "path\to\tests\GUITest1\tmp_ddMMyyyyHHmmssfff\Report" to "path\to\tests\GUITest1\Report123" string tmpReportDir = Path.Combine(tmpDir, "Report"); // tmpReportDir: path\to\tests\GUITest1\tmp_ddMMyyyyHHmmssfff\Report Directory.Move(tmpReportDir, targetReportDir); // 3. delete the temp directory "path\to\test1\tmp_ddMMyyyyHHmmssfff" Directory.Delete(tmpDir, true); runDesc.ReportLocation = targetReportDir; } else { runDesc.ReportLocation = guiTestReportPath; ConsoleWriter.WriteLine(DateTime.Now.ToString(Launcher.DateFormat) + " Warning: Report folder is still in use, leave it in: " + guiTestReportPath); } if (!guiTestRunResult.IsSuccess) { runDesc.TestState = TestState.Error; return(runDesc); } if (!HandleOutputArguments(ref errorReason)) { runDesc.TestState = TestState.Error; runDesc.ErrorDesc = errorReason; return(runDesc); } QTPTestCleanup(); return(runDesc); }
/// <summary> /// runs the given test /// </summary> /// <param name="testinf"></param> /// <param name="errorReason"></param> /// <param name="runCancelled">cancellation delegate, holds the function that checks cancellation</param> /// <returns></returns> public TestRunResults RunTest(TestInfo testinf, ref string errorReason, RunCancelledDelegate runCancelled) { TestRunResults runDesc = new TestRunResults(); ConsoleWriter.ActiveTestRun = runDesc; ConsoleWriter.WriteLine(DateTime.Now.ToString(Launcher.DateFormat) + " Running: " + testinf.TestPath); runDesc.TestPath = testinf.TestPath; // check if the report path has been defined if (!string.IsNullOrWhiteSpace(testinf.ReportPath)) { runDesc.ReportLocation = testinf.ReportPath; ConsoleWriter.WriteLine(DateTime.Now.ToString(Launcher.DateFormat) + " Report path is set explicitly: " + runDesc.ReportLocation); } else if (!String.IsNullOrEmpty(testinf.ReportBaseDirectory)) { if (!Helper.TrySetTestReportPath(runDesc, testinf, ref errorReason)) { return(runDesc); } ConsoleWriter.WriteLine(DateTime.Now.ToString(Launcher.DateFormat) + " Report path is generated under base directory: " + runDesc.ReportLocation); } else { // default report location is the next available folder under test path // for example, "path\to\tests\APITest\Report123", the name "Report123" will also be used as the report name string reportBasePath = testinf.TestPath; string testReportPath = Path.Combine(reportBasePath, "Report" + DateTime.Now.ToString("ddMMyyyyHHmmssfff")); int index = 0; while (index < int.MaxValue) { index++; string dir = Path.Combine(reportBasePath, "Report" + index.ToString()); if (!Directory.Exists(dir)) { testReportPath = dir; break; } } runDesc.ReportLocation = testReportPath; ConsoleWriter.WriteLine(DateTime.Now.ToString(Launcher.DateFormat) + " Report path is automatically generated: " + runDesc.ReportLocation); } runDesc.ErrorDesc = errorReason; runDesc.TestState = TestState.Unknown; if (!Helper.IsServiceTestInstalled()) { runDesc.TestState = TestState.Error; runDesc.ErrorDesc = string.Format(Resources.LauncherStNotInstalled, System.Environment.MachineName); ConsoleWriter.WriteErrLine(runDesc.ErrorDesc); Environment.ExitCode = (int)Launcher.ExitCodeEnum.Failed; return(runDesc); } _runCancelled = runCancelled; if (!_stCanRun) { runDesc.TestState = TestState.Error; runDesc.ErrorDesc = Resources.STExecuterNotFound; return(runDesc); } string fileName = Path.Combine(_stExecuterPath, STRunnerName); if (!File.Exists(fileName)) { runDesc.TestState = TestState.Error; runDesc.ErrorDesc = Resources.STExecuterNotFound; ConsoleWriter.WriteErrLine(Resources.STExecuterNotFound); return(runDesc); } //write the input parameter xml file for the API test string paramFileName = Guid.NewGuid().ToString().Replace("-", string.Empty).Substring(0, 10); string tempPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "TestParams"); Directory.CreateDirectory(tempPath); string paramsFilePath = Path.Combine(tempPath, "params" + paramFileName + ".xml"); string paramFileContent = testinf.GenerateAPITestXmlForTest(); string argumentString = ""; if (!string.IsNullOrWhiteSpace(paramFileContent)) { File.WriteAllText(paramsFilePath, paramFileContent); argumentString = String.Format("{0} \"{1}\" {2} \"{3}\" {4} \"{5}\"", STRunnerTestArg, testinf.TestPath, STRunnerReportArg, runDesc.ReportLocation, STRunnerInputParamsArg, paramsFilePath); } else { argumentString = String.Format("{0} \"{1}\" {2} \"{3}\"", STRunnerTestArg, testinf.TestPath, STRunnerReportArg, runDesc.ReportLocation); } Stopwatch s = Stopwatch.StartNew(); runDesc.TestState = TestState.Running; if (!ExecuteProcess(fileName, argumentString, ref errorReason)) { runDesc.TestState = TestState.Error; runDesc.ErrorDesc = errorReason; } else { // consider backward compatibility, here move the report folder one outside // that is, after test run, the report file might be at "path\to\tests\APITest1\Report123\Report\run_results.html" // here move the last directory "Report" one level outside, which is, "path\to\tests\APITest1\Report123\run_results.html" string apiTestReportPath = Path.Combine(runDesc.ReportLocation, "Report"); // apiTestReportPath: path\to\tests\APITest1\Report123\Report string targetReportDir = Path.GetDirectoryName(apiTestReportPath); // reportDir: path\to\tests\APITest1\Report123 string reportBaseDir = Path.GetDirectoryName(targetReportDir); // reportBaseDir: path\to\tests\APITest1 string tmpDir = Path.Combine(reportBaseDir, "tmp_" + DateTime.Now.ToString("ddMMyyyyHHmmssfff")); // tmpDir: path\to\tests\APITest1\tmp_ddMMyyyyHHmmssfff string tmpReportDir = Path.Combine(tmpDir, "Report"); // tmpReportDir: path\to\tests\APITest1\tmp_ddMMyyyyHHmmssfff\Report // since some files might not be closed yet, move the report folder might fail // so here will try a few times to move folder and let it as is (not moved) if still failed after several retry bool moveSuccess = false; string lastMoveError = string.Empty; int retry = 10; while (retry >= 0) { try { // steps: // 1. move directory "path\to\tests\APITest1\Report123" to "path\to\tests\APITest1\tmp_ddMMyyyyHHmmssfff" Directory.Move(targetReportDir, tmpDir); // 2. move directory "path\to\tests\APITest1\tmp_ddMMyyyyHHmmssfff\Report" to "path\to\tests\APITest1\Report123" Directory.Move(tmpReportDir, targetReportDir); // 3. delete empty directory "path\to\test1\tmp_ddMMyyyyHHmmssfff" Directory.Delete(tmpDir, true); // 4. update report location runDesc.ReportLocation = targetReportDir; moveSuccess = true; break; } catch (Exception ex) { lastMoveError = ex.Message; retry--; System.Threading.Thread.Sleep(500); } } if (!moveSuccess) { ConsoleWriter.WriteLine("Warning: Failed to change the report folder structure. " + lastMoveError); } if (!File.Exists(Path.Combine(runDesc.ReportLocation, "Results.xml")) && !File.Exists(Path.Combine(runDesc.ReportLocation, "run_results.html"))) { runDesc.TestState = TestState.Error; runDesc.ErrorDesc = "No Results.xml or run_results.html file found"; } } //File.Delete(paramsFilePath); runDesc.Runtime = s.Elapsed; return(runDesc); }
private testcase CreateXmlFromUFTRunResults(TestRunResults testRes) { testcase tc = new testcase { systemout = testRes.ConsoleOut, systemerr = testRes.ConsoleErr, report = testRes.ReportLocation, classname = "All-Tests." + ((testRes.TestGroup == null) ? "" : testRes.TestGroup.Replace(".", "_")), name = testRes.TestPath, type = testRes.TestType, time = testRes.Runtime.TotalSeconds.ToString() }; if (!string.IsNullOrWhiteSpace(testRes.FailureDesc)) tc.AddFailure(new failure { message = testRes.FailureDesc }); switch (testRes.TestState) { case TestState.Passed: tc.status = "pass"; break; case TestState.Failed: tc.status = "fail"; break; case TestState.Error: tc.status = "error"; break; case TestState.Warning: tc.status = "warning"; break; default: tc.status = "pass"; break; } if (!string.IsNullOrWhiteSpace(testRes.ErrorDesc)) tc.AddError(new error { message = testRes.ErrorDesc }); return tc; }
/// <summary> /// runs all tests given to this runner and returns a suite of run results /// </summary> /// <returns>The rest run results for each test</returns> public override TestSuiteRunResults Run() { //create a new Run Results object TestSuiteRunResults activeRunDesc = new TestSuiteRunResults(); double totalTime = 0; try { var start = DateTime.Now; Dictionary <string, int> indexList = new Dictionary <string, int>(); foreach (var test in _tests) { indexList[test.TestPath] = 0; } Dictionary <string, int> rerunList = createDictionary(_tests); foreach (var test in _tests) { if (indexList[test.TestPath] == 0) { indexList[test.TestPath] = 1; } if (RunCancelled()) { break; } var testStart = DateTime.Now; string errorReason = string.Empty; TestRunResults runResult = null; try { runResult = RunHpToolsTest(test, ref errorReason); } catch (Exception ex) { runResult = new TestRunResults { TestState = TestState.Error, ErrorDesc = ex.Message, TestName = test.TestName, TestPath = test.TestPath }; } //get the original source for this test, for grouping tests under test classes runResult.TestGroup = test.TestGroup; activeRunDesc.TestRuns.Add(runResult); //if fail was terminated before this step, continue if (runResult.TestState != TestState.Failed) { if (runResult.TestState != TestState.Error) { Helper.GetTestStateFromReport(runResult); } else { if (string.IsNullOrEmpty(runResult.ErrorDesc)) { runResult.ErrorDesc = RunCancelled() ? HpToolsLauncher.Properties.Resources.ExceptionUserCancelled : HpToolsLauncher.Properties.Resources.ExceptionExternalProcess; } runResult.ReportLocation = null; runResult.TestState = TestState.Error; } } if (runResult.TestState == TestState.Passed && runResult.HasWarnings) { runResult.TestState = TestState.Warning; ConsoleWriter.WriteLine(Resources.FsRunnerTestDoneWarnings); } else { ConsoleWriter.WriteLine(string.Format(Resources.FsRunnerTestDone, runResult.TestState)); } ConsoleWriter.WriteLine(DateTime.Now.ToString(Launcher.DateFormat) + " Test complete: " + runResult.TestPath + "\n-------------------------------------------------------------------------------------------------------"); UpdateCounters(runResult.TestState); var testTotalTime = (DateTime.Now - testStart).TotalSeconds; //create test folders if (rerunList[test.TestPath] > 0) { if (!Directory.Exists(Path.Combine(test.TestPath, "Report1"))) { rerunList[test.TestPath]--; } else { indexList[test.TestPath]++; rerunList[test.TestPath]--; } } //update report folder String uftReportDir = Path.Combine(test.TestPath, "Report"); String uftReportDirNew = Path.Combine(test.TestPath, "Report" + indexList[test.TestPath]); try { if (Directory.Exists(uftReportDir)) { if (Directory.Exists(uftReportDirNew)) { Helper.DeleteDirectory(uftReportDirNew); } Directory.Move(uftReportDir, uftReportDirNew); } } catch { System.Threading.Thread.Sleep(1000); Directory.Move(uftReportDir, uftReportDirNew); } } totalTime = (DateTime.Now - start).TotalSeconds; } finally { activeRunDesc.NumTests = _tests.Count; activeRunDesc.NumErrors = _errors; activeRunDesc.TotalRunTime = TimeSpan.FromSeconds(totalTime); activeRunDesc.NumFailures = _fail; foreach (IFileSysTestRunner cleanupRunner in _colRunnersForCleanup.Values) { cleanupRunner.CleanUp(); } } return(activeRunDesc); }
public void TestGetTestStateFromReport() { TestRunResults res = new TestRunResults { ReportLocation = @"c:\Temp\report\" }; TestState state = Helper.GetTestStateFromReport(res); }
private void UpdateCounters(TestRunResults test, TestSuiteRunResults testSuite) { if (test.TestState != TestState.Running && test.TestState != TestState.Waiting && test.TestState != TestState.Unknown) ++testSuite.NumTests; if (test.TestState == TestState.Failed) ++testSuite.NumFailures; if (test.TestState == TestState.Error) ++testSuite.NumErrors; }
/// <summary> /// runs a test set with given parameters (and a valid connection to the QC server) /// </summary> /// <param name="tsFolderName">testSet folder name</param> /// <param name="tsName">testSet name</param> /// <param name="timeout">-1 for unlimited, or number of miliseconds</param> /// <param name="runMode">run on LocalMachine or remote</param> /// <param name="runHost">if run on remote machine - remote machine name</param> /// <returns></returns> public TestSuiteRunResults RunTestSet(string tsFolderName, string tsName, double timeout, QcRunMode runMode, string runHost) { string currentTestSetInstances = ""; TestSuiteRunResults runDesc = new TestSuiteRunResults(); TestRunResults activeTestDesc = null; var tsFactory = tdConnection.TestSetFactory; var tsTreeManager = (ITestSetTreeManager)tdConnection.TestSetTreeManager; List tsList = null; string tsPath = "Root\\" + tsFolderName; ITestSetFolder tsFolder = null; try { tsFolder = (ITestSetFolder)tsTreeManager.get_NodeByPath(tsPath); } catch (COMException ex) { //not found tsFolder = null; } if (tsFolder == null) { //node wasn't found, folder = null ConsoleWriter.WriteErrLine(string.Format(Resources.AlmRunnerNoSuchFolder, tsFolder)); //this will make sure run will fail at the end. (since there was an error) Launcher.ExitCode = Launcher.ExitCodeEnum.Failed; return(null); } else { tsList = tsFolder.FindTestSets(tsName); } if (tsList == null) { ConsoleWriter.WriteLine(string.Format(Resources.AlmRunnerCantFindTest, tsName)); //this will make sure run will fail at the end. (since there was an error) Launcher.ExitCode = Launcher.ExitCodeEnum.Failed; return(null); } ITestSet targetTestSet = null; foreach (ITestSet ts in tsList) { if (ts.Name.Equals(tsName, StringComparison.InvariantCultureIgnoreCase)) { targetTestSet = ts; break; } } if (targetTestSet == null) { ConsoleWriter.WriteLine(string.Format(Resources.AlmRunnerCantFindTest, tsName)); //this will make sure run will fail at the end. (since there was an error) Launcher.ExitCode = Launcher.ExitCodeEnum.Failed; return(null); } ConsoleWriter.WriteLine(Resources.GeneralDoubleSeperator); ConsoleWriter.WriteLine(Resources.AlmRunnerStartingExecution); ConsoleWriter.WriteLine(string.Format(Resources.AlmRunnerDisplayTest, tsName, targetTestSet.ID)); ITSScheduler Scheduler = null; try { //need to run this to install everyhting needed http://AlmServer:8080/qcbin/start_a.jsp?common=true //start the scheduler Scheduler = targetTestSet.StartExecution(""); } catch (Exception ex) { Scheduler = null; } try { currentTestSetInstances = GetTestInstancesString(targetTestSet); } catch (Exception ex) { } if (Scheduler == null) { Console.WriteLine(GetAlmNotInstalledError()); //proceeding with program execution is tasteless, since nothing will run without a properly installed QC. Environment.Exit((int)Launcher.ExitCodeEnum.Failed); } TSTestFactory tsTestFactory = targetTestSet.TSTestFactory; ITDFilter2 tdFilter = tsTestFactory.Filter; tdFilter["TC_CYCLE_ID"] = targetTestSet.ID.ToString(); IList tList = tsTestFactory.NewList(tdFilter.Text); try { //set up for the run depending on where the test instances are to execute switch (runMode) { case QcRunMode.RUN_LOCAL: // run all tests on the local machine Scheduler.RunAllLocally = true; break; case QcRunMode.RUN_REMOTE: // run tests on a specified remote machine Scheduler.TdHostName = runHost; break; // RunAllLocally must not be set for remote invocation of tests. As such, do not do this: Scheduler.RunAllLocally = False case QcRunMode.RUN_PLANNED_HOST: // run on the hosts as planned in the test set Scheduler.RunAllLocally = false; break; } } catch (Exception ex) { ConsoleWriter.WriteLine(string.Format(Resources.AlmRunnerProblemWithHost, ex.Message)); } ConsoleWriter.WriteLine(Resources.AlmRunnerNumTests + tList.Count); int i = 1; foreach (ITSTest3 test in tList) { string runOnHost = runHost; if (runMode == QcRunMode.RUN_PLANNED_HOST) { runOnHost = test.HostName; } //if host isn't taken from QC (PLANNED) and not from the test definition (REMOTE), take it from LOCAL (machineName) string hostName = runOnHost; if (runMode == QcRunMode.RUN_LOCAL) { hostName = Environment.MachineName; } ConsoleWriter.WriteLine(string.Format(Resources.AlmRunnerDisplayTestRunOnHost, i, test.Name, hostName)); Scheduler.RunOnHost[test.ID] = runOnHost; var testResults = new TestRunResults(); testResults.TestName = test.Name; runDesc.TestRuns.Add(testResults); i = i + 1; } Stopwatch sw = Stopwatch.StartNew(); Stopwatch testSw = null; try { //tests are actually run Scheduler.Run(); } catch (Exception ex) { ConsoleWriter.WriteLine(Resources.AlmRunnerRunError + ex.Message); } ConsoleWriter.WriteLine(Resources.AlmRunnerSchedStarted + DateTime.Now.ToString(Launcher.DateFormat)); ConsoleWriter.WriteLine(Resources.SingleSeperator); IExecutionStatus executionStatus = Scheduler.ExecutionStatus; bool tsExecutionFinished = false; ITSTest prevTest = null; ITSTest currentTest = null; string abortFilename = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\stop" + Launcher.UniqueTimeStamp + ".txt"; //wait for the tests to end ("normally" or because of the timeout) while ((tsExecutionFinished == false) && (timeout == -1 || sw.Elapsed.TotalSeconds < timeout)) { executionStatus.RefreshExecStatusInfo("all", true); tsExecutionFinished = executionStatus.Finished; if (System.IO.File.Exists(abortFilename)) { break; } for (int j = 1; j <= executionStatus.Count; ++j) { TestExecStatus testExecStatusObj = executionStatus[j]; activeTestDesc = UpdateTestStatus(runDesc, targetTestSet, testExecStatusObj, true); if (activeTestDesc.PrevTestState != activeTestDesc.TestState) { TestState tstate = activeTestDesc.TestState; if (tstate == TestState.Running) { currentTest = targetTestSet.TSTestFactory[testExecStatusObj.TSTestId]; int testIndex = GetIdxByTestName(currentTest.Name, runDesc); int prevRunId = GetTestRunId(currentTest); runDesc.TestRuns[testIndex].PrevRunId = prevRunId; //closing previous test if (prevTest != null) { WriteTestRunSummary(prevTest); } //starting new test prevTest = currentTest; //assign the new test the consol writer so it will gather the output ConsoleWriter.ActiveTestRun = runDesc.TestRuns[testIndex]; ConsoleWriter.WriteLine(DateTime.Now.ToString(Launcher.DateFormat) + " Running: " + currentTest.Name); //tell user that the test is running ConsoleWriter.WriteLine(DateTime.Now.ToString(Launcher.DateFormat) + " Running test: " + activeTestDesc.TestName + ", Test id: " + testExecStatusObj.TestId + ", Test instance id: " + testExecStatusObj.TSTestId); //start timing the new test run string foldername = ""; ITestSetFolder folder = targetTestSet.TestSetFolder as ITestSetFolder; if (folder != null) { foldername = folder.Name.Replace(".", "_"); } //the test group is it's test set. (dots are problematic since jenkins parses them as seperators between packadge and class) activeTestDesc.TestGroup = foldername + "\\" + targetTestSet.Name; activeTestDesc.TestGroup = activeTestDesc.TestGroup.Replace(".", "_"); } TestState enmState = GetTsStateFromQcState(testExecStatusObj.Status as string); string statusString = enmState.ToString(); if (enmState == TestState.Running) { ConsoleWriter.WriteLine(string.Format(Resources.AlmRunnerStat, activeTestDesc.TestName, testExecStatusObj.TSTestId, statusString)); } else if (enmState != TestState.Waiting) { ConsoleWriter.WriteLine(string.Format(Resources.AlmRunnerStatWithMessage, activeTestDesc.TestName, testExecStatusObj.TSTestId, statusString, testExecStatusObj.Message)); } if (System.IO.File.Exists(abortFilename)) { break; } } } //wait 0.2 seconds Thread.Sleep(200); //check for abortion if (System.IO.File.Exists(abortFilename)) { _blnRunCancelled = true; ConsoleWriter.WriteLine(Resources.GeneralStopAborted); //stop all test instances in this testSet. Scheduler.Stop(currentTestSetInstances); ConsoleWriter.WriteLine(Resources.GeneralAbortedByUser); //stop working Environment.Exit((int)Launcher.ExitCodeEnum.Aborted); } } //check status for each test if (timeout == -1 || sw.Elapsed.TotalSeconds < timeout) { //close last test if (prevTest != null) { WriteTestRunSummary(prevTest); } //done with all tests, stop collecting output in the testRun object. ConsoleWriter.ActiveTestRun = null; for (int k = 1; k <= executionStatus.Count; ++k) { if (System.IO.File.Exists(abortFilename)) { break; } TestExecStatus testExecStatusObj = executionStatus[k]; activeTestDesc = UpdateTestStatus(runDesc, targetTestSet, testExecStatusObj, false); UpdateCounters(activeTestDesc, runDesc); currentTest = targetTestSet.TSTestFactory[testExecStatusObj.TSTestId]; string testPath = "Root\\" + tsFolderName + "\\" + tsName + "\\" + activeTestDesc.TestName; activeTestDesc.TestPath = testPath; } //update the total runtime runDesc.TotalRunTime = sw.Elapsed; ConsoleWriter.WriteLine(string.Format(Resources.AlmRunnerTestsetDone, tsName, DateTime.Now.ToString(Launcher.DateFormat))); } else { _blnRunCancelled = true; ConsoleWriter.WriteLine(Resources.GeneralTimedOut); Launcher.ExitCode = Launcher.ExitCodeEnum.Aborted; } return(runDesc); }
/// <summary> /// runs a test set with given parameters (and a valid connection to the QC server) /// </summary> /// <param name="tsFolderName">testSet folder name</param> /// <param name="tsName">testSet name</param> /// <param name="timeout">-1 for unlimited, or number of miliseconds</param> /// <param name="runMode">run on LocalMachine or remote</param> /// <param name="runHost">if run on remote machine - remote machine name</param> /// <returns></returns> public TestSuiteRunResults RunTestSet(string tsFolderName, string tsName, double timeout, QcRunMode runMode, string runHost) { string currentTestSetInstances = ""; TestSuiteRunResults runDesc = new TestSuiteRunResults(); TestRunResults activeTestDesc = null; var tsFactory = tdConnection.TestSetFactory; var tsTreeManager = (ITestSetTreeManager)tdConnection.TestSetTreeManager; List tsList = null; string tsPath = "Root\\" + tsFolderName; ITestSetFolder tsFolder = null; try { tsFolder = (ITestSetFolder)tsTreeManager.get_NodeByPath(tsPath); } catch (COMException ex) { //not found tsFolder = null; } if (tsFolder == null) { //node wasn't found, folder = null ConsoleWriter.WriteErrLine(string.Format(Resources.AlmRunnerNoSuchFolder, tsFolder)); //this will make sure run will fail at the end. (since there was an error) Launcher.ExitCode = Launcher.ExitCodeEnum.Failed; return null; } else { tsList = tsFolder.FindTestSets(tsName); } if (tsList == null) { ConsoleWriter.WriteLine(string.Format(Resources.AlmRunnerCantFindTest, tsName)); //this will make sure run will fail at the end. (since there was an error) Launcher.ExitCode = Launcher.ExitCodeEnum.Failed; return null; } ITestSet targetTestSet = null; foreach (ITestSet ts in tsList) { if (ts.Name.Equals(tsName, StringComparison.InvariantCultureIgnoreCase)) { targetTestSet = ts; break; } } if (targetTestSet == null) { ConsoleWriter.WriteLine(string.Format(Resources.AlmRunnerCantFindTest, tsName)); //this will make sure run will fail at the end. (since there was an error) Launcher.ExitCode = Launcher.ExitCodeEnum.Failed; return null; } ConsoleWriter.WriteLine(Resources.GeneralDoubleSeperator); ConsoleWriter.WriteLine(Resources.AlmRunnerStartingExecution); ConsoleWriter.WriteLine(string.Format(Resources.AlmRunnerDisplayTest, tsName, targetTestSet.ID)); ITSScheduler Scheduler = null; try { //need to run this to install everyhting needed http://AlmServer:8080/qcbin/start_a.jsp?common=true //start the scheduler Scheduler = targetTestSet.StartExecution(""); } catch (Exception ex) { Scheduler = null; } try { currentTestSetInstances = GetTestInstancesString(targetTestSet); } catch (Exception ex) { } if (Scheduler == null) { Console.WriteLine(GetAlmNotInstalledError()); //proceeding with program execution is tasteless, since nothing will run without a properly installed QC. Environment.Exit((int)Launcher.ExitCodeEnum.Failed); } TSTestFactory tsTestFactory = targetTestSet.TSTestFactory; ITDFilter2 tdFilter = tsTestFactory.Filter; tdFilter["TC_CYCLE_ID"] = targetTestSet.ID.ToString(); IList tList = tsTestFactory.NewList(tdFilter.Text); try { //set up for the run depending on where the test instances are to execute switch (runMode) { case QcRunMode.RUN_LOCAL: // run all tests on the local machine Scheduler.RunAllLocally = true; break; case QcRunMode.RUN_REMOTE: // run tests on a specified remote machine Scheduler.TdHostName = runHost; break; // RunAllLocally must not be set for remote invocation of tests. As such, do not do this: Scheduler.RunAllLocally = False case QcRunMode.RUN_PLANNED_HOST: // run on the hosts as planned in the test set Scheduler.RunAllLocally = false; break; } } catch (Exception ex) { ConsoleWriter.WriteLine(string.Format(Resources.AlmRunnerProblemWithHost, ex.Message)); } ConsoleWriter.WriteLine(Resources.AlmRunnerNumTests + tList.Count); int i = 1; foreach (ITSTest3 test in tList) { string runOnHost = runHost; if (runMode == QcRunMode.RUN_PLANNED_HOST) runOnHost = test.HostName; //if host isn't taken from QC (PLANNED) and not from the test definition (REMOTE), take it from LOCAL (machineName) string hostName = runOnHost; if (runMode == QcRunMode.RUN_LOCAL) { hostName = Environment.MachineName; } ConsoleWriter.WriteLine(string.Format(Resources.AlmRunnerDisplayTestRunOnHost, i, test.Name, hostName)); Scheduler.RunOnHost[test.ID] = runOnHost; var testResults = new TestRunResults(); testResults.TestName = test.Name; runDesc.TestRuns.Add(testResults); i = i + 1; } Stopwatch sw = Stopwatch.StartNew(); Stopwatch testSw = null; try { //tests are actually run Scheduler.Run(); } catch (Exception ex) { ConsoleWriter.WriteLine(Resources.AlmRunnerRunError + ex.Message); } ConsoleWriter.WriteLine(Resources.AlmRunnerSchedStarted + DateTime.Now.ToString(Launcher.DateFormat)); ConsoleWriter.WriteLine(Resources.SingleSeperator); IExecutionStatus executionStatus = Scheduler.ExecutionStatus; bool tsExecutionFinished = false; ITSTest prevTest = null; ITSTest currentTest = null; string abortFilename = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\stop" + Launcher.UniqueTimeStamp + ".txt"; //wait for the tests to end ("normally" or because of the timeout) while ((tsExecutionFinished == false) && (timeout == -1 || sw.Elapsed.TotalSeconds < timeout)) { executionStatus.RefreshExecStatusInfo("all", true); tsExecutionFinished = executionStatus.Finished; if (System.IO.File.Exists(abortFilename)) { break; } for (int j = 1; j <= executionStatus.Count; ++j) { TestExecStatus testExecStatusObj = executionStatus[j]; currentTest = targetTestSet.TSTestFactory[testExecStatusObj.TSTestId]; if (currentTest == null) { ConsoleWriter.WriteLine(string.Format("currentTest is null for test.{0} during execution", j)); continue; } activeTestDesc = UpdateTestStatus(runDesc, targetTestSet, testExecStatusObj, true); if (activeTestDesc.PrevTestState != activeTestDesc.TestState) { TestState tstate = activeTestDesc.TestState; if (tstate == TestState.Running) { //currentTest = targetTestSet.TSTestFactory[testExecStatusObj.TSTestId]; int testIndex = GetIdxByTestName(currentTest.Name, runDesc); int prevRunId = GetTestRunId(currentTest); runDesc.TestRuns[testIndex].PrevRunId = prevRunId; //closing previous test if (prevTest != null) { WriteTestRunSummary(prevTest); } //starting new test prevTest = currentTest; //assign the new test the consol writer so it will gather the output ConsoleWriter.ActiveTestRun = runDesc.TestRuns[testIndex]; ConsoleWriter.WriteLine(DateTime.Now.ToString(Launcher.DateFormat) + " Running: " + currentTest.Name); //tell user that the test is running ConsoleWriter.WriteLine(DateTime.Now.ToString(Launcher.DateFormat) + " Running test: " + activeTestDesc.TestName + ", Test id: " + testExecStatusObj.TestId + ", Test instance id: " + testExecStatusObj.TSTestId); //start timing the new test run string foldername = ""; ITestSetFolder folder = targetTestSet.TestSetFolder as ITestSetFolder; if (folder != null) foldername = folder.Name.Replace(".", "_"); //the test group is it's test set. (dots are problematic since jenkins parses them as seperators between packadge and class) activeTestDesc.TestGroup = foldername + "\\" + targetTestSet.Name; activeTestDesc.TestGroup = activeTestDesc.TestGroup.Replace(".", "_"); } TestState enmState = GetTsStateFromQcState(testExecStatusObj.Status as string); string statusString = enmState.ToString(); if (enmState == TestState.Running) { ConsoleWriter.WriteLine(string.Format(Resources.AlmRunnerStat, activeTestDesc.TestName, testExecStatusObj.TSTestId, statusString)); } else if (enmState != TestState.Waiting) { ConsoleWriter.WriteLine(string.Format(Resources.AlmRunnerStatWithMessage, activeTestDesc.TestName, testExecStatusObj.TSTestId, statusString, testExecStatusObj.Message)); } if (System.IO.File.Exists(abortFilename)) { break; } } } //wait 0.2 seconds Thread.Sleep(200); //check for abortion if (System.IO.File.Exists(abortFilename)) { _blnRunCancelled = true; ConsoleWriter.WriteLine(Resources.GeneralStopAborted); //stop all test instances in this testSet. Scheduler.Stop(currentTestSetInstances); ConsoleWriter.WriteLine(Resources.GeneralAbortedByUser); //stop working Environment.Exit((int)Launcher.ExitCodeEnum.Aborted); } } //check status for each test if (timeout == -1 || sw.Elapsed.TotalSeconds < timeout) { //close last test if (prevTest != null) { WriteTestRunSummary(prevTest); } //done with all tests, stop collecting output in the testRun object. ConsoleWriter.ActiveTestRun = null; for (int k = 1; k <= executionStatus.Count; ++k) { if (System.IO.File.Exists(abortFilename)) { break; } TestExecStatus testExecStatusObj = executionStatus[k]; currentTest = targetTestSet.TSTestFactory[testExecStatusObj.TSTestId]; if (currentTest == null) { ConsoleWriter.WriteLine(string.Format("currentTest is null for test.{0} after whole execution", k)); continue; } activeTestDesc = UpdateTestStatus(runDesc, targetTestSet, testExecStatusObj, false); UpdateCounters(activeTestDesc, runDesc); //currentTest = targetTestSet.TSTestFactory[testExecStatusObj.TSTestId]; string testPath = "Root\\" + tsFolderName + "\\" + tsName + "\\" + activeTestDesc.TestName; activeTestDesc.TestPath = testPath; } //update the total runtime runDesc.TotalRunTime = sw.Elapsed; ConsoleWriter.WriteLine(string.Format(Resources.AlmRunnerTestsetDone, tsName, DateTime.Now.ToString(Launcher.DateFormat))); } else { _blnRunCancelled = true; ConsoleWriter.WriteLine(Resources.GeneralTimedOut); Launcher.ExitCode = Launcher.ExitCodeEnum.Aborted; } return runDesc; }
/// <summary> /// updates the test status in our list of tests /// </summary> /// <param name="targetTestSet"></param> /// <param name="testExecStatusObj"></param> private TestRunResults UpdateTestStatus(TestSuiteRunResults runResults, ITestSet targetTestSet, TestExecStatus testExecStatusObj, bool onlyUpdateState) { TestRunResults qTest = null; ITSTest currentTest = null; try { //find the test for the given status object currentTest = targetTestSet.TSTestFactory[testExecStatusObj.TSTestId]; //find the test in our list int testIndex = GetIdxByTestName(currentTest.Name, runResults); qTest = runResults.TestRuns[testIndex]; if (qTest.TestType == null) { qTest.TestType = GetTestType(currentTest); } //update the state qTest.PrevTestState = qTest.TestState; qTest.TestState = GetTsStateFromQcState(testExecStatusObj.Status); if (!onlyUpdateState) { try { //duration and status are updated according to the run qTest.Runtime = TimeSpan.FromSeconds(currentTest.LastRun.Field("RN_DURATION")); } catch { //a problem getting duration, maybe the test isn't done yet - don't stop the flow.. } switch (qTest.TestState) { case TestState.Failed: qTest.FailureDesc = GenerateFailedLog(currentTest.LastRun); if (string.IsNullOrWhiteSpace(qTest.FailureDesc)) { qTest.FailureDesc = testExecStatusObj.Status + " : " + testExecStatusObj.Message; } break; case TestState.Error: qTest.ErrorDesc = testExecStatusObj.Status + " : " + testExecStatusObj.Message; break; default: break; } //check qc version for link type bool oldQc = CheckIsOldQc(); //string testLink = "<a href=\"testdirector:mydtqc01.isr.hp.com:8080/qcbin," + m_qcProject + "," + m_qcDomain + "," + targetTestSet.Name+ ";test-instance:" + testExecStatusObj.TestInstance + "\"> Alm link</a>"; string serverURl = m_qcServer.TrimEnd("/".ToCharArray()); if (serverURl.ToLower().StartsWith("http://")) { serverURl = serverURl.Substring(7); } //string testLinkInLabQc10 = "td://" + m_qcProject + "." + m_qcDomain + "." + m_qcServer.Replace("http://", "") + "/Test%20Lab?Action=FindTestInstance&TestSetID=" + targetTestSet.ID + "&TestInstanceID=" + testExecStatusObj.TSTestId; //string testLinkInLab = "td://" + m_qcProject + "." + m_qcDomain + "." + m_qcServer.Replace("http://", "") + "/TestLabModule-000000003649890581?EntityType=ITestInstance&EntityID=" + testExecStatusObj.TSTestId; int runid = GetTestRunId(currentTest); string linkStr = GetTestRunLink(currentTest, runid); string statusString = GetTsStateFromQcState(testExecStatusObj.Status as string).ToString(); ConsoleWriter.WriteLine(string.Format(Resources.AlmRunnerTestStat, currentTest.Name, statusString, testExecStatusObj.Message, linkStr)); runResults.TestRuns[testIndex] = qTest; } } catch (Exception ex) { ConsoleWriter.WriteLine(string.Format(Resources.AlmRunnerErrorGettingStat, currentTest.Name, ex.Message)); } return(qTest); }
public static TestState GetTestStateFromLRReport(TestRunResults runDesc, string[] resultFiles) { foreach (string resultFileFullPath in resultFiles) { string desc = ""; runDesc.TestState = GetTestStateFromLRReport(resultFileFullPath, out desc); if (runDesc.TestState == TestState.Failed) { runDesc.ErrorDesc = desc; break; } } return runDesc.TestState; }
/// <summary> /// runs the given test /// </summary> /// <param name="testinf"></param> /// <param name="errorReason"></param> /// <param name="runCancelled">cancellation delegate, holds the function that checks cancellation</param> /// <returns></returns> public TestRunResults RunTest(TestInfo testinf, ref string errorReason, RunCancelledDelegate runCancelled) { TestRunResults runDesc = new TestRunResults(); ConsoleWriter.ActiveTestRun = runDesc; ConsoleWriter.WriteLine(DateTime.Now.ToString(Launcher.DateFormat) + " Running: " + testinf.TestPath); runDesc.ReportLocation = Helper.CreateTempDir(); runDesc.ErrorDesc = errorReason; runDesc.TestPath = testinf.TestPath; runDesc.TestState = TestState.Unknown; if (!Helper.IsServiceTestInstalled()) { runDesc.TestState = TestState.Error; runDesc.ErrorDesc = string.Format(Resources.LauncherStNotInstalled, System.Environment.MachineName); ConsoleWriter.WriteErrLine(runDesc.ErrorDesc); Environment.ExitCode = (int)Launcher.ExitCodeEnum.Failed; return runDesc; } _runCancelled = runCancelled; if (!_stCanRun) { runDesc.TestState = TestState.Error; runDesc.ErrorDesc = Resources.STExecuterNotFound; return runDesc; } string fileName = Path.Combine(_stExecuterPath, STRunnerName); if (!File.Exists(fileName)) { runDesc.TestState = TestState.Error; runDesc.ErrorDesc = Resources.STExecuterNotFound; ConsoleWriter.WriteErrLine(Resources.STExecuterNotFound); return runDesc; } //write the input parameter xml file for the API test string paramFileName = Guid.NewGuid().ToString().Replace("-", string.Empty).Substring(0, 10); string tempPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "TestParams"); Directory.CreateDirectory(tempPath); string paramsFilePath = Path.Combine(tempPath, "params" + paramFileName + ".xml"); string paramFileContent = testinf.GenerateAPITestXmlForTest(); string argumentString = ""; if (!string.IsNullOrWhiteSpace(paramFileContent)) { File.WriteAllText(paramsFilePath, paramFileContent); argumentString = String.Format("{0} \"{1}\" {2} \"{3}\" {4} \"{5}\"", STRunnerTestArg, testinf.TestPath, STRunnerReportArg, runDesc.ReportLocation, STRunnerInputParamsArg, paramsFilePath); } else { argumentString = String.Format("{0} \"{1}\" {2} \"{3}\"", STRunnerTestArg, testinf.TestPath, STRunnerReportArg, runDesc.ReportLocation); } Stopwatch s = Stopwatch.StartNew(); runDesc.TestState = TestState.Running; if (!ExecuteProcess(fileName, argumentString, ref errorReason)) { runDesc.TestState = TestState.Error; runDesc.ErrorDesc = errorReason; } else { runDesc.ReportLocation = Path.Combine(runDesc.ReportLocation, "Report"); if (!File.Exists(Path.Combine(runDesc.ReportLocation, "Results.xml"))) { runDesc.TestState = TestState.Error; runDesc.ErrorDesc = "No Results.xml file found"; } } //File.Delete(paramsFilePath); runDesc.Runtime = s.Elapsed; return runDesc; }
public static TestState GetTestStateFromReport(TestRunResults runDesc) { try { if (!Directory.Exists(runDesc.ReportLocation)) { runDesc.ErrorDesc = string.Format(Resources.DirectoryNotExistError, runDesc.ReportLocation); runDesc.TestState = TestState.Error; return runDesc.TestState; } //if there is Result.xml -> UFT //if there is sla.xml file -> LR string[] resultFiles = Directory.GetFiles(runDesc.ReportLocation, "Results.xml", SearchOption.TopDirectoryOnly); if (resultFiles.Length == 0) resultFiles = Directory.GetFiles(Path.Combine(runDesc.ReportLocation, "Report"), "Results.xml", SearchOption.TopDirectoryOnly); if (resultFiles != null && resultFiles.Length > 0) return GetTestStateFromUFTReport(runDesc, resultFiles); resultFiles = Directory.GetFiles(runDesc.ReportLocation, "SLA.xml", SearchOption.AllDirectories); if (resultFiles != null && resultFiles.Length > 0) { return GetTestStateFromLRReport(runDesc, resultFiles); } //no LR or UFT => error runDesc.ErrorDesc = string.Format("no results file found for " + runDesc.TestName); runDesc.TestState = TestState.Error; return runDesc.TestState; } catch (Exception e) { return TestState.Unknown; } }
/// <summary> /// runs the given test QTP and returns results /// </summary> /// <param name="testResults">the test results object containing test info and also receiving run results</param> /// <returns></returns> private GuiTestRunResult ExecuteQTPRun(TestRunResults testResults) { GuiTestRunResult result = new GuiTestRunResult { IsSuccess = true }; try { Type runResultsOptionstype = Type.GetTypeFromProgID("QuickTest.RunResultsOptions"); var options = (RunResultsOptions)Activator.CreateInstance(runResultsOptionstype); options.ResultsLocation = testResults.ReportLocation; _qtpApplication.Options.Run.RunMode = "Fast"; //Check for cancel before executing if (_runCancelled()) { testResults.TestState = TestState.Error; testResults.ErrorDesc = Resources.GeneralTestCanceled; ConsoleWriter.WriteLine(Resources.GeneralTestCanceled); result.IsSuccess = false; return(result); } ConsoleWriter.WriteLine(string.Format(Resources.FsRunnerRunningTest, testResults.TestPath)); _qtpApplication.Test.Run(options, false, _qtpParameters); result.ReportPath = Path.Combine(testResults.ReportLocation, "Report"); int slept = 0; while ((slept < 20000 && _qtpApplication.GetStatus().Equals("Ready")) || _qtpApplication.GetStatus().Equals("Waiting")) { Thread.Sleep(50); slept += 50; } while (!_runCancelled() && (_qtpApplication.GetStatus().Equals("Running") || _qtpApplication.GetStatus().Equals("Busy"))) { Thread.Sleep(200); if (_timeLeftUntilTimeout - _stopwatch.Elapsed <= TimeSpan.Zero) { _qtpApplication.Test.Stop(); testResults.TestState = TestState.Error; testResults.ErrorDesc = Resources.GeneralTimeoutExpired; ConsoleWriter.WriteLine(Resources.GeneralTimeoutExpired); result.IsSuccess = false; return(result); } } if (_runCancelled()) { QTPTestCleanup(); KillQtp(); testResults.TestState = TestState.Error; testResults.ErrorDesc = Resources.GeneralTestCanceled; ConsoleWriter.WriteLine(Resources.GeneralTestCanceled); Launcher.ExitCode = Launcher.ExitCodeEnum.Aborted; result.IsSuccess = false; return(result); } string lastError = _qtpApplication.Test.LastRunResults.LastError; //read the lastError if (!String.IsNullOrEmpty(lastError)) { testResults.TestState = TestState.Error; testResults.ErrorDesc = lastError; } // the way to check the logical success of the target QTP test is: app.Test.LastRunResults.Status == "Passed". if (_qtpApplication.Test.LastRunResults.Status.Equals("Passed")) { testResults.TestState = TestState.Passed; } else if (_qtpApplication.Test.LastRunResults.Status.Equals("Warning")) { testResults.TestState = TestState.Passed; testResults.HasWarnings = true; if (Launcher.ExitCode != Launcher.ExitCodeEnum.Failed && Launcher.ExitCode != Launcher.ExitCodeEnum.Aborted) { Launcher.ExitCode = Launcher.ExitCodeEnum.Unstable; } } else { testResults.TestState = TestState.Failed; testResults.FailureDesc = "Test failed"; Launcher.ExitCode = Launcher.ExitCodeEnum.Failed; } } catch (NullReferenceException e) { ConsoleWriter.WriteLine(string.Format(Resources.GeneralErrorWithStack, e.Message, e.StackTrace)); testResults.TestState = TestState.Error; testResults.ErrorDesc = Resources.QtpRunError; result.IsSuccess = false; return(result); } catch (SystemException e) { KillQtp(); ConsoleWriter.WriteLine(string.Format(Resources.GeneralErrorWithStack, e.Message, e.StackTrace)); testResults.TestState = TestState.Error; testResults.ErrorDesc = Resources.QtpRunError; result.IsSuccess = false; return(result); } catch (Exception e2) { ConsoleWriter.WriteLine(string.Format(Resources.GeneralErrorWithStack, e2.Message, e2.StackTrace)); testResults.TestState = TestState.Error; testResults.ErrorDesc = Resources.QtpRunError; result.IsSuccess = false; return(result); } return(result); }
public static TestState GetTestStateFromUFTReport(TestRunResults runDesc, string[] resultFiles) { try { TestState finalState = TestState.Unknown; foreach (string resultsFileFullPath in resultFiles) { finalState = TestState.Unknown; string desc = ""; TestState state = GetStateFromUFTResultsFile(resultsFileFullPath, out desc); if (finalState == TestState.Unknown || finalState == TestState.Passed) { finalState = state; if (!string.IsNullOrWhiteSpace(desc)) { if (finalState == TestState.Error) { runDesc.ErrorDesc = desc; } if (finalState == TestState.Failed) { runDesc.FailureDesc = desc; } } } } if (finalState == TestState.Unknown) finalState = TestState.Passed; if (finalState == TestState.Failed && string.IsNullOrWhiteSpace(runDesc.FailureDesc)) runDesc.FailureDesc = "Test failed"; runDesc.TestState = finalState; return runDesc.TestState; } catch (Exception e) { return TestState.Unknown; } }
/// <summary> /// runs the given test /// </summary> /// <param name="testinf"></param> /// <param name="errorReason"></param> /// <param name="runCancelled">cancellation delegate, holds the function that checks cancellation</param> /// <returns></returns> public TestRunResults RunTest(TestInfo testinf, ref string errorReason, RunCancelledDelegate runCancelled) { TestRunResults runDesc = new TestRunResults(); ConsoleWriter.ActiveTestRun = runDesc; ConsoleWriter.WriteLine(DateTime.Now.ToString(Launcher.DateFormat) + " Running: " + testinf.TestPath); runDesc.ReportLocation = Helper.CreateTempDir(); runDesc.ErrorDesc = errorReason; runDesc.TestPath = testinf.TestPath; runDesc.TestState = TestState.Unknown; if (!Helper.IsServiceTestInstalled()) { runDesc.TestState = TestState.Error; runDesc.ErrorDesc = string.Format(Resources.LauncherStNotInstalled, System.Environment.MachineName); ConsoleWriter.WriteErrLine(runDesc.ErrorDesc); Environment.ExitCode = (int)Launcher.ExitCodeEnum.Failed; return(runDesc); } _runCancelled = runCancelled; if (!_stCanRun) { runDesc.TestState = TestState.Error; runDesc.ErrorDesc = Resources.STExecuterNotFound; return(runDesc); } string fileName = Path.Combine(_stExecuterPath, STRunnerName); if (!File.Exists(fileName)) { runDesc.TestState = TestState.Error; runDesc.ErrorDesc = Resources.STExecuterNotFound; ConsoleWriter.WriteErrLine(Resources.STExecuterNotFound); return(runDesc); } //write the input parameter xml file for the API test string paramsFile = Path.GetTempFileName(); string paramFileContent = testinf.GenerateAPITestXmlForTest(); string argumentString = ""; if (!string.IsNullOrWhiteSpace(paramFileContent)) { File.WriteAllText(paramsFile, paramFileContent); argumentString = String.Format("{0} \"{1}\" {2} \"{3}\" {4} \"{5}\"", STRunnerTestArg, testinf.TestPath, STRunnerReportArg, runDesc.ReportLocation, STRunnerInputParamsArg, paramsFile); } else { argumentString = String.Format("{0} \"{1}\" {2} \"{3}\"", STRunnerTestArg, testinf.TestPath, STRunnerReportArg, runDesc.ReportLocation); } Stopwatch s = Stopwatch.StartNew(); runDesc.TestState = TestState.Running; if (!ExecuteProcess(fileName, argumentString, ref errorReason)) { runDesc.TestState = TestState.Error; runDesc.ErrorDesc = errorReason; } else { runDesc.ReportLocation = Path.Combine(runDesc.ReportLocation, "Report"); if (!File.Exists(Path.Combine(runDesc.ReportLocation, "Results.xml"))) { runDesc.TestState = TestState.Error; runDesc.ErrorDesc = "No Results.xml file found"; } } runDesc.Runtime = s.Elapsed; return(runDesc); }
/// <summary> /// runs all tests given to this runner and returns a suite of run resutls /// </summary> /// <returns>The rest run results for each test</returns> public override TestSuiteRunResults Run() { //create a new Run Results object TestSuiteRunResults activeRunDesc = new TestSuiteRunResults(); TestInfo firstTest = _tests[0]; double totalTime = 0; var start = DateTime.Now; KillAllAborterProcesses(); Process aborter = StartHPToolsAborter(); DateTime robotAlive = DateTime.Now; try { LogCleanupTestInfo(); foreach (var test in _tests) { if (IsRobotTooLongAlive(robotAlive)) { RunRobotCleanup(); robotAlive = DateTime.Now; } if (IsTestPlaceholder(test)) { continue; } if (RunCancelled()) { break; } TestRunResults runResult = null; runResult = ExecuteTest(test); if (RunCancelled()) { break; } if (IsTestFailed(runResult) && IsCleanupTestDefined() && !IsCleanupTest(test)) { Console.WriteLine("Test Failed: CLEANUP AND RE-RUN"); RunRobotCleanup(); ExecuteTest(GetCleanupTest()); if (RunCancelled()) { break; } runResult = ExecuteTest(test); } activeRunDesc.TestRuns.Add(runResult); AnalyzeRunResult(runResult); } } catch (Exception) { //Ignore } finally { if (!aborter.HasExited) { aborter.Kill(); } totalTime = (DateTime.Now - start).TotalSeconds; activeRunDesc.NumTests = _tests.Count; activeRunDesc.NumErrors = _errors; activeRunDesc.TotalRunTime = TimeSpan.FromSeconds(totalTime); activeRunDesc.NumFailures = _fail; RunRobotCleanup(); } return(activeRunDesc); }