测试脚本说明TCJSON (To be editted)

FWScripts作为自动化执行的脚本语言,最重要的应用场景为测试自动化,因此其支持测试用例相关的概念,如测试用例TC、测试步骤Step、执行流Flow及可重复模块Module FWScripts也支持测试用例执行时的要求,如对话框,结果报告等,主要是与BizAT紧密配合。

载入TC说明文件

测试用例脚本一般以测试步骤为单位,逐步执行,而在测试用例脚本的执行过程中,通过与BizAT框架的配合,可以达到最佳的用户体验,如可以针对每一步选择使用人工进行测试,可以让被测自己不显示对话框,转移到测试工作台上显示等等。为了达到这一个功能,必须针对每个测试步骤进行详细说明,这个说明以Json文件的格式存放到“TC说明文件”中。因此,必须在测试用例脚本中说明要载入的“TC说明文件”。

`FilePath    :如果FilePath使用相对路径,则直接采用测试用例脚本文件的绝对路径目录
例如:`c:\bizat\testcase\TC11109.json

TC与Feature

在BizAT框架中,自动化脚本分为两种类型:TC与Feature
TC:以步骤为单位的执行脚本,通常包含有通知人工干预的测试脚本。
Feature:没有步骤含义的执行脚本,但有重复执行次数的含义(一共执行多少次,当前执行的是第几次),实现方式分成两种类型:一种类型是该脚本在调用时传入要执行的次数,由该脚本控制内部的次数循环;另一种类型是该脚本每次执行相当于执行了一次,要执行的次数在外部控制,该脚本在调用时传入当前是第几次执行的参数。
在BizAT框架中,SUTAgent与BizRunner会根据TCJSON中定义的情况采取不同的动作,如果发现是TC,则以步骤为单位执行脚本;如果发现是Feature,则进一步判断是否为Automatic,如果是Automatic,则传入要执行的总次数,让脚本执行,等待该脚本完成;如果不是Automatic,则SUTAgent会控制执行的次数,每次的执行都调用一次该脚本,并告知该脚本现在执行的是第几次。在TCJSON的执行命令中,%times%替代成执行总次数,%flow%替代成当前执行的是第几次;与此同时,在BizRunner中,如果$0,$1没有在命令行中被指定,则$0中存放第几次执行,$1中存放总的执行次数。

TCJSON C# 结构

