测试执行说明TCEXE

Exe为一个任务的执行描述,包括要执行的内容和如何执行,当工作台或MainServer安排任务的时候,生成一个Exe文件,该Exe文件中的针对要执行的任务的信息在开始的时候就已确定下来,但如何执行的信息可以逐步细化(即Exe里面的ExeOption属性),这个Exe文件也可以发给每个中间环节,在中间环节处可以针对如何执行进行修改,最终发给BizRunner。
由BizRunner按照Exe文件的规定执行相应的自动化脚本。

Exe 任务说明

 EXEFile是一个Json格式的文件,用来“告知”BizRunner该如何执行一个脚本,以及执行脚本中的哪些内容,按照属性type的值,分为4种执行模式:
ExeFile.type:
1:为正常的执行一个TestCase脚本的模式。如果ExeFile.Dlist有值,或者是有指定的ExeFile.datafile(后面简称为“有指定的数据源”), 则这个值会放到变量$9中,testcase脚本可以通过获取$9的值,获得传入的执行的参数。
2:为重复执行一个模块的的指令,模块的名字为ExeFile.module,如果“有指定的数据源”,则按照数据源的内容,每次取一行进行执行,直至执行完毕;否则,直接按照“缺省的模式”重复由ExeFile.times指定的次数。(此处的数据源必须是多于1行的数据,否则当作变量处理)
3:为重复执行步骤区间,区间从stepBegin到stepEnd,“有指定的数据源”,则按照数据源的内容,每次取一行进行执行,直至执行完毕;否则,执行由ExeFile.times指定的次数。(此处的数据源必须是多于1行的数据,否则当作变量处理)
4:为重复执行一个“特征”Feature,如果“有指定的数据源”,则这个数据源将放到$9中,无论有没有数据源,exeFile.times将放到$1中,exeFile.stepbegin将放在$0中,都作为整型变量;以便让Feature脚本在开始的时候获取到。(此处的数据源必须是多于1行的数据,否则当作变量处理)
0:作为一个特殊的执行类型,由SUTAgent构造好后传递给BizRunner,使用TCJSON中的Flow[1],表示为执行的脚本时用来检查测试条件是否具备,脚本中返回给SUTAgent的结果只是为条件是否具备。如果条件不满足,则在脚本中调用"notready", 传递的结果为PreConditionFail。
【在BizServer中,也能发出一个type为0的执行说明,此时通过在precondition字段中定义要检查的特殊内容,实现对前提条件的检查,此处的Exe不会传递给BizRunner】

【为了让测试脚本知道自己是以何种类型执行的,在$8中,放置type的值。1: the whole TC,  2:module * n,   3: Steps * n,  4: Features*n   0:prepare】 

注意,如果是testcase,无论是哪种执行模式,从最开始到[1]之间的代码一定会执行一次。
【从最开始到[1]往往是一些环境设置或指定外部库调用的脚本,这部分必须执行,特别是有很多import函数库的语句】

而针对Feature,如果是自己控制执行次数的执行的(TCJSON中Automatic==true),则在脚本中使用传入的$0的值得知要执行多少次,然后控制着执行;如果是由SUTAgent来控制总的执行次数(TCJSON中Automatic==false),则由SUTAgent“偷偷地”修改StepBegin的值为当前为第几次执行,这样Feature的执行脚本就能够通过$1获知当前是执行的第几次,总共执行几次,是否有数据源。(如果没有数据源,则$9==null)

【注意,为了不让SUTAgent动ExeFile里面的数据源,要求在Feature的ExeFile的Times值一定与ExeFile.Dlist的长度一致,而且SUTAgent在处理单次执行模式的Feature时,只使用Times作为重复次数。】
【针对Testcase以及多次执行模式feature的重复执行,若有DataList,且超过一行数据,则按DataList的次数执行】
【针对Testcase以及多次执行模式feature的重复执行,若有DataList,且只有一行数据,则将这一行数据都赋值给表头指定的变量】

	 

ExeOption 执行选择

如果EXE的type为1,2,3 则可以指定一个ExeOption,用来描述执行测试用例时的执行特性

