lucialee 2020-06-09
测试代码多了,通过人工查找,还是不太方便,而且检索测试代码是一个高频需求,如果能够查找或者过滤就方便多了。
检索TreeView
首先想到可以直接检索TreeView,输入一个关键字,然后遍历每一个节点,如果标题包括关键字就设置为焦点节点。如果不是需要的节点,就继续找下一个包括关键字的节点。可以解决需求,还可以优化一些,把查找变成过滤,一次性显示包括关键字的所有节点。
检索全部ActionList
如果不知道测试代码在那个窗体,第一个方案就麻烦了些,需要打开每个窗体,然后重复检索。遍历全部窗体中的ActionList可以一次性检索全部测试代码,检索结果可以显示到输出信息中,然后再人工打开对应的窗体和节点。
快速检索和执行Action
再贪心一点,把人工打开对应的窗体和节点的工作也自动化就更好了。
这个方案需要把检索结果输出到一个列表,选择其中一项后自动打开对应的窗体,并执行对应的Action,这不就是过滤List的工作嘛!以前曾经研究过,最高效的方式就是设计一个窗体,放一个输入框,输入关键字后,自动过滤数据,显示到窗体中,通过上下键或快捷键,执行对应的项。AltRun(一个快速启动程序的软件)过滤程序列表,CnWinzard(Delphi专家)过滤窗体或函数,TotalCommander(一个文件管理软件)过滤文件等,工作原理都类似。
Action标题包括中文,检索的时候可以增加拼音匹配功能。
现在检索测试代码就方便太多了:打开测试程序,通过快捷键,显示查找窗口,输入几个拼音的首字母,自动显示匹配的Action, 按下对应的快捷键,自动显示窗体,并执行Action。
真不错!
有了检索功能,测试代码放在哪个窗体,哪个Action,在运行时,似乎不那么重要了。
但在设计时,还是要通过窗体、Action来查找,所以测试代码还是要分类放置在不同的窗体中。
测试代码的增多,会出现一个窗体放不下的情况,代码超过3000多行,Delphi5还会报错。整理Action,就成了一种需求。
最直接的方法,在新窗体中新建一个Action,把原来Action的标题和执行代码,复制到新的窗体中。
可行,但很浪费时间!
最好有个程序,列出一个窗体中所有的Action,可以选择一些,然后自动将标题和执行代码复制到新的窗体中。
窗体文件的格式,非常标准,可以很容易找到每个Action对应的代码。
单元文件的格式,就不那么标准了。通过Action名称,可以在头部找到对应的声明,也在实现区找到执行代码,但要排除注释和编译指令的影响就不那么简单了!
这要解析源代码,开发工作会急剧增加,而且最终也可能无法达到满意的结果。就像专业的软件Model maker,也不能完美的处理单元文件,不建议手工修改单元文件。
综合考虑了一下,还是不要求完美了。
把这些代码复制到新的窗体中,再删除原来的代码,就可以完成移动Action的工作。但是需要注意一些问题:1、执行代码对应的窗体名称变化了,移动的时候要替换一下;2、移动到新窗体的时候可能会有重名的Action,要重新命名一下;3、执行代码之外的变量、常量、函数,没办法自动移动,需要手工移动。4、执行代码中如果存在多行注释,可能还需要手工处理一下。
测试程序又多了一个专用工具。想不到吧!
有些代码测试前需要先输入一些信息,为了避免每次测试都重复输入,需要保存下来,下次自动载入。
解决方法很多,可以用自定义类型文件保存,可以利用组件的持久化功能进行保存,可以通过读写注册表保存,或读写ini文件保存。
自定义文件适合保存固定结构数据。持久化功能保存的信息量大,没有必要。多数软件都是通过读写注册表或ini文件保存信息。Ini文件似乎更绿色一点,但直接用TIniFile读写,类似的代码要写两遍,修改的时候容易出错。
RxLib有个组件,可以在设计时通过组件编辑器添加组件属性,自动完成注册表和ini文件的读写,是个不错的选择。
测试程序需要被参考,设置属性的方式不直观,还需要把设置过程写到注释中,以后才容易参考。如果有一个函数,输入组件名和属性名称就可以自动完成读写ini文件,则参考起来更方便。
参考RxLib的代码,利用编译器的运行时信息机制,用一个函数可以保存和读取各种类型的属性,甚至包括字符串列表。然后在窗体中添加个读写函数,用一个参数判断是保存还是读取,这样类似的代码就不用写两遍了,只要在创建和注销窗体时各调用一次这个函数即可。
如果在父窗体中写一个动态函数读写窗体的大小和位置等每个窗体都要保存的信息,子窗体需要保存新数据时只要重载这个函数,都不需要在创建和注销窗体时再调用这个函数!
频繁的需求最需要提高效率!