Testlink作为一个开源的项目管理工具,功能是非常强大的。不得不说,在测试用例创建方面功能有些弱。
大家都习惯了在excel中写测试用例,当要导入到Testlink中时需要一个一个的创建。
这耗费了大量的时间,在网络不好的情况下还容易出现了延迟,降低了效率。
幸好Testlink提供了XML批量导入测试用例方式,但只支持XML格式,所以这就需要我们把excel转换成XML格式的文件。
首先看一下excel中的测试用例格式
由于时间原因,只用到了用例编号 测试用例名字 前提条件 测试步骤 其他均用统一给定值,然后写死在XML中
在R中导入excel提取数据
#################提取步骤###################
steplist<-vector("list",1)
resultlist<-vector("list",1)
x<-0
y<-1
for(i in 1:length(ceshiyongli$用例编号))
{
if(is.na(ceshiyongli$用例编号[i]))
{
}
else
{
x=x+1
steplist[[x]]<-x
resultlist[[x]]<-x
}
}
x<-0
y<-1
for(i in 1:length(ceshiyongli$用例编号))
{
if(is.na(ceshiyongli$用例编号[i]))
{
y=y+1
steplist[[x]][y]<-ceshiyongli$测试步骤[i]
resultlist[[x]][y]<-ceshiyongli$预期结果[i]
}
else
{
y<-1
x=x+1
steplist[[x]][y]<-ceshiyongli$测试步骤[i]
resultlist[[x]][y]<-ceshiyongli$预期结果[i]
}
}
##############################提取用例标识#################
x<-0
yongliname<-c()
for(i in 1:length(ceshiyongli$用例编号))
{
if(is.na(ceshiyongli$用例编号[i]))
{
}
else
{
x=x+1
yongliname[x]<-ceshiyongli$测试用例名称[i]
}
}
#############################node_order##########################
x<-0
node_order<-c()
for(i in 1:length(ceshiyongli$用例编号))
{
if(is.na(ceshiyongli$用例编号[i]))
{
}
else
{
x=x+1
node_order[x]<-x
}
}
#######################externalid##################
x<-0
externalid<-c()
for(i in 1:length(ceshiyongli$用例编号))
{
if(is.na(ceshiyongli$用例编号[i]))
{
}
else
{
x=x+1
externalid[x]<-x
}
}
############################fullexternalid#####################
x<-0
fullexternalid<-c()
for(i in 1:length(ceshiyongli$用例编号))
{
if(is.na(ceshiyongli$用例编号[i]))
{
}
else
{
x=x+1
fullexternalid[x]<-paste0("TS-",x)
}
}
########################
用XML包来创建XML文件并赋值
########创建测试用例集####################
n2<-xmlNode("testsuite",attrs = c("id"="15",name="类型管理"))
n2<-append.xmlNode(n2,xmlNode("node_order","<![CDATA[1]]>"))
n2<-append.xmlNode(n2,xmlNode("details","<![CDATA[<p>类型管理</p>]]>"))
################################
##########对从excel中提取的数据进行创建测试用例,并加入到测试用例集中#####################
##########这里用了一个比较笨的方法来对步骤进行判断,有好的方法欢迎评论##########
for(i in 1:length(yongliname))
{
if(length(steplist[[i]])==1)
{
sr<-stepf(steplist[[i]][1],"","","","",resultlist[[i]][1],"","","","")
n3<-testxml(i,yongliname[i],i,externalid[i],fullexternalid[i],sr[1],sr[2],sr[3],sr[4],sr[5],sr[6],sr[7],sr[8],sr[9],sr[10])
}
else if(length(steplist[[i]])==2)
{
sr<-stepf(steplist[[i]][1],steplist[[i]][2],"","","",resultlist[[i]][1],resultlist[[i]][2],"","","")
n3<-testxml(i,yongliname[i],i,externalid[i],fullexternalid[i],sr[1],sr[2],sr[3],sr[4],sr[5],sr[6],sr[7],sr[8],sr[9],sr[10])
}
else if(length(steplist[[i]])==3)
{
sr<-stepf(steplist[[i]][1],steplist[[i]][2],steplist[[i]][3],"","",resultlist[[i]][1],resultlist[[i]][2],resultlist[[i]][3],"","")
n3<-testxml(i,yongliname[i],i,externalid[i],fullexternalid[i],sr[1],sr[2],sr[3],sr[4],sr[5],sr[6],sr[7],sr[8],sr[9],sr[10])
}
else if(length(steplist[[i]])==4)
{
sr<-stepf(steplist[[i]][1],steplist[[i]][2],steplist[[i]][3],steplist[[i]][4],"",resultlist[[i]][1],resultlist[[i]][2],resultlist[[i]][3],resultlist[[i]][4],"")
n3<-testxml(i,yongliname[i],i,externalid[i],fullexternalid[i],sr[1],sr[2],sr[3],sr[4],sr[5],sr[6],sr[7],sr[8],sr[9],sr[10])
}
else
{
sr<-stepf(steplist[[i]][1],steplist[[i]][2],steplist[[i]][3],steplist[[i]][4],steplist[[i]][5],resultlist[[i]][1],resultlist[[i]][2],resultlist[[i]][3],resultlist[[i]][4],resultlist[[i]][5])
n3<-testxml(i,yongliname[i],i,externalid[i],fullexternalid[i],sr[1],sr[2],sr[3],sr[4],sr[5],sr[6],sr[7],sr[8],sr[9],sr[10])
}
########将测试用例加入到测试用例集中##############
n2<-append.xmlNode(n2,n3)
print(i)
}
step5<-vector("list",5)
result<-vector("list",5)
#############创建步骤和期望结果函数,默认5个###########
stepf<-function(s1,s2,s3,s4,s5,r1,r2,r3,r4,r5)
{
step1<-paste0("<![CDATA[<table border='0' cellpadding='0' cellspacing='0' style='width:223px'><tbody><tr><td>",s1,"</td></tr></tbody></table>]]>")
result1<-paste0(" <![CDATA[<table border='0' cellpadding='0' cellspacing='0' style='width:194px'><tbody><tr><td>",r1,"</td></tr></tbody></table>]]>")
step2<-paste0("<![CDATA[<table border='0' cellpadding='0' cellspacing='0' style='width:223px'><tbody><tr><td>",s2,"</td></tr></tbody></table>]]>")
result2<-paste0(" <![CDATA[<table border='0' cellpadding='0' cellspacing='0' style='width:194px'><tbody><tr><td>",r2,"</td></tr></tbody></table>]]>")
step3<-paste0("<![CDATA[<table border='0' cellpadding='0' cellspacing='0' style='width:223px'><tbody><tr><td>",s3,"</td></tr></tbody></table>]]>")
result3<-paste0(" <![CDATA[<table border='0' cellpadding='0' cellspacing='0' style='width:194px'><tbody><tr><td>",r3,"</td></tr></tbody></table>]]>")
step4<-paste0("<![CDATA[<table border='0' cellpadding='0' cellspacing='0' style='width:223px'><tbody><tr><td>",s4,"</td></tr></tbody></table>]]>")
result4<-paste0(" <![CDATA[<table border='0' cellpadding='0' cellspacing='0' style='width:194px'><tbody><tr><td>",r4,"</td></tr></tbody></table>]]>")
step5<-paste0("<![CDATA[<table border='0' cellpadding='0' cellspacing='0' style='width:223px'><tbody><tr><td>",s5,"</td></tr></tbody></table>]]>")
result5<-paste0(" <![CDATA[<table border='0' cellpadding='0' cellspacing='0' style='width:194px'><tbody><tr><td>",r5,"</td></tr></tbody></table>]]>")
return(c(step1,step2,step3,step4,step5,result1,result2,result3,result4,result5))
}
########创建测试用例函数,默认5个步骤,由于时间问题,细节方面没有做处理###############################
testxml<-function(internalid,name1,node_order1,externalid1,fullexternalid1,step_1,step_2,step_3,step_4,step_5,result_1,result_2,result_3,result_4,result_5)
{
n1<-xmlNode("testcase",attrs = c("internalid"=internalid,name=name1))
n1<-append.xmlNode(n1,xmlNode("node_order",paste0("<![CDATA[",node_order1,"]]>")))
n1<-append.xmlNode(n1,xmlNode("externalid",paste0("<![CDATA[",externalid1,"]]>")))
n1<-append.xmlNode(n1,xmlNode("fullexternalid",paste0("<![CDATA[",fullexternalid1,"]]>")))
n1<-append.xmlNode(n1,xmlNode("version","<![CDATA[1]]>"))
n1<-append.xmlNode(n1,xmlNode("summary","<![CDATA[<p></p>]]>"))
n1<-append.xmlNode(n1,xmlNode("preconditions","<![CDATA[<table border='0' cellpadding='0' cellspacing='0' style='width:188px'><tbody><tr><td>1.Tinyshop部署成功2.Tinyshopn能正常运行</td></tr></tbody></table>]]>"))
n1<-append.xmlNode(n1,xmlNode("execution_type","<![CDATA[1]]>"))
n1<-append.xmlNode(n1,xmlNode("importance","<![CDATA[2]]>"))
n1<-append.xmlNode(n1,xmlNode("estimated_exec_duration","1.00"))
n1<-append.xmlNode(n1,xmlNode("status","7"))
n1<-append.xmlNode(n1,xmlNode("is_open","1"))
n1<-append.xmlNode(n1,xmlNode("active","1"))
n1<-append.xmlNode(n1,xmlNode("steps",xmlNode("step",
xmlNode("step_number","<![CDATA[1]]>"),
xmlNode("actions",step_1),
xmlNode("expectedresults",result_1),
xmlNode("execution_type","<![CDATA[1]]>")
),
xmlNode("step",
xmlNode("step_number","<![CDATA[2]]>"),
xmlNode("actions",step_2),
xmlNode("expectedresults",result_2),
xmlNode("execution_type","<![CDATA[1]]>")
),
xmlNode("step",
xmlNode("step_number","<![CDATA[3]]>"),
xmlNode("actions",step_3),
xmlNode("expectedresults",result_3),
xmlNode("execution_type","<![CDATA[1]]>")
),
xmlNode("step",
xmlNode("step_number","<![CDATA[4]]>"),
xmlNode("actions",step_4),
xmlNode("expectedresults",result_4),
xmlNode("execution_type","<![CDATA[1]]>")
),
xmlNode("step",
xmlNode("step_number","<![CDATA[5]]>"),
xmlNode("actions",step_5),
xmlNode("expectedresults",result_5),
xmlNode("execution_type","<![CDATA[1]]>")
)
))
return(n1)
}
导出为XML
saveXML(n2, file="out.xml",encoding="UTF-8")
这里有一个小缺陷没有继续优化,但不影响使用
由于XML生成时的编码问题,元素值中出现<会被替换成(<) >替换成(>) '被替换成(')
在Notepad++里查找替换下就行
这样就可把替换完成的XML直接导入到Testlink中了
如果导入时出现警告:xml_load_ko
可能是R语言默认的编码问题,和本地主机编码不匹配。
解决方法是:在本地创建一个文本,把XML文件内容复制进去,再把后缀名改成xml即可