Tcl通过xml-rpc接口操作Testopia

    Testopia是一个开源的测试用例管理工具,以Bugzilla插件的形式存在。和Bugzilla一样,Testopia提供XML-RPC编程接口。

    公司的自动化测试框架需要自动更新测试结果到Testopia上的功能,google了一下,发现Testopia官方网站上提供了Python和Java的样例,地址是:http://landfill.bugzilla.org/testopia2/testopia/contrib/drivers/(这个地址情绪不太稳定,Testopia官方的话:occasionally goes down)。很可惜,没有Tcl的,遂研究了一下,总结于此。

    Tcl下XMLRPC包提供了XML-RPC接口,可使用"package require XMLRPC”进行加载,XMLRPC下一个基本XML-RPC接口的调用主要有两个步骤:

1. 使用::XMLRPC::create创建与接口等价的Tcl函数。

2. 使用Tcl函数完成XML-RPC调用。

    示例:

Testopia的 Product.get_cases API(链接1,链接2 Line 285)可以获取某个product下的所有测试用例,这个API的参数只有一个:$product - Integer/String, Integer: product_id of the product in the Database, String: Product name。调用这个API的过程:

package require XMLRPC

set product_id 100
set testopia_serverip 192.168.1.1
set url http://$testopia_serverip/bugzilla/xmlrpc.cgi

#创建与接口等价的Tcl函数
XMLRPC::create "Product.get_cases" \
    -proxy $url \
    -params {product int}

#调用创建的Tcl函数
set testcase_info [Product.get_cases $product_id]
puts $testcase_info

    XMLRPC::create创建Tcl函数名有两种格式:

格式1:

XMLRPC::create "API Name" ;#Tcl函数名称与API名称完全一样

格式2:

XMLRPC::create "Tcl Proc Name"  \ ;#Tcl函数名称自定义,通过-name参数指定 API Name
    -name “API Name”

    params为API参数名称和参数类型的列表,格式: {参数名称 参数类型},参数类型主要有string、int、double、boolean等。

    另外,像User.login这类API需要结构类型的参数,定义结构类型参数的方法为:

::rpcvar::typedef {
    login string
    password string
    remember boolean
} login_struct

XMLRPC::create时使用结构参数的方法:

XMLRPC::create "User.login" \
    -proxy $url \
    -params {login login_struct}

Tcl函数调用时需要传递列表:

User.login {login abc password 123 remember 1}

 

    了解以上内容后后就可以参考Testopia的API接口进行调用了,API文档地址:http://landfill.mozilla.org/testopia/docs/en/html/api/。但是还有两点需要注意:

1. Testopia登录后的所有操作需要带Cookies,否则会提示"Login Required”,XMLRPC包里面没有提供操作Cookie的方法,但是提供了操作http头的方法,我们可以自己抓取Cookies,然后填写到后续的操作中报文中,具体请参考后面的代码。

2. 通过API返回的信息中有中文信息时,可能会显示乱码,可以通过编码转换来解决,如"encoding convertfrom utf-8 $content"

    下面通过一段代码演示登录Testopia,并且获取产品下所有Testcase的完整过程。

package require XMLRPC

#定义登录参数结构
::rpcvar::typedef {
    login string
    password string
    remember boolean
} login_struct

set product_id 1
set testopia_serverip 192.168.1.1

set url http://$testopia_serverip/bugzilla/xmlrpc.cgi

#创建登录、登出以及获取产品用例的Tcl函数
XMLRPC::create "User.login" \
    -proxy $url \
    -params {login login_struct}
XMLRPC::create "User.logout" \
    -proxy $url \
    -params {}
XMLRPC::create "Product.get_cases" \
    -proxy $url \
    -params {product int}

set login_result [User.login {login abc password 123 remember 1}]
#获取登录id,组装Coockie时会用到
set login_id [string range $login_result 3 end]

#获取http头
set http_meta [XMLRPC::dump -meta User.login]
#获取Cookie编号
regexp "Bugzilla_logincookie=(\[A-Za-z0-9\]+);" $http_meta match login_cookie
#组装完成的cookie
set full_cookie "Bugzilla_login=$login_id; Bugzilla_logincookie=$login_cookie"
#设置cookie到http头
XMLRPC::configure -transport http -headers [list "Cookie" $full_cookie]

set testcases [Product.get_cases $product_id]
set testcases_encoded [encoding convertfrom utf-8 $testcases]
puts $testcases_encoded

User.logout 

    输出的结果:

{author_id 144 script {} estimated_time 00:00:00 case_id 7563 case_status_id 2 default_tester_id 144 requirement {} priority_id 1 category_id 26 summary RFC2544测试 creation_date {2011-03-14 09:55:17} isautomated 0 arguments {}}


你可能感兴趣的:(api,String,url,login,Tcl,encoding)