⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ats_proj.txt

📁 Script C被设计成一种解释执行的、C语言风格的脚本语言。它用来完成bat批处理无法完成
💻 TXT
📖 第 1 页 / 共 2 页
字号:
                      ats 自动测试软件说明书(一): 整体描述说明
        

一、问题描述
    本测试软件用于进行一般性的测试工作,主要是通过模拟人的手工动作进行测试。完整的ats测试软件包括三大模块: IDE界面, 测试动作记录器, ats script 文档分析执行程序. IDE 界面主要是给用户一个编辑, 调试script文档界面,相对的独立; 测试动作记录器的任务是:当一个用户要进行一项测试工作时,他可以自己编写script文档, 也可以打开记录器, 然后自己将需要测试的动作先操作一次, 记录器会根据自动的记录下所做的动作并将它们转化为对应的script文档, 当用户需要多次执行时, 就不用自己来写文档了, 此功能为一个独立的EXE文件,它的性质是ATS测试软件的工具; 而ats script文档分析执行程序是整个ats测试程序的核心部分, 它主要由三大模块组成:语法分析模块, 接囗模块和功能函数库模块,ats测试软件的第一部分的工作就是实现此工作----首先实现一个文档分析执行程序.

二. 可行性分析
    由于IDE界面和记录器是辅助工具,因此可以后一步在实现. 根据需要可以将工作分为两个阶段: 第一阶段的工作是首先有一个能够对ats script进行分析并能执行的程式即ats.exe; 第二阶段的工作是在第一阶段工作完成的基础上实现IDE界面以及记录器. 第一阶段的工作根据整个程式的结构可以人为的分为两部分: 语法部分和函数库的编写部分,而接囗执行函数部分则可以分给两部分中的一个,也可以有第三方的人来完成.因此根据时间和人力资源的分析,此程序可以由两个人来独立完成,时间大概需要两个月. 
    当第一阶段的工作完成后, 可以让一个或两个人同时开始写IDE界面和记录器, 如果结构和接囗定义好, IDE界面的完成应该相对容易一些,大概可能需要两个星期; 而记录器的编写要相对的难一点, 它涉及到消息的跟踪以及一些技巧的应用,因此时间可能要相对的长一点, 可能要一到两个月;因为记录起的相对独立性, 可以让其予第一阶段的工作一起进行, 那么人力资源上要一个人来完成此项工作.
    如果整个的各个环节能够顺利的完成, 此项目完成需要的时间可能是3个月.
 
三、问题的解决方案的说明
    定义一系列的INI文档, 以进行语法, dll的调用接囗说明. ats系统配置文件的主要类容如下: 功能函数库(*.dll)的名称以及它的位置, 功能函数的定义INI文件应该在的目录等一些信息, 它的信息必须是正确的, 不然整个程序就无法运行了. 然后在指定的目录下必须至少有一个INI文档, 这些INI文档是用户需要的功能函数的信息的定义, 包括: 功能函数的名称, 叁数的个数, 每一个叁数的类型, 缺省状态等.
    予这些INI文档联系最紧密的部分是ats分析执行程式, 因为它在做语法检查分析是要从这些INI文档中读取相应的信息, 而记录器的编写在一定的程度上也予它有关, 因为记录器最后要生成ats script文档, 因此对应于每一个动作, 应该记录成一组功能函数的组合, 所以记录器也必须知道功能函数的信息以及语法信息. 相对来说, IDE 界面就予所有的INI文档无关了.
    对INI的定义的来源做一些说明: 由于功能函数的实现都在功能函数库中, 因此定义一个功能时首先是要有它的实现函数, 然后将此函数的格式写入相应的INI文档中,所以顺序是: atscfg.ini---*.dll编写----功能函数*.ini.当用户或程序维护人员或第三方人员要对程序做扩充时, 他要做的工作是: 将新增的函数库(*.dll)copy 到相应的目录下, 在.ini中进行声明, 将新增的函数的说明加入大一个INI文档中或在指定的目录下新增一个署名INI文档,而不用从新编译整个程序, 方便整个程序的维护和扩充.
    说明: 由于IDE界面和记录器属于辅助工具,所以在以下的讨论中首先只对主程序--ats.exe作出说明, 而IDE界面和记录器的编写文档将在一些标题文档中给出.

四. 主程序执行的一般流程描述
1. 注册, 判断将要执行的ats文档的合法性,合法则将源程序(*.ats)读入内存.
2. 从ini文档中找到功能函数的说明INI文档的位置, 读入功能函数描述INI接囗文档, 按照一定的格式存放入内存中.
3. 第一次扫描源文档,进行词法分析, 同时进行一些语法替换工作, 如: 将while语句替换成if goto的形式, 经过这一步的工作, 源文档将变成只有if goto形式的简单语法语句, 替换的同时进行语法结构的检查, 如果没有错误, 则将结果存放在一张单词表中; 否则进行出错处理.
4. 进行编译工作, 检查功能函数以及其叁数的类型、个数是否正确合法等。结果是如果正确则生成对应的代码段、数据段、堆栈段等即生成伪代码。如果不正确则显示相应的出错信息。
5. 从.ini文档中找到要调用的功能函数库的位置, 从指定的位置调入功能函数库--*.dll, 以固定的格式调用函数库中的函数执行生成的伪代码.此部分还要完成如下的工作: 取得函数的返回值等。实现伪代码予函数库的信息交换工作, 控制整个ats的执行流程、实现中断响应等。
6. 如有需要则返回一定的结果,退出。

