公司的自动化测试框架需要自动更新测试结果到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 {}}