除了指定执行的内容,ExeFile还可以定义执行的方式(Style),这些Style均放入其ExeOption属性中,定义的内容包括:
public int manual;
 1: in auto when possible;  2:all in manual;   0:as defined in detail   如果定义了1,2,则不会理会后面每一步的定义   
 3: Novice(新手)   强制执行每一步,显示右边小的状态窗口,未做完前不允许进入reportpanel,可以暂停,做完后自动到下一轮。中途可以查看每一步的帮助信息 
 4: Veteran(老手)  直接进入ReportPanel,不自动执行任何步骤,但会禁止不需要执行的步骤,然后让测试者自由选择(可以随时选择让代码带领),退出时提醒未执行或未标记的
 5:Validate(验证) 直接进入ReportPanel,不自动执行任何步骤,也不禁止任何步骤,用于测试者随意检查某一步骤。按照执行过的进行记录,退出时未执行过的直接当作Omit处理。
 6:Standard (标准) 进入ReportPanel模式,先会将auto的步骤都执行完,然后让测试者自由选择  

public int[]  steptype;
针对每一个步骤进行定义
             1:表示为 “使用机器代码”,可以临时改
             2:表示为“有机器代码,但是不使用,由人工进行”,可以临时改
             3:表示为 “只能使用人工”,无机器代码,不允许临时改成“使用机器代码” 
       
public bool nodialogue; 
if or not to hide the dilogue in SUT 
是否隐藏被测脚本在测试机器上的对话框,也就是说只在服务器端显示

public int confirm;  1:yes  0:no
是否每一步都需要事先确认一下再接着往下执行:
在每一步的开头等待测试者干预 Confirm,临时改,临时改所有的(即第一个属性manual)
       
public int indetail; 
是否要在Dashboard上显示详细的信息:每一个/ 都要Notify一下。 
1:yes, 0:no  以后再进一步扩展含义

public bool hideupdatewindow; 
是否隐藏测试机器上右下角的信息显示框 (统称Update Window)

public bool insilent=false;  
是否要求是 inSilent,该开关将关闭BizAT里面的BizNotify,这样测试过程不显示任何内容,除非确实有必要。也就是说,即使是脚本里面的Notify也会禁止掉。

