예제 #1
0
        private void InitializeSubStep(ISequenceFlowContainer parent)
        {
            ISequenceStep sequence = parent as ISequenceStep;

            this.Parent = parent;
            ModuleUtils.SetElementName(this, sequence.SubSteps);
        }
예제 #2
0
        //todo I18n
        public void RemoveSequenceStep(ISequenceFlowContainer parent, ISequenceStep step)
        {
            bool removed = false;

            if (parent is ISequence)
            {
                removed = ((ISequence)parent).Steps.Remove(step);
            }
            else if (parent is ISequenceStep)
            {
                ISequenceStep parentStep = (ISequenceStep)parent;
                if (parentStep.StepType == SequenceStepType.TryFinallyBlock ||
                    parentStep.StepType == SequenceStepType.SequenceCall)
                {
                    I18N i18N = I18N.GetInstance(Constants.I18nName);
                    throw new TestflowDataException(ModuleErrorCode.InvalidEditOperation,
                                                    i18N.GetStr("InvalidOperation"));
                }
                removed = (parentStep).SubSteps.Remove(step);
            }
            else
            {
                throw new TestflowDataException(ModuleErrorCode.InvalidEditOperation, "Parent needs to be Sequence or SequenceStep");
            }

            //判断成功remove与否
            if (removed)
            {
                ContextSequenceGroupModify();
            }
            else
            {
                throw new TestflowDataException(ModuleErrorCode.TargetNotExist, $"Step {step.Name} could not be found in parent {parent.Name}");
            }
        }
예제 #3
0
        public ISequenceStep AddSequenceStep(ISequenceFlowContainer parent, IList <ISequenceStep> stepDatas, int index)
        {
            if (parent is ISequence)
            {
                for (int n = 0; n < stepDatas.Count; n++)
                {
                    ((ISequence)parent).Steps.Insert(n + index, stepDatas[n]);
                    stepDatas[n].Parent = parent;
                }
            }
            else if (parent is ISequenceStep)
            {
                for (int n = 0; n < stepDatas.Count; n++)
                {
                    ISequenceStep parentStep = (ISequenceStep)parent;
                    if (parentStep.StepType == SequenceStepType.TryFinallyBlock ||
                        parentStep.StepType == SequenceStepType.SequenceCall)
                    {
                        I18N i18N = I18N.GetInstance(Constants.I18nName);
                        throw new TestflowDataException(ModuleErrorCode.InvalidEditOperation,
                                                        i18N.GetStr("InvalidOperation"));
                    }
                    parentStep.SubSteps.Insert(n + index, stepDatas[n]);
                    stepDatas[n].Parent = parent;
                }
            }
            else
            {
                throw new TestflowDataException(ModuleErrorCode.InvalidEditOperation, "Parent needs to be Sequence or SequenceStep");
            }


            ContextSequenceGroupModify();
            return(stepDatas[0]);
        }
예제 #4
0
        public static CallStack GetStack(ISequenceStep step)
        {
            CallStack callStack = new CallStack();

            ISequence      sequence      = null;
            ISequenceGroup sequenceGroup = null;

            while (null != step)
            {
                callStack.StepStack.Add(step.Index);
                ISequenceFlowContainer parent = step.Parent;
                if (parent is ISequence)
                {
                    sequence = parent as ISequence;
                }
                step = parent as ISequenceStep;
            }
            if (null == sequence)
            {
                return(callStack);
            }
            callStack.Session = sequence.Index;
            sequenceGroup     = sequence.Parent as ISequenceGroup;
            if (!(sequenceGroup?.Parent is ITestProject))
            {
                return(callStack);
            }
            ITestProject testProject = (ITestProject)sequenceGroup.Parent;

            callStack.SessionIndex = testProject.SequenceGroups.IndexOf(sequenceGroup);
            return(callStack);
        }
