美文网首页数据科学与R语言
R语言 Testlink excel 转XML 批量导入测试用例

R语言 Testlink excel 转XML 批量导入测试用例

作者: w王好人w | 来源:发表于2018-12-28 23:51 被阅读5次

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","<![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++里查找替换下就行


image.png image.png
image.png

这样就可把替换完成的XML直接导入到Testlink中了

如果导入时出现警告:xml_load_ko
可能是R语言默认的编码问题,和本地主机编码不匹配。
解决方法是:在本地创建一个文本,把XML文件内容复制进去,再把后缀名改成xml即可

最后,谨以此文来帮助测试同学们提高效率,省时省力!

相关文章

  • R语言 Testlink excel 转XML 批量导入测试用例

    Testlink作为一个开源的项目管理工具,功能是非常强大的。不得不说,在测试用例创建方面功能有些弱。大家都习惯了...

  • excel测试用例导入testlink

    原理:将xml文件导入testlink,vbs工具将以固定的列名编写的excel文件转化为xml文件。 最后在te...

  • TESTLINK导入测试用例

    不知不觉,距上次使用简书已有一个月之久。这段时间,一直想找时间将testlink导入用例的问题整理一下,无奈各项目...

  • TESTLINK导入测试用例-后续

    之前写过一篇关于如何将excel格式的测试用例导入到testlink的文章,感觉不好理解,且易用性不好。今天到学...

  • Testlink实践

    2016年在经历Excel管理测试用例的痛苦之后,我们决定将测试用例的编写和执行工作转到使用testlink,下面...

  • 爬取Testlink关联的bug信息

    笔者之前依赖TestlinkApi开发了一个小工具,详见文章《Testlink批量导入及导出Excel测试案例...

  • SpringBoot解析Excel

    现在很多web应用中,导入excel导出excel很常见,这篇文章就讲讲导入excel文件。 以批量导入课程为例 ...

  • 部署Testlink的必要性

    部署Testlink的必要性 TestLink 是基于web的测试用例管理系统,主要功能是测试用例的创建、管理和执...

  • testlink—导入测试用例和需求

    这个问题看着很简单,复杂就是复杂在如何把excel转化为 xml 格式,因为excel不能直接导入到testlin...

  • 测试用例管理平台——testlink

    界面: 标签:测试用例,开源,php 简述:testlink,一款基于web的测试用例管理系统,sourcefor...

网友评论

    本文标题:R语言 Testlink excel 转XML 批量导入测试用例

    本文链接:https://www.haomeiwen.com/subject/tfpylqtx.html