任务说明的 C# 结构

   public class Exe
    {
        [DataMember]
        public int _id; // mongoDB 必须要的一个字段,用于识别这个exe,为服务器上生成的顺序值

        [DataMember]
        public string name;//  the TCJSON name:the TC or the Feature,该名称用来获取TCJSON,因此必须正确

        [DataMember]
        public string description; // 该执行任务的描述信息 

        [DataMember]
        public int type;//  1: the whole TC,  2:module * n,   3: Steps * n,  4: Features*n   0:prepare  or  pre condtion check 
        [DataMember]
        public int times;// The times to execute, 注意,如果有dlist或datafile,则执行的次数为该数据源的长度  
        [DataMember]
        public string module; //  the module to be tested. // 被dock用来传递执行的任务参数 

        [DataMember]
        public string programid; // the project id.

        [DataMember]
        public int taskid;  // 如果是服务器上发布下来的任务,则一定有一个taskid,否则为本地的任务:分为脱机任务和非脱机任务 

        [DataMember]
        public string testplan;

        [DataMember]
        public int planid;

        [DataMember]
        public int testitem;  // 0-3: S3,S4,WB,CB  20181206 该值依据不同的program代表不同的含义

        [DataMember]
        public int needplan; // 缺省为0表示无需再请求计划;1表示需要再请求计划

        [DataMember]
        public int offline; // 缺省0表示 在线  >0:表示脱机任务, 而且该数值代表所在的脱机任务号 

        [DataMember]
        public int changetime;  // 缺省0表示无需修改时间,值表示当地的locale与规定的时间的小时差异。目的:不同机器上的任务时间一致

        [DataMember]
        public string dt; // 后期写入的对应这个任务的执行日期,这个日期代表着存放的目录  

        [DataMember]
        public string precondition;  // 测试需要的条件 协议自定义 ,如果这个不为空,则意味着要执行一下对应的检查。

        [DataMember]
        public int stepbegin; // 执行的起始步骤。如果是feature,则作为执行的是第几次。

        [DataMember]
        public int stepend; //  此处的StepEnd除了记录正常的 结束步骤外,还作为一个标记,如果是0,意味着是一个内部模块。  
                            //  注意之所以不用 stepend=stepbegin,因为作为外部模块,也允许只有一步,只用stepend作为标记可以有效地分开,但代价是每个地方的算法复杂些。

        [DataMember]
        public string title; // 用来显示的内容: 如: TC23865   TC23865:3-8*5   TC23865:BatteryOut*3    Feature:S3*100

        [DataMember]
        public ExeOption theoption; // 如果是feature,则一定是null,如果是tc,无论type为多少,都标记所有的步骤,因为步骤里面还可以调其它的步骤 

        [DataMember]
        public int moduleIndex;  // 如果该值 != 0, 则意味着可以直接利用这个值找到Module。
                                // 在Dock项目中,借用这个值记录当前脱机分配的item的顺序号

        [DataMember]
        public string datafile; // 用于测试的数据文件,如果dlist为空,而datafile不为空,则在BizRunner中自动将其载入。

        [DataMember]
        public int failstop;  //  发现步骤执行失败后,是否马上中止执行 20171125 添加, 因为feature也适用,所以不放到theoption中

        [DataMember]
        public int indetail;  // 描述是否需要通报每一步

        [DataMember]
        public int noresult; 
		// 描述在执行过程中是否要收集result,目前北京项目:通过转换第三方结果获得;上海项目,在最后一步出结果 
		//	0: 正常记录详细的结果 1:不记录结果   2: 仅仅记录每一步的结果   3:改为记录cycle的结果,result只是简单信息
		//  如果是TC只能选择 0、2,针对Exeoption中manual >=3,则自动为1;  如果是Feature,只能选择1、3		

        [DataMember]
        public int category; // 这个相当于数据库里面的type,type因被用掉所以取名category。

        [DataMember]
        public string panelinfo; // 20190424 用来指定是否显示右下角的panel,以及显示何种信息, 使用| 隔开出四个部分显示的字符串  Header | description | IPaddress | SUTId 

        [DataMember]
        public List<Object[]> dlist; //  用于测试的数据列表
	}

