TestLink和BugZilla集成中的一些问题

前两天有个朋友写信给我问一个testlink和bugzilla集成的问题,从他信里面的描述得出,他已经成功把这两个系统集成好了,但是有一些功能用不了,例如不能显示bugzilla里面的id、状态、标题信息等。其实原因是testlink的作者只实现了bugzilla集成的部分接口,其他的接口是要我们自己来写的。大家可以浏览一下testlink安装目录下的/lib/bugtracking,里面有好些文件,其中文件int_bugtracking.php是testlink和其他所有bug tracking系统(bugzilla, jira, mantis等)做集成的基类。还有一个文件叫int_bugzilla.php,这个文件就是testlink和bugzilla集成的代码,里面定义了一个类:bugzillaInterface,它是bugtrackingInterface的子类,并且在类bugzillaInterface里面重写了一部分方法,这也是为什么如果我们自己不修改代码的话,只能用到部分功能(例如只能连接,但却不能显示相关的信息)。

假如说,现在想在testlink关联bugzilla的一个bug之前,验证一下bug id是否存在,就要在int_bugzilla.php里面重写checkBugID_existence方法。

$query = "SELECT bug_id FROM {$this->dbSchema}.bugs WHERE bug_id='" . $id."'";
$query_results = $this->dbConnection->exec_query($query);
if ($query_results && ($this->dbConnection->num_rows($query_results) == 1))
{
    return true;
}
return false;

如果要自己补充这个int_bugzilla.php的时候,需要一点php的知识,并且对bugzilla数据库有所了解,以前公司的同事告诉我用php的一个神器,vardump。你懂的。

TestLink不能连接BugZilla的解决办法

TestLink是一个基于Web的PHP开源测试管理系统,虽然用起来跟QC那些商业软件比起来不是那么爽,但是由于是开源、免费,所以越来越多的公司在用TestLink。BugZilla作为老牌的bug管理工具,同样有着很大的用户群。

TestLink有一个BugTracking的接口模块,可以使得TestLink可以与其他BugTracking系统集成。在集成的过程中发现TestLink提示错误:Bug ID does not exist on BTS(中文的话是’bug的ID在BTS中不存在!’),找到TestLink的代码文件bugAdd.php,找到下面这段代码块

if($args->bug_id != "")
{
	$msg = lang_get("error_wrong_BugID_format");
	if ($g_bugInterface->checkBugID($args->bug_id))
	{
		$msg = lang_get("error_bug_does_not_exist_on_bts");
		// 问题在这里
		if ($g_bugInterface->checkBugID_existence($args->bug_id))
		{
			if (write_execution_bug($db,$args->exec_id, $args->bug_id))
			{
				$msg = lang_get("bug_added");
				logAuditEvent(TLS("audit_executionbug_added",$args->bug_id),"CREATE",$args->exec_id,"executions");
			}
		}
	}
}

问题出在$g_bugInterface->checkBugID_existence($args->bug_id)这个方法中。在、TestLink的int_bugzilla.php文件中,并没有overload这个checkBugID_existence的方法,所以这个方法就会按照int_bugtracking.php中的默认实现,返回false。TestLink就会出现error_bug_does_not_exist_on_bts这个ERROR

解决这个问题很简单,就是在int_bugzilla.php中自己实现checkBugID_existence方法,简单的实现如下:

function checkBugID_existence($id)
{
	$status_ok = 0;
        //关键是下面这个Query bug id的语句,大家自己看看数据库是哪个表,根据实际情况自己修改
	$query = "SELECT bug_id FROM bugs WHERE bug_id='" . $id ."'";
	$result = $this->dbConnection->exec_query($query);
	if ($result && ($this->dbConnection->num_rows($result) == 1))
	{
		$status_ok = 1;
	}
	return $status_ok;
}

OK。在int_bugzilla.php文件中添加了 checkBugID_existence() 方法后,就可以从TestLink中直接把BugZilla里面的BUG ID和某个测试关联起来了。