Testlink作为一个开源的项目管理工具,功能是非常强大的。不得不说,在测试用例创建方面功能有些弱。
大家都习惯了在excel中写测试用例,当要导入到Testlink中时需要一个一个的创建。
这耗费了大量的时间,在网络不好的情况下还容易出现了延迟,降低了效率。
幸好Testlink提供了XML批量导入测试用例方式,但只支持XML格式,所以这就需要我们把excel转换成XML格式的文件。
首先看一下excel中的测试用例格式
image.png
由于时间原因,只用到了用例编号 测试用例名字 前提条件 测试步骤 其他均用统一给定值,然后写死在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",""))
n2<-append.xmlNode(n2,xmlNode("details","类型管理]]>"))
################################
##########对从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("",s1," ]]>")
result1<-paste0(" ",r1," ]]>")
step2<-paste0("",s2," ]]>")
result2<-paste0(" ",r2," ]]>")
step3<-paste0("",s3," ]]>")
result3<-paste0(" ",r3," ]]>")
step4<-paste0("",s4," ]]>")
result4<-paste0(" ",r4," ]]>")
step5<-paste0("",s5," ]]>")
result5<-paste0(" ",r5," ]]>")
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("")))
n1<-append.xmlNode(n1,xmlNode("externalid",paste0("")))
n1<-append.xmlNode(n1,xmlNode("fullexternalid",paste0("")))
n1<-append.xmlNode(n1,xmlNode("version",""))
n1<-append.xmlNode(n1,xmlNode("summary","]]>"))
n1<-append.xmlNode(n1,xmlNode("preconditions","1.Tinyshop部署成功2.Tinyshopn能正常运行 ]]>"))
n1<-append.xmlNode(n1,xmlNode("execution_type",""))
n1<-append.xmlNode(n1,xmlNode("importance",""))
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",""),
xmlNode("actions",step_1),
xmlNode("expectedresults",result_1),
xmlNode("execution_type","")
),
xmlNode("step",
xmlNode("step_number",""),
xmlNode("actions",step_2),
xmlNode("expectedresults",result_2),
xmlNode("execution_type","")
),
xmlNode("step",
xmlNode("step_number",""),
xmlNode("actions",step_3),
xmlNode("expectedresults",result_3),
xmlNode("execution_type","")
),
xmlNode("step",
xmlNode("step_number",""),
xmlNode("actions",step_4),
xmlNode("expectedresults",result_4),
xmlNode("execution_type","")
),
xmlNode("step",
xmlNode("step_number",""),
xmlNode("actions",step_5),
xmlNode("expectedresults",result_5),
xmlNode("execution_type","")
)
))
return(n1)
}
导出为XML
saveXML(n2, file="out.xml",encoding="UTF-8")
这里有一个小缺陷没有继续优化,但不影响使用
由于XML生成时的编码问题,元素值中出现<会被替换成(<) >替换成(>) '被替换成(')
在Notepad++里查找替换下就行
image.png
image.png
image.png
这样就可把替换完成的XML直接导入到Testlink中了
如果导入时出现警告:xml_load_ko
可能是R语言默认的编码问题,和本地主机编码不匹配。
解决方法是:在本地创建一个文本,把XML文件内容复制进去,再把后缀名改成xml即可