五. 主程序(ats.exe)功能模块的划分
    根据主程序的执行流程, 本程序可以分为四大模块: 初始化程序, 词法分析和语法分析、功能函数库、伪代码的执行. 下面对每一部分做一个简单的说明.
    1. 初始化程序. 它主要的工作是读入.ini中的一些信息并进行检查是否正确, 注册相应的信息, 检查用户提交的要执行的ats script文档的合法性的检查.只有在此基础上才能进行下面的工作.
    2. 词法分析和语法分析. 这个部分是ats.exe的主题部分之一, 它完成对用户提交的文档(*.ats)预编译的功能是将复杂的语法翻译成对应的简单语法,翻译的同时将进行语法检查, 成功后再进行编译工作;  首先从指定的目录下读入功能函数的INI文档, 对单词表中的每一个语句进行分析, 检查功能函数的名称, 叁数个数, 每一个叁数的类型, 缺省状态等进行检查. 将正确的语句翻译成伪代码. 整个过程结束后, 将伪代码存入一个临时文档中.
    3、功能函数库中包括一些功能函数的实现. 此部分的编写有一定的难度, 同时要奖每一个函数的实现的接囗定义好, 好方便外部的程序对它进行调用. 所有的函数的调用接囗叁数格式采用统一的格式.
    4、伪代码的执行是一个独立的EXE文件. 由于函数库中的函数的实现都采用统一的DLL调用格式, 因袭这部分的程序的难度较小, 它只要采用规定的格式(ini中有说明)传递叁数给函数库中的函数, 因此只需一个函数就可以实现所有的函数调用.
    
六. 接囗INI文档的定义
    所有的INI文档由一系列的INI文档组成. 其中atscfg.ini是根本的配置文档, 它规定了要调用的功能函数库的每一个函数的相关INI文档所在的目录.
    而功能函数的定义INI文档则对函数库(dll)中的函数的叁数地传递格式做了说明.按照固定的格式定义了每一个功能函数的名称, 叁数个数, 每一个叁数的类型, 每一个叁数缺省状态. 对所程序允许的数据类型做说明, 对缺省状态做说明.如: 定义叁数类型时如下, 0=int, 1=char, 3=string等, 可以根据程序的编写进程加入或减少数据类型的支持; 而缺省状态的定义可以是: 0为不能缺省, 1为可以缺省. (具体可以根据程序员的编程环境来具体对待.)
    1. atscfg.ini的定义
       [option]
       ; 功能函数是以plugin形式被ats使用的,在这里指定
       plugins = d:\ats\plugins       

    2. 功能函数定义ini的格式   
       ;说明支持的数据类型. 此说明部分为注释文档, 起到让程序员或维护人员       
       ;了解如何去编写INI.
       ; 例如sample1.dll中有一个 int Func1(int, int), 要把此函数加入ATS,必须在atscfg.ini中plugins指定的path中添加
       ;一个ini文档(文件名随意)来说明
       ;sample1.ini
       [dll]
       ;指定dll位置,如果不说明则认为dll是在plugins指定的地方,予此ini同名的.dll文件
       dll = d:\ats\dlls\sample1.dll

       [Func1]              ;函数在ATS源程序里面的名称,可以随意定义
       Name = 		    	;函数在DLL里面的名字
       Order = 47645	    ;当函数在DLL中没有名字时用函数的序号(十进制)来指定
       ReturnType = 0       ;0=int, 1=char, 2=string, default return type = 0
       ParamCount = n       ;此函数的叁数的个数
       Type1 =              ;第一个叁数的数据类型
       CanDefault1 = 1      ;第一个叁数能否缺省,0为不能缺省, 1为可以缺省
       Default1 =           ;第一个叁数如果可以缺省,指定叁数的缺省值,否则此项指定被忽略
         ...

       Typex =              ;第x个叁数的数据类型(x为十进制数字)
       CanDefaultx = 1      ;第x个叁数能否缺省,0为不能缺省, 1为可以缺省
       Defaultx =           ;第x个叁数如果可以缺省,指定叁数的缺省值,否则此项指定被忽略

       
       ;如果dll中还有其他函数...
       [titile]
        ...
     在ATS scrip 文档中描述的格式是: 
        title(params1, params2, ..., paramn) //...
    说明: 如果用户定义了一个函数的叁数个数为n, 但是在做叁数类型和缺省状态说明时只定义了n-1个叁数的, 那么对第n个叁数将采用缺省的分配方式, 即在程序中首先就有一个默认的叁数值, 如果没能读到预期的值, 则用这个默认的值进行下面的操作, 那么出现的问题是调用出错或致命性错误信息, 因此程序员可以根据具体的情况来对待这个编码.推荐去掉这个默认功能!!!

