测试执行说明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, //本地显示对话框 }
<< 测试脚本说明TCJSON | FWScript 控件识别 >> |