系统根据该结构中totalstep的值来判断是TC还是Feature,如果该值为0,则当作是Feature。
如果是Feature,系统根据automatic来判定该Feature是否属于:自动控制执行次数(automatic==true)。

 /* 
 * 
 * The class TC  记录测试用例的自动化脚本的相关信息,该信息贯穿于BIZAT整个框架:
 *      BizTC:在编辑TCInfo完善后,生成TC
 *      BizRunner:通过读取TCScripts或者TCInfo获得TC文件路径,将信息存放到BizRunner执行环境中(RunningEnv),用于执行脚本时使用TC每一个步骤的信息
 *      SUTAgent:通过命令行、SUTManager或服务器Dashboard发送过来的任务,从而获得TC,根据TC中的信息启动相应的执行命令,以及记录测试结果
 *      SUTManager:提供用户界面让使用者选择执行某个TC,通过读取TC信息,给予相关的提示
 *      DashBoard:依据MainServer分配的任务,进行进一步的用户界面操作,让使用者定义如何执行,然后发送到SUTAgent
 *      MainServer:TC作为测试资源存放,testleader依据相关信息,分配任务给Tester,然后发送到SUTManager(通常是脱机方式)或者DashBoard
 *      
 */
    [DataContract]
    public class TC
    {
        [DataMember(Order = 0, IsRequired = true)] 
        public string title; // 显示在Dashboard上面的内容
        [DataMember(Order = 1, IsRequired = true)]
        public string description; // 点击Tips的时候显示的内容  20181010借用该字段,记录有哪些Items,使用items:item1/item2/...  一直到结尾,用于下拉菜单的显示。
        [DataMember(Order = 2, IsRequired = true)]
        public string tcname;//  该TC的代号,检查跟JSON文件名称一致,作为容错的一种手段,该名称很重要,作为TC的指代
        [DataMember(Order = 3, IsRequired = true)]
        public string feature;//  测试的特性,为上层应用使用,一般为空格隔开的Word list, 必须是小写, 可能不同的project定义不一样。 如Sleep,Display,Battery; 再如 Language,Registery,
                                // 开始的字符被用在描述每一步的特诊上 长度totalstep+1,每一步中的数字0,1,2 表示自动化程度 3:表示全自动化
                                // 20190113 已实现关键字bundle
        [DataMember(Order = 4, IsRequired = true)]
        public int flowtype;// 本TC中Flow的类型。 1:固定Flow  0:不固定Flow,只有一个启动命令,有该启动命令自己接着往下执行  // 固定Flow意味着沿用之前的模式,每次启动时依据Floworder来决定启动的命令
                                // 如果是feature(totalstep==0),则该字段无意义,而且其值应为0。                  
        [DataMember(Order = 5)]
        public int network;// 测试时网络会断开吗?0:应该不会断开; 1:一直为断开状态  2:会变化(测试的内容与网络相关) // 如果已知测试时网络会断开,则不再尝试着一直监控网络
        [DataMember(Order = 6)]
        public string platforms; // 适合于哪些平台,为上层应用使用,一般为空格隔开的Word list, 必须小写 
        [DataMember(Order = 7)]
        public string require; // 工具与平台需求,如Ranorex,不分大小写,在SUTAgent中,可能会依据不同的test case做些不同的动作。
        [DataMember(Order = 8)]
        public bool automatic; //  true:totally automatic, false:half auomatic or manually   //20190119 在Longrun项目中,用这个字段标记是ATS的脚本(true)还是BizSmooth的脚本(false) == true isATS, == false, not 
                                // 2017.04.19 如果是Feature,则意味着一定是全自动化的,此时该属性的含义是:针对feature的tcscript: true:tcscripts会自动重复多次; false:tcscripts每次启动只能执行一次,必须由SUTAgent进行多次调用
        [DataMember(Order = 9)]
        public int totalstep; // 一共有多少步与steps的length应该一致, 新的版本将依据这个数值来决定一共有多少步
                    // 如果totalStep == 0, 则为 Feature
        [DataMember(Order = 10)]
        public TCStep[] steps ;  // 每一步的详细信息, 在TCInfo里面,为List
        [DataMember(Order = 11)]
        public TCModule[] modules; // 模块名字列表,用于提供下拉菜单, 注意在TCInfo里面为List
        [DataMember(Order = 12)]
        public List<Flow> flows = new List<Flow>(); // 描述启动每个Flow的信息,如果flowtype=0,则 [1] 为 一次性准备动作
                            // 如果是Feature (totalstep==0), 则应有3个成员, [0] 为 执行Feature的命令,[1] 为 一次性准备动作, [2] 为一次性结尾的动作。 
        [DataMember(Order = 13)]
        public string savefiles; // 记录一旦发现bug,需要保存的文件,可指定多个文件,使用;隔开。    
        [DataMember(Order = 14)]
        public String tcgroup; //属于哪一组或哪一类型的TC组,用于自由编组
        [DataMember(Order = 15)]
        public String dependence; // 执行该TC前要执行的其它的TC   // bizat2  作为ReportPanel 里面的ActionButton的说明
        [DataMember(Order = 16)]
        public String pretesting;  //测试前准备动作
        [DataMember(Order = 17)]
        public String posttesting;  //强制小写。测试后的动作,可以配合main Server提供一些活动  "send result";
                                // 放入关键字表达不同的含义,如summary意思是每次测试完后若发现错误,要提醒进行summary
                                // 20190113 已实现关键字 summary,appoint 
        [DataMember(Order = 18)]
        public String messagefile;  // 记录测试用例中显示的文本与编号, 用于BizATDLL 中的消息编号
	}
	
	 public class Flow
    {
        [DataMember(Order = 0, IsRequired = true)]
        public string commands;//20170704 改为只包含命令,如果是以\开头,则意味着需要加上BizAT的安装目录
        [DataMember(Order = 1, IsRequired = true)]
        public string param;  //  20170704 参数单独放在这里。
        [DataMember(Order = 2, IsRequired = true)]
        public string workingdir; // when execute the command, the current working dir will be set to this.  如果是以\开头,则意味着需要加上BizAT的安装目录          
        [DataMember(Order = 3)]
        public bool isreboot;// defined by DATF  is the system to be rebooted after this flow
        [DataMember(Order = 4)]
        public int firststep; // 开始的步骤编号,只适用于固定flow的情况
        [DataMember(Order = 5)]
        public int steps;  // 步数,只适用于固定flow的情况
        [DataMember(Order = 6)]
        public string feature;  // 该Flow的特点,便于启动时候的参数设置。
        [DataMember(Order = 7)]
        public int type; // 设计成各种开关方式的Enum。 如是否使用了Ranorex平台等等,便于做些动作
	}

	 public class TCModule       // 注意模块分为两种:外部模块与步骤内模块
	{                         // 外部模块指定了一个步骤的范围,定义了执行这个步骤范围时的缺省设置
							  // 步骤内模块则定义在一个步骤的内部,用于测试某个具体的功能,也包含有缺省设置的定义部分
		[DataMember(Order = 0, IsRequired = true)]
		public string name; // 用于下拉菜单显示的名字,不区分大小写,BizRunner依靠这个名字找到对应的模块
		[DataMember(Order = 1, IsRequired = true)]
		public string description; // 描述的内容,主要用于安排任务的时候了解这个模块的细节
		[DataMember(Order = 2, IsRequired = true)]
		public int stepbegin;  // 外部模块的起始步骤, 内部模块定义时所在的步骤,
		[DataMember(Order = 3, IsRequired = true)]
		public int stepend;// 外部模块的结束步骤 , 如果为0,则意味着这个模块为步骤内的模块
		[DataMember(Order = 4)]
		public int order; // 所在的编号,目前未用,目的时在Exe传递时可以传一个编号,提升效率
	}
<< 调用BizAT测试执行说明TCEXE >>