七. 错误信息的定义
    将所有可能出现的错误信息进行编号,用函数实现错误信息的处理.每次出错是将错误代号插入错误信息队列,并进行错误信息个数的统计,扫描完成后,如果有错误则显示错误并终止程序的运行;如果没有错误则进行下一步的工作. 每一个错误信息包括: 信息内容、代号、出错行号。可以采用链表的形式进行统计。

余下的部分将对每一个功能模块做一一的具体说明,叁见:

//////////////////////////////////////////////////////////////////////////
         ats 自动测试软件说明书(二): 初始化程序.
 
一. 概述
    按流程, 本部分其实可以归为词法语法分析部分, 因为它的工作只是为下一步的顺利进行做准备工作而已. 但是从独立性上分析, 它的确是独立的一个模块, 把它作为一个独立的EXE程式来写也可以, 如果把它当成一个函数来写, 然后让下一部分来调用也可以.
    此部分相对容易, 而且函数独立, 因此可以适当的加快速度, 时间可以控制在1个星期内.

二. INI文档的检查
    从atscfg.ini中读入dll的所在的目录和个数, 然后检查指定的目录是否存在,个数是否正确, 如果有错, 则进行相应的出错处理; 同时找到功能函数定义INI文档的目录, 如果此目录存在而且INI文档的数目正确则进行下一步工作, 否则将进行出错处理.

三. 注册
    因为程序采取双击一个 *.ats 文档或图标即可以执行ats文档的功能, 因此需要将ats.exe执行程式进行注册, 同时也要将ats格式文档进行注册, 以便windows shell 能够认识并交由相应的ats.exe执行它. 同时还要将一些程序流程中需要的要保留在注册表中的信息写入规定的地方.

四. 用户提交的ats文档的合法性检查
    因为采用在注册表中注册了ats文档类型, 则ats.exe首先会检查用户双击的文档的扩展名是否为ats, 如果不是则进行出错处理; 正确则检查该文档的内容是否为空,如果为空则进行出错处理.

五. 数据结构的初始化
    如果将这一步当作一个EXE程式来编写, 则数据结构的初始化要放入到词法语法分析部分了, 如果初始化工作知识整个程式(ats.exe)的一个函数, 则可以把数据结构的初始化工作放入到这一步分来进行, 它主要是: 进行队列的初始化内存分配, 建立数据段, 代码段, 结构段等.

说明: 一般来说每一部分的数据的初始化工作应由那一部分自己独立的来完成, 当程序结束是自己再释放所有申请的内存.

//////////////////////////////////////////////////////////////////////////
    ats 自动测试软件说明书(三): 词法和语法部分的具体实现的分析.

一. 概述
    本部分是ats.exe的核心, 它包括三大部分: 词法分析, 复杂语法的替换和语法语句分析转化. 它的输出文档是一个临时文档, 内容是正确的语句的伪代码. 下面将对每一个部分做详细的分析.
    此部分为程序的核心之一, 估计时间编程的时间为4个星期, 调试时间为2个星期左右. 下面将对每一个部分做详细的分析.
二. 关于语法的说明
    1. 在整体结构上, 支持子函数定义, 定义时以保留字 function开始,格式如下:
       function <returnsype> <name> 叁数1, 叁数2,..,叁数n 
       begin
           ...
       return value;
       end
       子程序的声名可以在script的任何地方, 实现这种技术的方法是: 对子程序队列进行二次扫描, 第一次只是将子程序的定义如, 名称, 叁数个数, 每个叁数的类型等信息记录在子程序队列中, 等到第一次扫描结束后,进行第二次扫描, 其目的是把function调用语句替换成子程序伪代码, 并进行函数名彻底检查工作. 在对子函数的处理时, 注意以下几个问题: 如何处理子函数定义的变量和全局变量的关系以及同名的问题; 不同的子函数中的变量同名问题; 子函数的嵌套调用.在此提出一种解决方案:
       在处理子函数时另外开辟一块内存, 将所有的处理当做一个独立意义上的主程序来处理都放在这个地方,也就是说, 子函数的数据段和代码段予主程序的代码段和数据段在逻辑意义上不是连续的.当调用时, 在函数队列中找到它的数据段和代码段的地址然后进行处理, 对待不同的子函数, 允许变量的同名, 但是, 子函数的变量名不能予全局变量同名.
        子函数的调用类似于C语言的调用:
          [returntype]  functionname param1, param2, ..., paramn  //[]中的单词表示可以省略.
       主程序的格式是:
        main
        begin
        ...

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -