MountLion 发表于 2012-9-24 14:06:59

修改TestLink,使其适应大数据量

即使安装在Oracle数据库上,testlink仍无法充分利用数据库的性能。做了个实验,从QC的数据库中转换了9万个案例(包括目录结构、设计步骤)到TL的库,发现没法使用。主要的问题是TL设计时没有考虑性能问题,大量使用IN(id, id, id...)的形式做查询。

为此需要对TL做一些改动。因为仅适用于Oracle库,所以不适合提交到TL项目,就自己用吧。

到目前为止的改动:

1、首页上有一个判断是否有Testcase的函数,是取所有TestCaseID,然后判断列表长度是否大于0(-_-!);修改这个sql,直接查tcversion有无记录即可;再进一步,完全可以把这个判断去掉。

2、改造 IN (list)。思路是把它改为子查询。

具体实现有些费劲,因为子查询中的select语句参数中也不能支持大文本数据。但(insert + 绑定变量)可以。 于是在数据库建立global temporary table,是仅有一个ID字段的表,设置成on commit preserve rows;在testlink的database.inc.php新增一个wrap_list函数,内容是:先删除临时表;再用存储过程把逗号分隔的list参数分解成id,插入临时表,然后返回一个子查询语句“select id from temp_id_table”。这样,testlink的 in ({$idList})就可以改写成 in ({$this->db->wrap_list($idList)})。

另外,testlink的database类不支持绑定参数,稍微改造一下就可以了。


这两步做好以后,浏览和编写案例基本上就没问题了;但搜索案例仍有问题。继续改搜索:

1、搜索代码中有个逻辑,如果没填caseID,就在sql中加一个 and id in (项目中所有caseid)。这个地方唯一的作用就是把搜索限制在指定的项目中。我的思路是在案例上增加项目信息,就可以筛选了。具体做法有点取巧:在nodes_hierarchy的tcversion节点的name字段记录projectID(反正这个字段没有被TL使用)。为此需要修改create testcase version的方法(有两处)。

2、搜索时会查两遍,第一遍查count(*),第二遍才查具体信息。这个没有必要,改为只查一遍(加limit)。

如果弯弯 发表于 2014-5-7 17:57:06

回复 1# MountLion


    你好,我对你的帖子很感兴趣,我们的testlink现在非常慢,以至于测试人员根本不想用了。但是我对testlink不太熟悉,最近花点时间研究下,有什么疑问再来问你。
页: [1]
查看完整版本: 修改TestLink,使其适应大数据量