3. 解决方案
3.1 普通方案:从脚本列表生成 CQTM Test Case
方案描述
图 7 说明了 RMT2CQ 工具是如何在普通方案中使用的。在此方案中,测试人员在测试用例准备时仅需编写 RMT 脚本,RMT2CQ 将负责在 CQTM 中生成 Test Case 和 Configured Test Case,生成时会根据 RMT 脚本所在的文件目录结构来组织测试计划(Test Plan)的结构,并以 RMT 脚本的名字作为 Test Case 的标题。
图 7. 在普通方案中使用 RMT2CQ 工具
所有需要传入该工具的信息都可以在其用户界面上找到,如图 8 所示。
在“Generation”标签页上,用户需要指定 RMT 脚本所在的路径,以及将 RMT 脚本关联到哪个层级:Test Case 或 Configured Test Case。如果用户指定只关联到 Test Case 层级,则该工具将根据 RMT 脚本创建 Test Case,并把它们相关联,然后停止;如果关联到 Configured Test Case 层级,则工具将继续创建 Configured Test Case 并建立相应关联。
在“Configuration”标签页上,用户需要指定 master schema 的名称,登录所使用的用户名和密码,登录到的数据库名称, configuration 名称,asset registry 名称,file location 名称,以及 test plan 名称。这些信息可以储存为一个配置文件,这样当用户下次启动该工具时,就无需再次输入。
图 8. RMT2CQ 的用户界面
示例代码
本小节包含了对上述方案的详细解释以及部分示例代码,供读者参考。
当 CQ 的 API 第一次在代码中出现时,以粗体标注。
RMT2CQ 工具的基本步骤包括:
创建 CQSession 并登录;获取 RMT 脚本的名称;创建 Test Plan;创建 Test Case;创建 Configured Test Case;创建 External File;将脚本与 Test Case 或 Configured Test Case 相关联。 创建 CQSession 并登录。此处需要传入所登录的 schema 和数据库名称,以及登录所使用的用户名和密码。清单 1. 创建 CQSession 并登录
CQSession session = new CQSession(); //pass in username, password, dbname and schemaname; session.UserLogon(username, password, dbname, schemaname);
获取 RMT 脚本的名称。
根据全路径名,可以通过 Java API 获取 RMT 脚本的名称,此处省略具体代码。
创建 Test Plan。我们沿用前面的例子,“FVT”和“Function1”是 Test Plan,并且前者是后者的父计划。对于“FVT”来说,它没有父计划。如果这些测试计划还未创建,则根据树结构创建它们。顺序是首先创建最上层计划,再创建其下的子计划。在测试计划创建完成后,应当返回其 ID 以用于稍后创建其余的 test plan 或 test case。
清单 2. 创建 Test Plan
// query to determine if the test plan already exists // if query for the top level plan, the sql should be modified String sql = "select distinct T1.id from TMTestPlan T1, TMtestplan T2 " + "where T1.parentplan = T2.dbid and " + "(T1.dbid <> 0 and ((T2.headline = '" + parentPlan + "' and " + "T1.headline = '" + headline + "')))"; CQResultSet resultSet = session.BuildSQLQuery(sql); resultSet.EnableRecordCount(); resultSet.Execute(); if ( resultSet.GetRecordCount() > 0 ) { resultSet.MoveNext(); return resultSet.GetColumnValue(1); //already exists, no need to create } // if the test plan does not exist, create it // fetch parent plan’s ID; for the top level plan, “parentPlan” is empty String parentPlanId = ""; if ( !parentPlan.equals("") ) { String sql = "select T1.id from TMTestPlan T1 where" + " T1.headline='" + parentPlan + "'"; CQResultSet resultSet = session.BuildSQLQuery(sql); resultSet.Execute(); while ( resultSet.MoveNext() == 1 ) { parentPlanId = resultSet.GetColumnValue(1); break; } } // create test plan and return it’s ID CQEntity entity = session.BuildEntity("TMTestPlan"); entity.SetFieldValue("AssetRegistry", registryName); entity.SetFieldValue("Headline", headline); if ( !parentPlan.equals("") ) { entity.SetFieldValue("parentplan", parentPlanId); } entity.Validate(); entity.Commit(); return entity.GetFieldValue("id").GetValue();
创建 Test Case。
当测试计划的层次被创建之后,可根据直接父计划的 ID 来创建一个 Test Case,其标题即是在第 2 步中取得的脚本名称。同样,所创建的 Test Case 的 ID 也应被返回以用于 Configured Test Case 的创建和脚本的关联。
清单 3. 创建 Test Case
// queryto determine if this test case already exists // the code is similar to the query of test plan, so omit here // if the test case does not exist, create it // the creation of Entity is similar to previous code, so only list difference here CQEntity entity = session.BuildEntity("TMTestCase"); entity.SetFieldValue("parentplan", parentPlanId); entity.SetFieldValue("Headline", headline);
创建 Configured Test Case。
当一个 TC(Test Case)被创建之后,可以在其下创建 CTC(Configured Test Case)。创建时需要 Configuration 域的值,该值是在 RMT2CQ 工具的用户界面上选择的。该 CTC 的 ID 同样应被返回以用于脚本的关联。
清单 4. 创建 Configured Test Case
// query to determine if this configured test case already exists // the code is similar to the query of test plan, so omit here // if the test case does not exist, create it CQEntity entity = session.BuildEntity("TMConfiguredTestCase"); entity.SetFieldValue("testcase", testcaseId); entity.SetFieldValue("headline", headline); entity.SetFieldValue("configuration", configuration);
创建 External File。
External File 实现脚本与 TC 或 CTC 之间的连接,因此在进行关联前必须被创建。下面的示例代码中,“fileLocationName”,“assetRegistry”和“rmtPath”的值是从用户界面上选取的,externalFileName 的值为第 2 步中的脚本名称。External File 的名称被返回以用于脚本关联。
清单 5. 创建 External File
// get the real path corresponding to fileLocationName // similar to previous code, only change the SQL statement String sql = "select distinct T1.scriptfileslocation from” + " tmfilelocation T1,tmassetregistry T2 where T1.assetregistry = T2.dbid and " + "(T1.dbid <> 0 and ((T2.name = '" + assetRegistry + "' and " + "T1.name = '" + fileLocationName + "')))"; … scriptFileLoc = resultSet.GetColumnValue(1); // get the full path of “rfile”. The naming rule of rfile is defined by CQ. String rfile; int index = scriptFileLoc.lastIndexOf("/"); scriptFileLoc = scriptFileLoc.substring(index + 1); int length = scriptFileLoc.length(); int length2 = rmtPath.length(); if (length2 > length) { //if rmtPath is a sub directory of scriptFileLoc rfile = "rfile://" + fileLocationName + "/" + rmtPath.substring(length + 1) + "\\" + externalFileName; } else { rfile = "rfile://" + fileLocationName + "\\" + externalFileName; } // query on this External File. Only need to change the SQL statement sql = "select T1.fldcolumn from TMExternalFile T1 where T1.fldcolumn = '" + rfile + "'"; // if this External File does not exist, create it session.SetNameValue("ExternalFileCreation", "true"); CQEntity entity = session.BuildEntity("TMExternalFile"); entity.SetFieldValue("File", rfile); entity.SetFieldValue("FileLocation", assetRegistry + " " + fileLocationName);
将脚本与 Test Case 相关联。
然后,通过 External File 和相应的 TC 的 ID,就可将脚本与 TC 相关联。此处脚本类型被设为“RMT”,它也可被设为其他脚本类型,例如“RFT”。
清单 6. 将脚本与 Test Case 相关联
CQEntity entity = session.GetEntity("TMTestCase", tcId); entity.EditEntity("modify"); entity.SetFieldValue("DefaultScript", externalFile); entity.SetFieldValue("DefaultScriptType", "RMT"); entity.Validate(); entity.Commit();
将脚本与 Configured Test Case 相关联。
用同样的方法可以将脚本与 CTC 相关联。
清单 7. 将脚本与 Configured Test Case 相关联
CQEntity entity = session.GetEntity("TMConfiguredTestCase", ctcId); entity.EditEntity("modify"); entity.SetFieldValue("Script", externalFile); entity.SetFieldValue("TestType", "RMT"); entity.Validate(); entity.Commit();
3.2 高级方案:从 Checklist 导入信息
方案描述
文章来源于领测软件测试网 https://www.ltesting.net/