예제 #5
0
        public static StepTaskEntityBase GetStepModel(ISequenceStep stepData, SlaveContext context, int sequenceIndex)
        {
            // 如果某个Step的Function为null,且不是块步骤类型,则为该Step分配空类型运行实体
            if (null == stepData.Function && !_blockStepTypes.Contains(stepData.StepType))
            {
                return(new EmptyStepEntity(context, sequenceIndex, stepData));
            }
            StepTaskEntityBase stepEntity;

            switch (stepData.StepType)
            {
            case SequenceStepType.Execution:
                stepEntity = new ExecutionStepEntity(stepData, context, sequenceIndex);
                break;

            case SequenceStepType.ConditionBlock:
                stepEntity = new ConditionBlockStepEntity(stepData, context, sequenceIndex);
                break;

            case SequenceStepType.ConditionStatement:
                stepEntity = new ConditionStatementStepEntity(stepData, context, sequenceIndex);
                break;

            case SequenceStepType.TryFinallyBlock:
                stepEntity = new TryFinallyBlockStepEntity(stepData, context, sequenceIndex);
                break;

            case SequenceStepType.ConditionLoop:
                stepEntity = new ConditionLoopStepEntity(stepData, context, sequenceIndex);
                break;

            case SequenceStepType.SequenceCall:
                stepEntity = new SequenceCallStepEntity(stepData, context, sequenceIndex);
                break;

            case SequenceStepType.Goto:
                stepEntity = new GotoStepEntity(stepData, context, sequenceIndex);
                break;

            case SequenceStepType.MultiThreadBlock:
                stepEntity = new MultiThreadStepEntity(stepData, context, sequenceIndex);
                break;

            case SequenceStepType.TimerBlock:
                stepEntity = new TimerBlockStepEntity(stepData, context, sequenceIndex);
                break;

            case SequenceStepType.BatchBlock:
                stepEntity = new BatchBlockStepEntity(stepData, context, sequenceIndex);
                break;

            default:
                context.LogSession.Print(LogLevel.Error, context.SessionId,
                                         $"The step type of <{stepData.Name}> is invalid.");
                I18N i18N = I18N.GetInstance(Constants.I18nName);
                throw new TestflowDataException(ModuleErrorCode.SequenceDataError,
                                                i18N.GetFStr("UnsupportedStepType", stepData.StepType.ToString()));
            }
            return(stepEntity);
        }
예제 #6
0
 private static void ValidateTypeDatas(ISequenceStep sequenceStep, ITypeDataCollection typeDatas)
 {
     if (sequenceStep.HasSubSteps)
     {
         foreach (ISequenceStep subStep in sequenceStep.SubSteps)
         {
             ValidateTypeDatas(subStep, typeDatas);
         }
     }
     else
     {
         FunctionData functionData = sequenceStep.Function as FunctionData;
         if (null == functionData)
         {
             return;
         }
         if (Constants.UnverifiedTypeIndex != functionData.ClassTypeIndex)
         {
             functionData.ClassType = typeDatas[functionData.ClassTypeIndex];
         }
         Argument returnType = functionData.ReturnType as Argument;
         if (null != returnType && Constants.UnverifiedTypeIndex != returnType.TypeIndex)
         {
             returnType.Type = typeDatas[returnType.TypeIndex];
         }
         foreach (IArgument rawArgument in functionData.ParameterType)
         {
             Argument argument = rawArgument as Argument;
             if (Constants.UnverifiedTypeIndex != argument.TypeIndex)
             {
                 argument.Type = typeDatas[argument.TypeIndex];
             }
         }
     }
 }
예제 #7
0
        /// <summary>
        /// 检查function return
        /// 1. 检查是否为null:静态方法可以为null,不然报错
        /// 2. 在arr里面寻找对应的variable,调用CheckPropertyType
        /// </summary>
        /// <param name="function"> function信息 </param>
        /// <param name="arr"> 要检查的Sequence/SequenceGroup集合 </param>
        /// <returns> warnList (注:虽只会有一条错误信息,但为了上级代码整洁与一致性,返回List)</returns>
        public IWarningInfo CheckReturn(ISequenceStep Step, ISequenceFlowContainer[] arr, bool overwriteType)
        {
            IFunctionData function = Step.Function;

            //先判断返回类型是不是void, void则不检查
            if (function.ReturnType == null)
            {
                if (!string.IsNullOrEmpty(function.Return))
                {
                    return(new WarningInfo()
                    {
                        //todo I18n
                        WarnCode = WarnCode.ReturnNotEmpty,
                        Infomation = $"\"{Step.Name}\" function Return Type is void, but value not empty"
                    });
                }

                return(null);
            }
            //空值也不检查
            else if (string.IsNullOrEmpty(function.Return))
            {
                return(null);
            }

            return(FindVariablesCheckPropertyType(arr, function.Return, function.ReturnType.Type, overwriteType));
        }
예제 #8
0
        public void Initialize(ISequenceFlowContainer parent)
        {
            ISequenceStep sequenceStep = parent as ISequenceStep;

            if (null != sequenceStep.SubSteps && sequenceStep.SubSteps.Count > 0)
            {
                this.SubStepParameters = new SequenceStepParameterCollection();
                foreach (ISequenceStep subStep in sequenceStep.SubSteps)
                {
                    SequenceStepParameter stepParameter = new SequenceStepParameter();
                    stepParameter.Initialize(subStep);
                    this.SubStepParameters.Add(stepParameter);
                }
            }
            else
            {
                this.SubStepParameters = null;
            }

            IFunctionData functionData = sequenceStep.Function;

            if (functionData?.Parameters != null && functionData.Parameters.Count > 0)
            {
                this.Parameters = functionData.Parameters;
            }
            else
            {
                this.Parameters = null;
            }
            if (null != functionData)
            {
                this.Return   = functionData.Return;
                this.Instance = functionData.Instance;
            }
        }
예제 #9
0
        private ISequenceStep CreateGetFuncStep(string instanceName, string returnName, ISequence parentSequence)
        {
            if (parentSequence.Variables.All(item => !item.Name.Equals(returnName)))
            {
                // 添加实例变量
                Variable returnVar = new Variable()
                {
                    Description       = $"Variable {returnName}",
                    LogRecordLevel    = RecordLevel.FinalResult,
                    Name              = returnName,
                    OIRecordLevel     = RecordLevel.FinalResult,
                    Parent            = parentSequence,
                    ReportRecordLevel = RecordLevel.FinalResult,
                    Type              = _testClassTypeData,
                    TypeIndex         = 1,
                    VariableType      = VariableType.Class,
                };
                parentSequence.Variables.Add(returnVar);
            }

            // 添加实例化类的step
            ISequenceStep step = _sequenceManager.CreateSequenceStep();

            step.RecordStatus = true;

            step.Function = new FunctionData()
            {
                ClassType      = _testClassTypeData,
                ClassTypeIndex = 1,
                Description    = null,
                Instance       = instanceName,
                MethodName     = GetValueMethodName,
                Return         = string.Empty,
                ReturnType     = null,
                Type           = FunctionType.InstanceFunction
            };
            Argument intArgument = new Argument()
            {
                Modifier     = ArgumentModifier.Out,
                Name         = "waitTime",
                Type         = _intTypeData,
                TypeIndex    = 0,
                VariableType = VariableType.Value
            };

            step.Function.ParameterType = new ArgumentCollection();
            step.Function.ParameterType.Add(intArgument);

            step.Function.Parameters = new ParameterDataCollection();
            ParameterData intParameterData = new ParameterData()
            {
                Index         = 0,
                ParameterType = ParameterType.Value,
                Value         = "100",
            };

            step.Function.Parameters.Add(intParameterData);
            return(step);
        }
예제 #10
0
        public ISequenceStep AddSequenceStep(ISequenceFlowContainer parent, string name, string description, int index)
        {
            ISequenceStep sequenceStep = _sequenceManager.CreateSequenceStep(true);

            sequenceStep.Name        = name;
            sequenceStep.Description = description;
            return(AddSequenceStep(parent, sequenceStep, index));
        }
예제 #11
0
        public IRetryCounter RemoveRetryCounter(ISequenceStep sequenceStep)
        {
            IRetryCounter retryCounter = sequenceStep.RetryCounter;

            sequenceStep.RetryCounter = null;
            ContextSequenceGroupModify();
            return(retryCounter);
        }
예제 #12
0
        public ILoopCounter RemoveLoopCounter(ISequenceStep sequenceStep)
        {
            ILoopCounter loopCounter = sequenceStep.LoopCounter;

            sequenceStep.LoopCounter = null;
            ContextSequenceGroupModify();
            return(loopCounter);
        }
예제 #13
0
        public ILoopCounter AddLoopCounter(ISequenceStep sequenceStep, int maxCount)
        {
            ILoopCounter loopCounter = _sequenceManager.CreateLoopCounter();

            loopCounter.MaxValue     = maxCount;
            sequenceStep.LoopCounter = loopCounter;
            ContextSequenceGroupModify();
            return(loopCounter);
        }
예제 #14
0
        public IRetryCounter AddRetryCounter(ISequenceStep sequenceStep, int maxCount)
        {
            IRetryCounter retryCounter = _sequenceManager.CreateRetryCounter();

            retryCounter.MaxRetryTimes = maxCount;
            sequenceStep.RetryCounter  = retryCounter;
            ContextSequenceGroupModify();
            return(retryCounter);
        }
예제 #15
0
        private ISequenceStep CreateCallBackStep(int x, int y)
        {
            ISequenceStep step = _sequenceManager.CreateSequenceStep();

            step.RecordStatus = true;
            step.Function     = new FunctionData()
            {
                ClassType      = _testCallBackTypeData,
                ClassTypeIndex = 6,
                Description    = null,
                Instance       = string.Empty,
                MethodName     = CallBackMethodName,
                Return         = string.Empty,
                Type           = FunctionType.CallBack
            };

            #region 添加参数类型
            step.Function.ParameterType = new ArgumentCollection();
            Argument intArgument = new Argument()
            {
                Modifier  = ArgumentModifier.None,
                Name      = "x",
                Type      = _intTypeData,
                TypeIndex = 0
            };
            step.Function.ParameterType.Add(intArgument);
            intArgument = new Argument()
            {
                Modifier  = ArgumentModifier.None,
                Name      = "y",
                Type      = _intTypeData,
                TypeIndex = 0
            };
            step.Function.ParameterType.Add(intArgument);
            #endregion

            #region 添加参数值
            step.Function.Parameters = new ParameterDataCollection();
            ParameterData intParameterData = new ParameterData()
            {
                Index         = 0,
                ParameterType = ParameterType.Value,
                Value         = x.ToString()
            };
            step.Function.Parameters.Add(intParameterData);

            intParameterData = new ParameterData()
            {
                Index         = 0,
                ParameterType = ParameterType.Value,
                Value         = y.ToString()
            };
            step.Function.Parameters.Add(intParameterData);
            #endregion

            return(step);
        }
예제 #16
0
 protected ActuatorBase(ISequenceStep step, SlaveContext context, int sequenceIndex)
 {
     this.Context        = context;
     this.Function       = step?.Function;
     this.StepData       = step;
     this.SequenceIndex  = sequenceIndex;
     this.Return         = null;
     this.ExecutionTime  = DateTime.MaxValue;
     this.ExecutionTicks = -1;
 }
예제 #17
0
        public ISequenceStep CreateSequenceStep(bool createSubStepCollection = false)
        {
            ISequenceStep sequenceStep = SequenceStepCreator.CreateSequenceStep(SequenceStepType.Execution);

            if (createSubStepCollection)
            {
                sequenceStep.SubSteps = new SequenceStepCollection();
            }
            return(sequenceStep);
        }
예제 #18
0
        //to do: check valid steps
        public ISequenceStep GetSequenceStep(ICallStack stack)
        {
            ISequence     sequence = Context.SequenceGroup.Sequences[stack.Sequence];
            ISequenceStep step     = sequence.Steps[stack.StepStack[0]];

            for (int n = 1; n < stack.StepStack.Count; n++)
            {
                step = step.SubSteps[stack.StepStack[n]];
            }
            return(step);
        }
예제 #19
0
        public IList <IWarningInfo> CheckStep(ISequenceStep Step, ISequenceFlowContainer[] arr, bool overwriteType)
        {
            IList <IWarningInfo> warningList = new List <IWarningInfo>();
            IFunctionData        function    = Step.Function;

            #region 空function, 空step
            if (function == null)
            {
                return(warningList);
            }
            #endregion

            IWarningInfo warnInfo = null;

            #region Instance
            warnInfo = CheckInstance(Step, arr, overwriteType);
            if (warnInfo != null)
            {
                warningList.Add(warnInfo);
            }
            #endregion

            #region Return
            warnInfo = CheckReturn(Step, arr, overwriteType);
            if (warnInfo != null)
            {
                warningList.Add(warnInfo);
            }
            #endregion

            #region Parameters
            if (function.Parameters == null)
            {
            }
            else
            {
                for (int n = 0; n < function.Parameters.Count; n++)
                {
                    warnInfo = CheckParameterData(function, n, arr, overwriteType);
                    if (warnInfo != null)
                    {
                        warningList.Add(warnInfo);
                    }
                }
            }
            #endregion

            foreach (IWarningInfo info in warningList)
            {
                info.SequenceStep = Step;
            }

            return(warningList);
        }
예제 #20
0
 private static void ValidateParent(ISequenceStep step, ISequenceFlowContainer parent)
 {
     step.Parent = parent;
     if (step.HasSubSteps)
     {
         foreach (ISequenceStep subStep in step.SubSteps)
         {
             ValidateParent(subStep, step);
         }
     }
 }
예제 #21
0
        public ISequenceStep GetSequenceStep(int sequenceIndex, params int[] stepIndex)
        {
            ISequenceStepCollection stepCollection = Context.SequenceGroup.Sequences[sequenceIndex].Steps;
            ISequenceStep           step           = stepCollection[stepIndex[0]];

            for (int n = 1; n < stepIndex.Length; n++)
            {
                //todo:need to check hasSubSteps()
                //need to check stepIndex valid
                step = step.SubSteps[stepIndex[n]];
            }
            return(step);
        }
예제 #22
0
        //todo I18n
        internal static IParameterData FindParameterByName(string paramName, ISequenceStep sequenceStep)
        {
            IArgument argument = sequenceStep.Function.ParameterType.FirstOrDefault(item => item.Name.Equals(paramName));

            if (argument == null)
            {
                throw new TestflowDataException(ModuleErrorCode.TargetNotExist, $"Parameter with {paramName} not found");
            }

            int index = sequenceStep.Function.ParameterType.IndexOf(argument);

            return(sequenceStep.Function.Parameters[index]);
        }
예제 #23
0
 private static void VerifyTypeIndexes(ITypeDataCollection typeDatas, ISequenceStep step)
 {
     if (step.HasSubSteps)
     {
         foreach (ISequenceStep subStep in step.SubSteps)
         {
             VerifyTypeIndexes(typeDatas, subStep);
         }
     }
     else
     {
         VerifyTypeIndexes(typeDatas, step.Function as FunctionData);
     }
 }
예제 #24
0
 private void AddSequenceStepTypeDatas(HashSet <ITypeData> typeDatas, ISequenceStep step)
 {
     if (null != step.Function)
     {
         AddFunctionTypeDatas(typeDatas, step.Function);
     }
     if (step.HasSubSteps)
     {
         foreach (ISequenceStep subStep in step.SubSteps)
         {
             AddSequenceStepTypeDatas(typeDatas, subStep);
         }
     }
 }
예제 #25
0
 private void StepFindCallBack(ISequenceStep step)
 {
     if (step.Function.Type == FunctionType.CallBack)
     {
         IFunctionData function = step.Function;
         string        fullname = function.ClassType.Namespace + "." + function.ClassType.Name + "." + function.MethodName;
         _callBackMethods.Add(fullname, _typeInvoker.GetMethod(function));
         _callBackFunctions.Add(fullname, function);
     }
     if (step.HasSubSteps)
     {
         StepCollectionFindCallBack(step.SubSteps);
     }
 }
