protected override void InvokeStepSingleTime(bool forceInvoke) { // 重置计时时间 Actuator.ResetTiming(); // 调用前置监听 OnPreListener(); this.Result = StepResult.NotAvailable; this.Result = Actuator.InvokeStep(forceInvoke); // 如果当前step被标记为记录状态,则返回状态信息 if (null != StepData && StepData.RecordStatus) { RecordRuntimeStatus(); } // 调用后置监听 OnPostListener(); if (null != StepData && StepData.HasSubSteps) { StepTaskEntityBase subStepEntity = SubStepRoot; do { if (!forceInvoke && Context.Cancellation.IsCancellationRequested) { this.Result = StepResult.Abort; return; } subStepEntity.Invoke(forceInvoke); } while (null != (subStepEntity = subStepEntity.NextStep)); } }
protected override void InvokeStepSingleTime(bool forceInvoke) { // 重置计时 Actuator.ResetTiming(); // 调用前置监听 OnPreListener(); // 开始计时 Actuator.StartTiming(); // 停止计时 Actuator.EndTiming(); // 应为TryFinally块上级为空,默认为pass this.Result = StepResult.Pass; // 调用后置监听 OnPostListener(); StepTaskEntityBase tryBlock = SubStepRoot; StepTaskEntityBase finallyBlock = tryBlock.NextStep; try { tryBlock.Invoke(forceInvoke); } finally { // finally模块是强制调用 finallyBlock.Invoke(true); } if (null != StepData && StepData.RecordStatus) { RecordRuntimeStatus(); } }
protected override void InvokeStepSingleTime(bool forceInvoke) { // 重置计时时间 Actuator.ResetTiming(); // 调用前置监听 OnPreListener(); this.Result = StepResult.NotAvailable; this.Result = Actuator.InvokeStep(forceInvoke); // 如果当前step被标记为记录状态,则返回状态信息 if (null != StepData && StepData.RecordStatus) { RecordRuntimeStatus(); } // 调用后置监听 OnPostListener(); object returnValue = Actuator.Return; // 如果执行结果不是bool类型或者为False,或者没有下级节点,则退出当前循环 bool conditionFail = !(returnValue is bool) || !(bool)returnValue; if (conditionFail || null == StepData || !StepData.HasSubSteps) { return; } // 执行下级的所有Step StepTaskEntityBase subStepEntity = SubStepRoot; do { if (!forceInvoke && Context.Cancellation.IsCancellationRequested) { this.Result = StepResult.Abort; return; } subStepEntity.Invoke(forceInvoke); } while (null != (subStepEntity = subStepEntity.NextStep)); }
// protected override void CheckSequenceData() // { // if (null != StepData.Function) // { // Context.LogSession.Print(LogLevel.Error, Context.SessionId, // $"Conditionblock cannot configure function data. Step:{StepData.Name}"); // I18N i18N = I18N.GetInstance(Constants.I18nName); // throw new TestflowDataException(ModuleErrorCode.SequenceDataError, i18N.GetStr("ConditionBlockHasFunc")); // // } // if (null != StepData.SubSteps && // StepData.SubSteps.Any(item => item.StepType != SequenceStepType.ConditionStatement)) // { // Context.LogSession.Print(LogLevel.Error, Context.SessionId, // $"Some steps under condition block is not ConditionStatement type. Step:{GetStack()}"); // I18N i18N = I18N.GetInstance(Constants.I18nName); // throw new TestflowDataException(ModuleErrorCode.SequenceDataError, i18N.GetStr("IllegalStepType")); // } // } protected override void InvokeStepSingleTime(bool forceInvoke) { // 重置计时时间 Actuator.ResetTiming(); // 调用前置监听 OnPreListener(); // 开始计时 Actuator.StartTiming(); // 停止计时 Actuator.EndTiming(); this.Result = StepResult.Pass; // 如果当前step被标记为记录状态,则返回状态信息 if (null != StepData && StepData.RecordStatus) { RecordRuntimeStatus(); } // 调用后置监听 OnPostListener(); if (null != StepData && StepData.HasSubSteps) { StepTaskEntityBase subStepEntity = SubStepRoot; do { subStepEntity.Invoke(forceInvoke); object returnValue = subStepEntity.Return; // 如果ConditionStatement返回值为True则说明该分支已执行完成,则跳过后续的Step if (returnValue is bool && (bool)returnValue) { break; } } while (null != (subStepEntity = subStepEntity.NextStep)); } }
protected override void InvokeStepSingleTime(bool forceInvoke) { int index = 0; while (true) { try { while (true) { // 设置循环变量的值 if (null != _loopVariable) { Context.VariableMapper.SetParamValue(_loopVariable, StepData.LoopCounter.CounterVariable, index++); } // 如果是取消状态并且不是强制执行则返回。因为ConditionLoop内部有循环,所以需要在内部也做判断 if (!forceInvoke && Context.Cancellation.IsCancellationRequested) { BreakAndReportAbortMessage(); } // 重置计时时间 Actuator.ResetTiming(); // 调用前置监听 OnPreListener(); this.Result = StepResult.NotAvailable; this.Result = Actuator.InvokeStep(forceInvoke); // 如果当前step被标记为记录状态,则返回状态信息 if (null != StepData && StepData.RecordStatus) { RecordRuntimeStatus(); } // 调用后置监听 OnPostListener(); // 如果执行结果不是bool类型或者为False,或者没有下级节点,则退出当前循环 object returnValue = Actuator.Return; bool conditionFail = !(returnValue is bool) || !(bool)returnValue; if (conditionFail || null == StepData || !StepData.HasSubSteps) { return; } // 执行所有的下级Step StepTaskEntityBase subStepEntity = SubStepRoot; do { if (!forceInvoke && Context.Cancellation.IsCancellationRequested) { this.Result = StepResult.Abort; return; } subStepEntity.Invoke(forceInvoke); } while (null != (subStepEntity = subStepEntity.NextStep)); } } catch (TestflowLoopBreakException ex) { ex.CalcDown(); // 如果计数大于0,则继续抛出到上层 if (ex.Count > 0) { throw; } // 如果是跳出当前循环,则return if (ex.BreakLoop) { return; } } } }
public void Invoke(bool forceInvoke = false) { FailedInfo failedInfo = null; StepResult lastStepResult = StepResult.NotAvailable; StatusReportType finalReportType = StatusReportType.Failed; try { this.State = RuntimeState.Running; SequenceStatusInfo startStatusInfo = new SequenceStatusInfo(Index, _stepEntityRoot.GetStack(), StatusReportType.Start, RuntimeState.Running, StepResult.NotAvailable) { ExecutionTime = DateTime.Now, ExecutionTicks = -1, CoroutineId = RootCoroutineId }; _context.StatusQueue.Enqueue(startStatusInfo); StepTaskEntityBase stepEntity = _stepEntityRoot; do { stepEntity.Invoke(forceInvoke); } while (null != (stepEntity = stepEntity.NextStep)); SetResultState(out lastStepResult, out finalReportType, out failedInfo); } catch (TaskFailedException ex) { // 停止失败的step的计时 StepTaskEntityBase currentStep = StepTaskEntityBase.GetCurrentStep(Index, RootCoroutineId); currentStep?.EndTiming(); FillFinalExceptionReportInfo(ex, out finalReportType, out lastStepResult, out failedInfo); // 如果抛出TargetInvokcationException到当前位置则说明内部没有发送错误事件 if (null != currentStep && currentStep.Result == StepResult.NotAvailable) { currentStep.SetStatusAndSendErrorEvent(lastStepResult, failedInfo); } } catch (TestflowAssertException ex) { // 停止失败的step的计时 StepTaskEntityBase currentStep = StepTaskEntityBase.GetCurrentStep(Index, RootCoroutineId); currentStep?.EndTiming(); FillFinalExceptionReportInfo(ex, out finalReportType, out lastStepResult, out failedInfo); // 如果抛出TargetInvokcationException到当前位置则说明内部没有发送错误事件 if (null != currentStep && currentStep.Result == StepResult.NotAvailable) { currentStep.SetStatusAndSendErrorEvent(lastStepResult, failedInfo); } } catch (ThreadAbortException ex) { // 停止失败的step的计时 StepTaskEntityBase currentStep = StepTaskEntityBase.GetCurrentStep(Index, RootCoroutineId); currentStep?.EndTiming(); FillFinalExceptionReportInfo(ex, out finalReportType, out lastStepResult, out failedInfo); // Abort异常不会在内部处理,需要在外部强制抛出 currentStep?.SetStatusAndSendErrorEvent(lastStepResult, failedInfo); } catch (TargetInvocationException ex) { // 停止失败的step的计时 StepTaskEntityBase currentStep = StepTaskEntityBase.GetCurrentStep(Index, RootCoroutineId); currentStep?.EndTiming(); FillFinalExceptionReportInfo(ex.InnerException, out finalReportType, out lastStepResult, out failedInfo); // 如果抛出TargetInvokcationException到当前位置则说明内部没有发送错误事件 if (null != currentStep && currentStep.Result == StepResult.NotAvailable) { currentStep.SetStatusAndSendErrorEvent(lastStepResult, failedInfo); } } catch (TestflowLoopBreakException ex) { // 停止失败的step的计时 StepTaskEntityBase currentStep = StepTaskEntityBase.GetCurrentStep(Index, RootCoroutineId); currentStep?.EndTiming(); // 如果包含内部异常,则说明发生了运行时错误,记录错误信息。 if (null != ex.InnerException) { FillFinalExceptionReportInfo(ex.InnerException, out finalReportType, out lastStepResult, out failedInfo); // 如果抛出TargetInvokcationException到当前位置则说明内部没有发送错误事件 if (null != currentStep && currentStep.BreakIfFailed) { currentStep.SetStatusAndSendErrorEvent(lastStepResult, failedInfo); } } // 只是流程控制,记录结果信息后退出 else { SetResultState(out lastStepResult, out finalReportType, out failedInfo); } } catch (Exception ex) { // 停止失败的step的计时 StepTaskEntityBase currentStep = StepTaskEntityBase.GetCurrentStep(Index, RootCoroutineId); currentStep?.EndTiming(); FillFinalExceptionReportInfo(ex, out finalReportType, out lastStepResult, out failedInfo); // 如果抛出Exception到当前位置则说明内部没有发送错误事件 if (null != currentStep && currentStep.BreakIfFailed) { currentStep.SetStatusAndSendErrorEvent(lastStepResult, failedInfo); } } finally { StepTaskEntityBase currentStep = StepTaskEntityBase.GetCurrentStep(Index, RootCoroutineId); // 发送结束事件,包括所有的ReturnData信息 SequenceStatusInfo overStatusInfo = new SequenceStatusInfo(Index, currentStep.GetStack(), finalReportType, this.State, StepResult.Over, failedInfo) { ExecutionTime = DateTime.Now, CoroutineId = RootCoroutineId, ExecutionTicks = 0 }; overStatusInfo.WatchDatas = _context.VariableMapper.GetReturnDataValues(_sequence); this._context.StatusQueue.Enqueue(overStatusInfo); _context.VariableMapper.ClearSequenceVariables(_sequence); this._stepEntityRoot = null; // 将失败步骤职责链以后的step标记为null currentStep.NextStep = null; } }