本文主要针对用例之间的调度,和定时运行用例这两个方向进行了介绍,其中用例之间的调度在RobotFramework平台上直接可以实现,对定时运行用例,我们进行了Robot平台的二次开发。
在RobotFramework里添加该资源库文件,定义一个全局变量${turn},新建两个用例test1和test3,Robot平台提供了关键词Run Keyword if,可以实现两个用例之间的调度关系,如果函数(在Robot称为关键字)check返回的是True则执行函数Add,否则不会执行函数Add。
【RobotFramework二次开发】 关于定时运行用例,对Robot平台进行了二次开发,在Robot平台的菜单栏里添加一个Tasks菜单项,点击下拉菜单Schedule弹出设置界面。
1、该Task Schedule Dialog 可以设计定时运行用例,有两种触发方式,Single和Cycle(CI Trigger方式目前没有实现),其中Cycle可以设置间隔时间,单位为hour、day、week;
2、打开Task Schedule Dialog时,自动将Robot平台设计的用例树放在界面的绿色区域,可以选择单个用例或多个用例,输入Task Name(也就是Robot平台的tag),选定触发方式(Single或Cycle),点击Add按钮添加任务;
5、点击Start按钮将按设置时间依次运行各用例,如图6所示,如果用例是保存在文件夹D:python_testSofttest,,任务的运行报告自动保存在当前目录的OutputDirN下,如果是Cycle方式会再建一层文件夹(文件夹名为任务运行时间)。
关注点:Task Schedule Dialog里的Task Name就是Robot平台的tag,执行的过程先判断设定时间,如果满足条件,将Output Directory目录下的含有该tag的所有用例都运行一次。用例执行顺序和最初在Robot平台设计的用例顺序一致。
6、Robot平台的二次开发使用方法:将FrameTask.py,mainframe.py,TaskSchedule.py,TestTree.py放在C:Python26Libsite-packagesrobotideui,覆盖所有文件,再打开Robot就可以看到菜单项。
网站二次开发合同
甲方:
乙方:
甲方在此委托乙方进行
网站的二次开发。为明确双方责任,经友好协商,双方达成以下协议:
第一条:项目的内容、价款、开发进度、交付方式。
第二条:甲方的权利和义务
1.提供专人与乙方联络。
2.提供所有需要放到网上的资料交给乙方,并保证资料的合法性。
3.乙方在完成合同规定的义务后,甲方按照附录一的要求,及时支付费用。
4.甲方将在著作权法的范围内使用本合同标的及相关作品、程序、文件源码,不得将其复制、传播、出售或许可给其它第三方。
5.甲方对本合同标的中的网页、图像享有排版的版权。
6.版权所有归甲方(包括原文件、程序、文字、动画文件、有声文件、及相关作品)第三条:乙方的权利和义务
1.提供专人与甲方联络。
2.按附录一的要求,使用甲方资料,进行网站的二次开发。
3.在附录一要求的期限内,完成网站的二次开发,并通知甲方进行验收。
4.在验收期内甲方要求下,对不合格地方进行修改。
5.乙方未经甲方同意不得向第三方拷贝或泄露网站程序。6.乙方负责维护甲方网站运营期间数据的安全。
7.在附录一要求进行网站更新的情况下,在接到甲方要求网站更新的传真2日内,按照要求对网站进行更新;
8.在附录一要求进行培训的情况下,对甲方1-3名技术人员进行培训。第四条:验收
1.验收标准有以下几条:
a.甲方可以通过任何上网的计算机访问这个网站。
b.主页无文字拼写及图片(以甲方提供的材料为准)错误。
c.网络程序正常运行。
2.验收期为5天时间。
第五条 违约责任
1.任何一方有证据表明对方已经、正在或将要违约,可以中止履行本合同,但应及时通知对方。若对方继续不履行、履行不当或者违反本合同,该方可以解除本合同并要求对方赔偿损失。
2.因不可抗力而无法承担责任的一方,应在不可抗力发生的3 天内,及时通知另一方。
3.一方因不可抗力确实无法承担责任,而造成损失的,不付赔偿责任。本合同所称不可抗力是指不能预见、不能克服并不能避免且对一方当事人造成重大影响的客观事件,包括但不限于自然灾害如洪水、地震、火灾和风暴等以及社会事件如战争、**、政府行为等。
第六条 保密条款
双方应严格保守在合作过程中所了解的对方的商业及技术机密,否则应对因此造成的损失承担赔偿。
第七条 以上条款如有未尽事疑,经甲、乙双方协商后加以补充:
补充内容: 乙方需提供使用文档,并根据使用文档对甲方技术人员提供相关培训等支持。并在交付后有免费代码维护义务,并在双方合作共赢的基础上提供更多技术支持(比如有偿的功能开发等项目)。
第八条 其它
1.如果本合同任何条款根据现行法律被确定为无效或无法实施,本合同的其他所有条款将继续有效。此种情况下,双方将以有效的约定替换该约定,且该有效约定应尽可能接近原约定和本合同相应的精神和宗旨。
2.附录一规定的有效期满,乙方未完成附录一任务,超出期限每天扣两百,超出期限后放弃该任务,按网站的费用双倍赔偿。
3.如乙方在期限内放弃该任务,按网站的费用双倍赔偿。3.本合同经双方授权代表签字并盖章,自签订日起生效。
4.本合同一式两份,双方当事人各执一份,具有同等法律效力。
甲方(盖章):
乙方(盖章)代表:
代表:
1.1 信息源选择及规范制定
Nutch通过制定相应的URL规则来达到对限定的URL进行爬取,即过滤信息。默认情况下可以在相关的配置文件中进行配置,它用正则表达式来规范URL。当然,还可以自己编写相应的插件等来实现所制定的URL规范。
1.2 信息预处理
这里的信息预处理是指将Nutch爬虫所下载下来的内容转变为Nutch索引器所能调用的文本。信息预处理过程主要涉及到如下内容:
(1)格式识别并抽取文本。一般情况下,Nutch爬虫下载下来的文档是HTML,但是网络上还存在诸多类型的其他文本:txt、doc、pdf、xls、rtf等等,甚至还有多媒体的文档格式。在进行索引之前,必然从这些下载下来的文件中抽取出文本信息,针对不同的格式文档抽取方式也不同。Nutch默认对HTML、TXT能直接处理,而其他的有些已经实现但并没有加载。目前有很多开源软件可以抽取文本信息,如word文档的poi、pdf文档的pdf-reader等等。在二次开发时,需要对相应的文档格式进行编写抽取文本工具。
(2)信息过滤。这里的信息过滤是指从抽取的文本中滤去那些不希望使其存在的文本内容,这个过程也不一定是独立的,可能会与上一个过程存在相交之处。举个实例,比如针对某一个网站的某一部分网页中的部分区域不希望被索引,那么可以编写一个相关的插件来实现对这个网站的这类网页进行过滤,去除这一区域内的内容。
(3)编码格式的转换。网络上的信息编码格式五花八门,并不是特别规范。一般情况下,Nutch处理后都能实现编码的统一,但是有些信息却不能很好地被默认程序转换,这时候就应当对Nutch进行扩展,以实现编码的转换。
1.3 索引本土化构建
以过信息预处理后的信息可以直接为Nutch索引。在索引过程中,需要考虑的因素也有很多。一是中文类语言的分词问题。这一点在前面实验中已有详细的分析并做了一些总结。二是信息的进一步处理,这一过程是在寻找最能表达原文语义的语词集合。另外还有一些其他相关技术如词干提取、停止词、本体等等。这个过程是相当重要的一个过程,直接决定了查询服务的效果。
1.4 排序规则制定
排序规则的制定并不仅仅影响到查询结果,可以说它贯穿在了整个搜索引擎的工作过程中。因为能影响排序规则的因素有很多,比如说与用户需求的相关性、系统业务需求等,具体的有如语词在文献中的词频、在整个文献空间的词频、语词位置等,甚至是信息时间都会影响到排序。因此在二次开发时,需要根据需求,针对性地制定排序规则,并把它反映在系统中。
1.5 查询系统及用户界面
Nutch的查询系统是发布在Tomcat下的,它提供了一种类似于google的查询界面,并且支持多语言。在实际的二次开发中,并不一定支持多种语言,可针对某一种语言进行改写。另外还可以对查询过程进行二次改发,改变它的查询方式、添加分页、增加summery等。对于用户接口界面,则根据实际情况改写即可。
UAP报表二次开发手册
v.871 1.数据源定义
报表数据源可分为实体关系查询,SQL脚本查询和自定义查询三个类型,如下图所示:
图1.1 其中数据源名称和数据源描述是为了标识数据源以及说明数据源的功能。
1.1查看或修改现有数据源
“查看或修改现有数据源”是指对原先已经创建的数据源进行修改(系统预置的数据源不允许修改),或者可以在新建报表时选择已存在的数据源,如下图:
图1.2 选“下一步”:
图1.3 则列所有已存在的数据源,选择其中一个,按“下一步”:
图1.4 功能列表是数据引擎内部使用机制,直接选“下一步”:
图1.5 这个是设置报表数据源的最后一个步骤,由于选定的数据源为自定义查询类型,所以第一个页签为自定义查询组件的相关信息(关于自定义查询组件的具体情况,请查阅本手册1.3单元);第二个页签如下图:
图1.6 查询结果列是指该数据查询结果的具体情况,包括列名称,列的数据类型,列的区域语言描述。这些信息将构成报表格式设计时的数据源信息(关于这部分内容的详细情况请参阅UAP报表设计时帮助文档)。
另一个页签为“过滤条件设置”,如下图:
图1.7 具体包括过滤条件名称,过滤条件的区域语言描述,这个将在过滤条件的数据源下拉列表中出现,这些信息将用来设置从过滤控件读去用户输入条件值来对查询的结果进行过滤(具体情况清参阅本手册2.2单元)。
之后,选择“完成”即结束数据源定义而进入报表格式定义。
1.2实体关系查询
在图1.1步骤中选定“实体关系查询”,点击“下一步”则进入实体关系查询类型的数据源定义:
图1.8 这里必须要添加至少一个关联实体,点击“添加”,则可选择系统已经定义好的实体:
图1.9
选定实体,然后点击“确定”:
图1.10 点击“下一步”(如果选择了多个实体,则还需要定义实体之间的关系。关于如何定义一个实体以及如何定义实体之间的关系,请参阅数据引擎的相关文档):
图1.11 接着必须添加结果列,即图1.6中的“查询结果列”。点击“添加”:
图1.12 这里弹出的列表为选定的单个实体或多个实体能查询到的所有的结果列的信息。选定需要的查询结果列后,点击“确定”:
图1.13 这个步骤中,“行数据权限”可以用来限制用户查询某些具体行数据的权限(行数据权限的设置以及其他高级功能的使用方法请查阅数据引擎相关文档)。
1.3 SQL脚本查询
在图1.1步骤中选定“SQL脚本查询”,点击“下一步”则进入SQL脚本查询类型的数据源定义:
图1.14 SQL脚本查询类型又分为SQL脚本和存储过程两个类别,可通过第一个页签的左上端的下拉列表中选择相应的类别(具体如何定义两种类别请查阅数据引擎相关文档)。其他三个页签中,“查询结果列”和“过滤条件设置”已经在前面的单元中说明,此处不在详述。其中,这种数据源类型有一个“查询参数设置”页签,如下图:
图1.15 如果脚本类型中选择的是“存储过程”,则此处可以使用“刷新”按钮来获取存储过程所需要的参数;而SQL脚本类型则需要手动填写参数的信息。需要注意的是,参数的名称必须与存储过程或SQL脚本的名称完全一致。运行时查询参数的具体值来源是通过过滤条件获得的,因此查询参数需要和过滤条件绑定在一起(绑定方法请参阅本手册2.2单元)。
1.4 自定义查询
自定义查询是指提供一个COM组件(通常为VB6.0组件)或.NET组件(通常为C#组件)来提供获取数据的方法(SQL脚本,存储过程或数据库临时表)。关于自定义查询组件的建立方法请参阅本手册3.2单元。
在图1.1步骤中选定“自定义查询”,点击“下一步”则进入自定义查询类型的数据源定义:
图1.16 其中数据服务信息指的是自定义组件的相关信息,关于自定义查询组件的建立方法请参阅本手册3.2单元。
2.报表过滤条件
2.1 过滤条件设计
除了UAP本身单独提供了过滤条件的设计工具,报表本身也提供了专门为报表设计过滤条件的快捷方式。以下是报表设计过滤条件的入口:
图 2.1
图 2.2 点击“标准条件”进入过滤条件设计器:
图 2.3
界面说明:
是否支持高级条件:选此项后,在运行时过滤窗口中会出现“高级条件”页签,用于用户自由选择过滤条件的组合。
规则组件:此项定义由过滤控件回调的规则组件类。
是否取消二次开发:此复选项只有在以“U870”项目进入UAP时才会显示,如果被选中,那么以其它项目进入UAP的过滤设计器不能新增和删除过滤条件。
此处可新增或修改一个过滤条件。双击某个已存在的过滤条件,则进入这个条件的修改界面:
图 2.4 界面说明:
语种:设置过滤条件项显示的语种。
中文简体名称:过滤条件项的键值,唯一标识此过滤条件项,不能重复。可以以字母、数字或汉字来命名。
标题:在运行时过滤窗口中显示的文字,支持多语种设置。编辑类型:过滤条件项的类型,分别为文本框、参照、日期、数字、枚举、SQL语句、自定义。
参照ID:当编辑类型选择参照类型后,必须选定一个参照ID。比较符:过滤条件项比较符号。
小数位数:当编辑类型为数字类型时,此选项可以设置小数位数。分组:为过滤条件选定一个分组,在运行时将按照分组来显示过滤条件项。
数据源:为过滤条件项选定数据源,可以下拉选择或直接手工输入。顺序号:指定过滤条件项在运行时显示的位置,如果不输入,将自动产生。
是否常用条件:如果选中,将在运行时显示在“常用”页签中。是否必输:如果选中,在运行时必须输入值,否则会出现提示信息。是否区间条件:如果选中,在运行时将显示为两个输入框组合而成的形式,表示从值1到值2的意思。在运行时,用户选择或输入的不是单值,而表示一个取值范围。
是否多选:如果选中,表示此过滤条件项可以选择多个值。
允许用户修改比较符:如果选中,用户在运行时可以通过滤设功能改变比较符。
作为或条件:如果选中,在运行时将以“或”条件来组合到过滤条件生成的SQL语句中,默认是以“与”条件组合的。
参照返回字段:当编辑类型为参照类型时,此选项表示参照返回的是哪个字段的值。编码对应参照中的主键字段,名称对应参照中的描述字段。也可以手工输入要返回的字段名,一定要与参照中的字段名一致。
默认值、到:设置过滤条件项的默认值,将在运行时自动显示。如果为区间条件,可以设置“到”默认值。
修改界面的第二个页签是过滤条件项窗口枚举:
图 2.5
界面说明:
枚举(aa_enum):指在U861中使用的枚举型,此类型是在AA_Enum数据表中定义的。枚举类型,枚举类型名称,是EnumType字段值。默认显示,在运行时当用户点击下拉按钮后显示的可供选择的项,注意是以“,”分隔的EnumCode字段的值。
枚举类型:指明在Meta库中的MetaEnumDef表中的枚举,对应MetaID字段。
枚举串:如果没有在数据库中预制枚举类型,也可以通过此项输入一个枚举串。格式为“0{#}1{##}A{#}B”,在“{##}”前的为返回值,之后的则为显示值,并且在返回值与显示值中分别以“{#}”分隔。
只能定义以上三种枚举中的一种,否则会出现提示信息。修改界面的第三个页签是过滤条件项窗口SQL语句:
图 2.6
界面说明:
SQL文本框:在SQL文本框中输入SQL语句,可以不用加别名。
标题:在运行时中显示的列标题,标题数量与上面的SQL的字段对应,并用“,”分隔,例如“标题1,标题2”。
返回字段:用此字段的值构成过滤控件返回调用者的过滤SQL语句。显示字段:显示在运行时过滤窗口中的值。
在U870中,SQL语句类型的过滤条件主要为兼容以前版本,所以如果在U870中新建过滤条件时,请不要选用SQL语句类型,而改用参照类型。修改界面的第四个页签是过滤条件项窗口SQL语句:
图 2.7
属性说明:
参照样式:当编辑类型选择为参照类型时,可以指定参照的样式,分别为弹出式和下拉式,默认为弹出式。
关于过滤最后值得特别指出的是,过滤条件之间可控制相互关系,例如两个过滤条件都有参照,则可控制其中一个过滤条件的参照取值范围由另一个过滤条件的取值来决定。此外还存在其他相关控制行为,这些功能都是通过规则组件来实现的。关于规则组件的详细实现,请参阅过滤条件的相关文档。
2.2 过滤条件与数据源的关系
此处主要说明如何把过滤条件跟数据源关联起来,以达到由用户输入来实现查询不同数据的目的。
对于实体关系类型的数据源,只要在过滤条件的基本属性页中选择数据源的相应列就能实现,如下图:
图 2.8 用户就可以在查询报表时进行过滤:
图 2.9
对于SQL脚本类型的数据源,无论是简单的sql脚本类型还是存储过程,都是通过将其参数与过滤条件进行绑定来实现的。如下图:
图 2.10 假如sql脚本或存储过程中有两个参数分别为:@planid和@filterstring,则必须要在“查询参数设置”页签中分别为每一个参数设置其相关信息。然后再设计过滤条件:
图 2.11 此处需要注意的是,“中文简体名称”必须以这样的规则命名:“查询参数设置”的参数为@pram,则“中文简体名称”为parm,两者之间相差一个符号“@”。
需要指出的是虽然SQL脚本可以通过参数来绑定过滤条件,但是过滤条件绑定到参数的同时,还必须为此过滤条件指定一个数据源查询结果列,查询时输入的过滤条件对该返回结果列同样起作用。
对于自定义的数据源的过滤条件绑定与实体关系得数据源相似,但是设计者需要在自定义组件中自己处理由用户输入信息构成的sql串来实现对查询结果的过滤。
3.报表系统API 3.1 自定义报表查询入口
所谓自定义报表查询入口指的是用UAP设计了一张自定义报表,除了默认的查询入口:门户->视图->我的报表->自定义报表,另外为此报表设置单独的菜单节点来进行查询。只要在此节点的点击事件处理函数中调用报表系统的以下接口就可实现:
A.Public Function OpenReport(_ sReportID As String, _ objU8Login As Object, _ Optional subid As String = “", _ Optional rawfilter As Object = Nothing)As Boolean
B.Public Function OpenReportNoneFilterUI(_
sReportID As String, _ objU8Login As Object, _ Optional subid As String = ”", _ Optional rawfilter As Object = Nothing)As Boolean
接口功能及使用说明:
这两个接口是对象ReportService.clsReportManager中的函数;需要引用组件: ReportService.dll UFIDA.U8.UAP.Services.ReportFilterService.tlb 这两个接口的功能是打开一张报表,两个接口的差异在于前者在打开报表之前会先显示过滤界面,而后者不会(例如在使用联查报表的时候有时不需要进行过滤)。此接口在业务组在其需要打开一张报表时调用。
参数介绍: sReportID:
报表的ID,即将要打开的报表标识。objU8Login:
U8的Login对象,注意:这个对象必须是COM封装的Login。subid: 报表所属的子产品号,这个参数是可选的。注意:当指定了此参数,接口会在随后的处理中按照subid[__]sReportID的规则拼接成真正的报表ID。rawfilter:
可选过滤条件对象(UFGeneralFilter.FltSrv或自定义的过滤条件对象),此对象中必须是ISelfFilter(见第四个接口)的一个实现。这个参数通常报表的自定义行为(如联查)时,需要有过滤的情形时会使用到。
至于怎么在U8中设置自己的菜单节点,请参阅U8门户相关文档。
3.2 自定义数据源组件
报表的自定义数据源是指单独写一个组件来提供报表数据,这种数据源实现方法的优点强大的数据处理能力,这是其他类型的数据源所不具备的。实现方法为: 组件中必须实现以下接口: public interface IGetSql { void GetSql(IFilterArgs e);}
接口功能及使用说明:
此接口为报表提供自定义数据源。组件的提供方式为首先提供一个实现IGetSql的组件(COM组件只需有一个声明相同的GetSql函数的类即可),之后将其绑定到报表的数据源(具体方法是请参考本接口示例)。组件的工作方式为报表系统会在展现报表的过程中实例化一个此种类型的对象,通过调用GetSql函数来获取数据源。
参数介绍:
IFilterArgs参数是UFIDA.U8.UAP.Services.ReportFilterService.tlb中的类型,在报表系统调用自定义数据源组件的时通过此参数将组件需要的环境信息传入,而自定义数据源组件则将其处理结果通过此参数返回给报表系统。
IFilterArgs中包含的常用接口: IFilterArgs.login: U8的Login对象
IFilterArgs.RawFilter: 过滤对象
IFilterArgs.DataSource.Type:
组件数据源返回类型,其值与对应类型为 0:SQL脚本 1:存储过程 2:临时表 其默认值为2 IFilterArgs.DataSource.Sql: SQL脚本或临时表名称
IFilterArgs.DataSource.StoreProcName: 存储过程名称 示例:
(1)以下提供一个名为CustomDataSample的vb6.0的dll,此组件中定义一个名为customData.cls类,其代码如下(IFilterArgs的):
Public Sub GetSql(e As IFilterArgs)e.DataSource.sql = “select * from AA_Bank” e.DataSource.Type = 0 End Sub
构造好组件之后,需要将组件绑定到报表的数据源,绑定方法如下:
假设组件名称为:DataEngine.dll,而实现IGetSql的类型名称为:Engine VB6.0组件的绑定方法:(注意:COM需要注册,不要求具体存放目录,一般推荐存放目录为:..U8SOFTufcomsql)
图 2.12
C#组件的绑定方法:(注意:.NET组件不需要注册,但存放目录必须是:..U8SOFTUAP)
图 2.12
3.3 自定义行为组件
自定义行为是指在报表查询结束后,设计者提供额外的功能来进行相关处理,比如联查功能等。方法是实现以下接口:
public interface IExecute { void Execute(IActionArgs e);}
接口功能及使用说明:
此接口用来完成报表自定义行为的业务操作。组件的提供方式与IGetSql接口类似,不同的是其绑定到报表系统的过程(示例将详细说明)。组件的工作方式为在自定义行为绑定到报表系统之后,报表展现界面的右键菜单中将相应的子菜单,触发此子菜单后报表系统将实例化此组件实现IExecute类型的一个对象,并调用此对象上的Execute方法。
参数介绍:
IActionArgs是在进行自定义行为的时候数据交互的媒介,IActionArgs中的常用参数: IActionArgs.ReportID: 当前操作的报表ID IActionArgs.Login: U8的Login对象
IActionArgs.RelateData: 当前报表的相关数据对象,通过此对象中的接口GetData可获得相关的数据
IActionArgs.CurrentColumnName:触发自定义行为时报表所处的焦点行名称
IActionArgs.FltArgs: IFilterArgs对象
自定义行为绑定到报表系统例子:(假设组件名为ExcuteSample,类型名为clsExc,定义方法参考IGetSql的示例)
图 2.13
在报表设计界面点击”自定义行为”的按钮,将打开自定义行为的定义界面:
图 2.14
点击”新增”:
图 2.15
设定ActionClass为”ExcuteSample.clsExc”, Caption为”自定义例子”,点击”确定”即完成绑定操作。
保存之后打开报表,其右键菜单”其他”的子菜单中便出现定义的新菜单,图 2.16
点击此子菜单,便会调用类型clsExc中的Execute方法。3.4 自定义过滤
自定义过滤是指设计者可以自行构造一个过滤组件来实现报表的过滤,而不使用U8自身的过滤控件。实现方法是组建中实现以下接口:
public interface ISelfFilter { void ShowFilter(IFilterArgs e);}
接口功能及使用说明:
为报表提供自定义的过滤条件界面。组件提供方式与前述相关组件类似。组件的工作方式为将实现ISelfFilter的类型的一个实例作为OpenReport或OpenReportNoneFilterUI的第四个参数传入,则在进行报表展现之前,报表系统将会调用此实例的ShowFilter方法,自定义过滤的结果使用e参数返回报表系统。
参数介绍:
IFilterArgs参数请参考IGetSql说明。
自定义过滤组件绑定到报表的方法例子(假设要绑定的组件名为CustomFilter,实现ISelfFilter的类型为clsFilter):
在UAP中”报表定义”窗体的工具栏的”查询条件”按钮中选择”自定义条件”,或在”报表定义”窗体的右键菜单的”查询条件”菜单中选择”自定义条件”,如图:
图 2.17
图 2.18
之后再打开的定义窗体中输入组件信息,如:
图 2.19
点击”确定”即可完成绑定操作。