执行选择的 C# 结构

 /*
     * 执行的选择,这些选择由tester 在Dashboard的界面上自行设置,跟任务的完成无关。也就是说,测试者可以按照自己的偏好自行调整测试执行的方式
     *      
     *      每一步是否要停下来确认一下 : 
     *          在步骤开始之前发Show Msg,在步骤开始时判断,如果为手动,则发Message给服务器,在服务器上可以改回成自动
     *          如果为自动,可以让测试者改成手动
     *      每一步是否要显示详细的执行信息: 将/ 的信息发Notify
     *    
     *      是否需要在测试机器上隐藏对话框:改BizMessage的设置
     *      是否需要在测试机器的右下角显示测试进展信息:改BizMessage的设置
     */
    [DataContract]
    public class ExeOption  
    {
        /// 
        /// 手动还是人工的定义,扩展成执行模式的定义
        /// 0: As defined; 1: Auto; 2: mannual
        /// 3:Novice; 4:Veteran; 5:Validate; 6:Standard
        /// 
        [DataMember(Order = 0, IsRequired = true)]
        public int manual;  // 因为有很多Json文件的存在,此处不宜更换名字 
        /* 1: in auto when possible; 
         * 2: all in manual;   
         * 0:as defined in detail; 如果定义了1,2,则不会理会后面每一步的定义 20170525 以前的1,2 定义跟下面的具体步骤的定义扭着的,改过来了
         * 3: Novice(新手)   强制执行每一步,显示右边小的状态窗口,未做完前不允许进入reportpanel,可以暂停,做完后自动到下一轮。中途可以查看每一步的帮助信息 
         * 4: Veterann(老手)  直接进入ReportPanel,不自动执行任何步骤,但会禁止不需要执行的步骤,然后让测试者自由选择(可以随时选择让代码带领),退出时提醒未执行或未标记的
         * 5:Validate(验证) 直接进入ReportPanel,不自动执行任何步骤,也不禁止任何步骤,用于测试者随意检查某一步骤。按照执行过的进行记录,退出时未执行过的直接当作Omit处理。
         * 6:Standard (标准) 进入ReportPanel模式,先会将auto的步骤都执行完,然后让测试者自由选择 
         */

        /// 
        /// 单个步骤执行模式的定义
        /// 0:default; 1:Auto; 2: Manual; 3:Only Manual
        /// 4:Omit always; 5:Omit ontop
        /// 
        [DataMember]
        public int[] steptype;//   define each steps; 每一步的运行定义 (是否强制手动,... ...   通常情况下为:manual, default/automatic  
        //  注意在每个含有repeat的步骤中,定义则多一层含义: manual:所有的都强制手动;automatic:所有的强制自动;default:按照每一个步骤自己的定义进行
        //  0:default, 1:Auto, 2:Manual 
        // 2017/03/08  实现时做的最后决定: (在TC的描述里面,则注明这一步是否有机器代码)
        //   1: 表示为 “使用机器代码”
        //   2:表示为“有机器代码,但是不使用,由人工进行”
        //   3: 表示为 “只能使用人工”, 无机器代码 

        //  20190112 扩展
        //   4: 表示为本步骤永远省略 (即使在重复循环中,也会省略;“永远死掉”)
        //   5: 表示本步骤省略  (但是,在重复循环里面将执行它) ==》 体现到testoption里面 

        // 20190112 此处设立steptype = null,这种情况下,如果manual == 1, 则所有步骤强制进行引导,不再查询这一步是否有自动化。 如果manual == 0,等同于 == 1.
        /// 
        /// 是否需要在一定时间后,关闭结果窗口。 Time with Seconds 
        /// 如果为0,则不关闭,否则在等待“times”秒后,自动关闭结果窗口
        /// 
        [DataMember]
        public int times;// The times to execute  执行的次数? 此处是个冗余的字段,将来思考可以挪作他用。  // 20190119 用作多长时间后关闭结果显示框 多个s,将错就错理解成Seconds
        [DataMember]
        public bool nodialogue = false; //  if or not to hide the dilogue in SUT 是否隐藏被测脚本在测试机器上的对话框,也就是说只在服务器端显示
        [DataMember]
        public int confirm = 0; // 是否每一步都需要事先确认一下再接着往下执行:在每一步的开头等待测试者干预 1:yes, 0:no  以后再进一步扩展含义
        [DataMember]
        public int indetail; // 是否要在Dashboard上显示详细的信息:每一个/9 都要Notify一下。 1:yes, 0:no  以后再进一步扩展含义
        [DataMember]
        public bool hideupdatewindow = true; //  是否隐藏测试机器上右下角的信息显示框 
        [DataMember]
        public bool insilent = false;  // 是否要求是 inSilent,该开关将关闭BIzAT里面的BizNotify,这样测试过程不显示任何内容,除非确实有必要。
        [DataMember]
        public int takeover = 1;  // 当出现控件找不到的时候,是否该步骤立即转为人工接管操作。 1:是,0:否
	}

在FWScript中设置执行的选择

可以直接在代码里面使用 @/d 来临时设置测试执行的行为,其中d为一个数字,如下表所定义:
也可以直接使用关键字,如 SetNoConfirm 与 @/2 是等价的。

enum  EXESETTING {
SetConfirm=1,  // 每步Confirm
SetNoConfirm=2,  // 每步不需要Confirm
SetInDetail=3,  // 显示每个地方的详细说明
SetNotInDetail=4,  //不显示每个地方的详细说明
SetNoUpdate=5,  //不显示本地的执行状况窗口
SetUpdate=6,  //显示本地的执行状况窗口
SetNoDialog=7,  //本地不显示对话框 (只有在网络执行模式时起作用)
SetDialog=8,  //本地显示对话框
}

<< 测试脚本说明TCJSONFWScript 控件识别 >>