예제 #26
0
 private static void SetParameterToSequenceData(ISequenceStep sequenecStep, ISequenceStepParameter parameter)
 {
     if (sequenecStep.HasSubSteps)
     {
         for (int i = 0; i < sequenecStep.SubSteps.Count; i++)
         {
             SetParameterToSequenceData(sequenecStep.SubSteps[i], parameter.SubStepParameters[i]);
         }
     }
     else if (null != sequenecStep.Function)
     {
         sequenecStep.Function.Parameters = parameter.Parameters;
         sequenecStep.Function.Instance   = parameter.Instance;
         sequenecStep.Function.Return     = parameter.Return;
     }
 }
예제 #27
0
 protected StepTaskEntityBase(ISequenceStep step, SlaveContext context, int sequenceIndex)
 {
     this.Context       = context;
     this.StepData      = step;
     this.Result        = StepResult.NotAvailable;
     this.SequenceIndex = sequenceIndex;
     this.Actuator      = ActuatorBase.GetActuator(step, context, sequenceIndex);
     this.Coroutine     = null;
     // 只有在断言失败和调用异常都配置为终止执行时,该步骤才会被判断为失败后终止
     if (null != StepData && StepData.HasSubSteps)
     {
         this.SubStepRoot = ModuleUtils.CreateSubStepModelChain(StepData.SubSteps, Context, sequenceIndex);
     }
     BreakIfFailed = (null == StepData) || (StepData.AssertFailedAction == FailedAction.Terminate &&
                                            StepData.InvokeErrorAction == FailedAction.Terminate);
 }
예제 #28
0
        public EmptyStepEntity(SlaveContext context, int sequenceIndex, ISequenceStep stepData) : base(stepData, context, sequenceIndex)
        {
//            switch (sequenceIndex)
//            {
//                case CommonConst.SetupIndex:
//                    _sequenceName = Constants.EmptySetupName;
//                    break;
//                case CommonConst.TeardownIndex:
//                    _sequenceName = Constants.EmptyTeardownName;
//                    break;
//                default:
//                    _sequenceName = sequenceIndex.ToString();
//                    break;
//            }
//            _sequenceIndex = sequenceIndex;
        }
예제 #29
0
        public void SetParameterValue(string parameterName, string value, ParameterType parameterType, int sequenceIndex, params int[] indexes)
        {
            ISequence     sequence = Context.SequenceGroup.Sequences[sequenceIndex];
            ISequenceStep step     = sequence.Steps[indexes[0]];

            if (indexes.Length > 1)
            {
                int n = 1;
                while (n < indexes.Length)
                {
                    step = step.SubSteps[indexes[n]];
                    n++;
                }
            }
            SetParameterValue(parameterName, value, parameterType, step);
        }
예제 #30
0
 private bool VerifyVariableInSequenceStep(ISequenceStep sequenceStep, IVariable variable, TypeDataCollection typeDatas)
 {
     if ((null != sequenceStep.LoopCounter && variable.Name.Equals(sequenceStep.LoopCounter.CounterVariable)) ||
         (null != sequenceStep.RetryCounter) && variable.Name.Equals(sequenceStep.RetryCounter.CounterVariable))
     {
         Type      varType  = typeof(int);
         ITypeData typeData = typeDatas.GetTypeData(varType.Name);
         if (null == typeData)
         {
             variable.Type = _comInterfaceManager.GetTypeByName(varType.Name, varType.Namespace);
         }
         return(true);
     }
     if (null != sequenceStep.Function)
     {
         IFunctionData functionData = sequenceStep.Function;
         if (variable.Name.Equals(functionData.Instance))
         {
             variable.Type = functionData.ClassType;
             return(true);
         }
         if (variable.Name.Equals(functionData.Return))
         {
             variable.Type = functionData.ReturnType.Type;
             return(true);
         }
         IParameterData parameter = functionData.Parameters.FirstOrDefault
                                        (item => item.ParameterType == ParameterType.Variable && variable.Name.Equals(item.Value));
         if (null != parameter)
         {
             variable.Type = functionData.ParameterType[parameter.Index].Type;
             return(true);
         }
     }
     if (sequenceStep.HasSubSteps)
     {
         foreach (ISequenceStep subStep in sequenceStep.SubSteps)
         {
             bool verified = VerifyVariableInSequenceStep(subStep, variable, typeDatas);
             if (verified)
             {
                 return(true);
             }
         }
     }
     return(false);
 }