- 浏览: 416499 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
lkun__blog:
网页打不开啊
博客搬家到http://cuiz.me -
bglmmz:
楼主怎么解决的?我用python调用ice服务,也出现此问题, ...
syscall exception: 存储空间不足,无法处理此命令 -
luliangy:
哥,你什么配置,我10W个请求10秒左右就搞定了,毫无压力,R ...
Nginx和Apache简单的并发压力测试 -
liuxuejin:
这!看的我都···········。我看代码而已。怎么
EPOLL及消息队列实现SMTP 之 青楼的故事 -
zires:
night_stalker 写道unicorn 也很好维护啊, ...
Unicorn和Passenger性能测试对比
以Ruby代码为例,
QC平台的SDK以COM组件的形式对外开放,但这种开放方式只限于本机,如果需要进行远程访问QC开放的接口,需要对这套SDK包装一下,做成标准化的远程通讯协议或方式,比如:ice或者rest。
我的设计是将COM用Ruby包装一下,做成一个对外提供Rest方式接口的QCMetaServer服务器。 过程如下:
首先要访问QC的COM组件,建立全局连接,需要的话可以放到公用的池子里。Ruby做成服务发布的时候通常是按多进程方式发布的,所以一般一个进程一个连接就够了,不需要池子。
其次将所需的所有COM接口封装一下,变成Rest接口,这样可以和其它远程服务器进行通讯。
最后,注意在服务器终止之前释放连接,否则QC的COM会报错:
QCMetaServer.rb:112: [BUG] Segmentation faultruby 1.8.6 (2008-08-11) [i386-mswin32]This application has requested the Runtime to terminate it in an unusual way.Please contact the application’s support team for more information.
QCMetaServer.rb:112: [BUG] Segmentation fault ruby 1.8.6 (2008-08-11) [i386-mswin32] This application has requested the Runtime to terminate it in an unusual way. Please contact the application’s support team for more information.
这个错误对于公司内部少数人使用的情况下没有多大影响,但这种设计对生产环境上的应用来说是不允许的。
对QC接口二次开发之前,需要了解下QC SDK,相关资料请各位网上搜索,我这里资料有限,本人也是边看少而又少的资料,边猜测着开发的。
下面这个图大家引用的较多,这是QC COM中的SDK方法的树状结构图,绝大部分对象都是通过工厂方法生成的,这是规律。
代码如下:
服务器启动后,访问如下几个url可得到相应的结果:
http://localhost:4567/(QC的一些信息)
http://localhost:4567/ole(下面是COM中所有方法和属性的列表。)
http://localhost:4567/projects(得到QC中项目列表,COM中的ProjectsList对象怎么使用还没有找到文档)
http://localhost:4567/bugs(显示当前项目的Bug信息,目前有乱码问题。通过max参数控制显示的数量)
QC平台的SDK以COM组件的形式对外开放,但这种开放方式只限于本机,如果需要进行远程访问QC开放的接口,需要对这套SDK包装一下,做成标准化的远程通讯协议或方式,比如:ice或者rest。
我的设计是将COM用Ruby包装一下,做成一个对外提供Rest方式接口的QCMetaServer服务器。 过程如下:
首先要访问QC的COM组件,建立全局连接,需要的话可以放到公用的池子里。Ruby做成服务发布的时候通常是按多进程方式发布的,所以一般一个进程一个连接就够了,不需要池子。
其次将所需的所有COM接口封装一下,变成Rest接口,这样可以和其它远程服务器进行通讯。
最后,注意在服务器终止之前释放连接,否则QC的COM会报错:
QCMetaServer.rb:112: [BUG] Segmentation faultruby 1.8.6 (2008-08-11) [i386-mswin32]This application has requested the Runtime to terminate it in an unusual way.Please contact the application’s support team for more information.
QCMetaServer.rb:112: [BUG] Segmentation fault ruby 1.8.6 (2008-08-11) [i386-mswin32] This application has requested the Runtime to terminate it in an unusual way. Please contact the application’s support team for more information.
这个错误对于公司内部少数人使用的情况下没有多大影响,但这种设计对生产环境上的应用来说是不允许的。
对QC接口二次开发之前,需要了解下QC SDK,相关资料请各位网上搜索,我这里资料有限,本人也是边看少而又少的资料,边猜测着开发的。
下面这个图大家引用的较多,这是QC COM中的SDK方法的树状结构图,绝大部分对象都是通过工厂方法生成的,这是规律。
代码如下:
require 'rubygems' require 'activerecord' require 'win32ole' require 'pp' p "Global initializion." $qc = WIN32OLE.new("TDApiOle80.TDConnection") p "Loaded COM => TDApiOle80.TDConnection" $qc.InitConnectionEx("http://10.2.226.12/qcbin/"); p "QC connection init." $qc.ConnectProjectEx('ALISOFT_CRM','ALISOFT_CRM2006','cuizheng',''); p "QC project connection init." require 'sinatra/base' require 'coderay' class QCMeta < Sinatra::Base get '/' do h = {} h[:ProjectName] = $qc.ProjectName h[:ServerURL] = $qc.ServerURL h[:ServerTime] = $qc.ServerTime h[:ProjectProperties] = $qc.ProjectProperties h[:ServerName] = $qc.ServerName h.to_xml end get '/ole' do h = { "TDApiOle80.TDConnection<functional>" => $qc.ole_func_methods.map{|f|f.to_s}, "TDApiOle80.TDConnection<property(get)>" => $qc.ole_get_methods.map{|f|f.to_s}, "TDApiOle80.TDConnection<property(set)>" => $qc.ole_put_methods.map{|f|f.to_s} }.to_json params[:color].downcase == "true" ? CodeRay.scan(h,:json).div(:line_number => :tables) : h end get '/projects' do {:ProjectsList => $qc.ProjectsList}.to_xml end =begin <C#> int intSub = 286; SubjectNode nodSub = objTree.get_NodeById(intSub) as SubjectNode; TestFactory objTF = nodSub.TestFactory as TestFactory; lstList = objTF.NewList(""); foreach (Test objTest in lstList) { MessageBox.Show((string)objTest.Name); } =end #~ tm = $qc.TreeManager #~ nod = tm.get_NodeById(id) #~ nod.TestFactory.NewList("").each do |test| #~ pp test.Status #~ end =begin <VB> Dim BugFactory, BugList Set BugFactory = QCConnection.BugFactory Set BugList = BugFactory.NewList("") 'Get a list of all the defects. =end get "/bugs" do bf = $qc.BugFactory bflist = bf.NewList("") max = params[:max] || 100 i = 0 h = {} bflist.each do |bug| h[bug.ID] = { :Status => bug.Status, :AssignedTo => bug.AssignedTo, :DetectedBy => bug.DetectedBy, :Priority => bug.Priority, :Summary => bug.Summary } i >= max ? break : i+=1 end {:BUGS => h,:COUNT => bflist.Count}.to_xml end def self.run!(options={},&trap_handler) set options handler = detect_rack_handler handler_name = handler.name.gsub(/.*::/, '') puts "== Sinatra/#{Sinatra::VERSION} has taken the stage " + "on #{port} for #{environment} with backup from #{handler_name}" unless handler_name =~/cgi/i handler.run self, :Host => host, :Port => port do |server| trap(:INT) do trap_handler.call ## Use thins' hard #stop! if available, otherwise just #stop server.respond_to?(:stop!) ? server.stop! : server.stop puts "\n== Sinatra has ended his set (crowd applauds)" unless handler_name =~/cgi/i end set :running, true end rescue Errno::EADDRINUSE => e puts "== Someone is already performing on port #{port}!" end end QCMeta.run!(:host=>'0.0.0.0', :port => 4567){ begin $qc.DisconnectProject p "QCMeta disconnected to QC." $qc.ReleaseConnection p "QCMeta released to QC." p "QCMeta will shutdown." rescue => e p "QCMeta disconnect and release faile." p "But server still going to shutdown." p e.to end }
服务器启动后,访问如下几个url可得到相应的结果:
http://localhost:4567/(QC的一些信息)
引用
<hash>
<ServerURL>http://10.2.226.12/qcbin</ServerURL>
<ServerTime>2009/11/16 10:56:57</ServerTime>
<ProjectProperties>#<WIN32OLE:0×2cd0404></ProjectProperties>
<ServerName>http://10.2.226.12/qcbin/wcomsrv.dll</ServerName>
<ProjectName>ALISOFT_CRM2006</ProjectName>
</hash>
<ServerURL>http://10.2.226.12/qcbin</ServerURL>
<ServerTime>2009/11/16 10:56:57</ServerTime>
<ProjectProperties>#<WIN32OLE:0×2cd0404></ProjectProperties>
<ServerName>http://10.2.226.12/qcbin/wcomsrv.dll</ServerName>
<ProjectName>ALISOFT_CRM2006</ProjectName>
</hash>
http://localhost:4567/ole(下面是COM中所有方法和属性的列表。)
引用
{”TDApiOle80.TDConnection<property(get)>”=>
["Connected",
"ProjectConnected",
"ServerName",
"ProjectName",
"TestRepository",
"UserName",
"TestFactory",
"BugFactory",
"TestSetFactory",
"UserGroupsList",
"HostFactory",
"VCS",
"ProjectsList",
"Command",
"TreeManager",
"ReqFactory",
"ActionPermission",
"DBType",
"DBManager",
"Customization",
"Fields",
"CommonSettings",
"UserSettings",
"HostGroupFactory",
"UsersList",
"Password",
"ExtendedStorage",
"DirectoryPath",
"ChangeFactory",
"MailConditions",
"ServerTime",
"TDSettings",
"ProjectProperties",
"DomainName",
"TextParam",
"TDParams",
"UsingProgress",
"CheckoutRepository",
"ViewsRepository",
"VcsDbRepository",
"RunFactory",
"ModuleVisible",
"ProjectsListEx",
"DomainsList",
"Analysis",
"VMRepository",
"DBName",
"Rules",
"TestSetTreeManager",
"AlertManager",
"AllowReconnect",
"KeepConnection",
"IgnoreHtmlFormat",
"ReportRole",
"ComponentFactory",
"ComponentFolderFactory",
"ServerURL",
"ProductInfo"],
“TDApiOle80.TDConnection<property(set)>”=>
["UsingProgress",
"AllowReconnect",
"KeepConnection",
"IgnoreHtmlFormat",
"ClientType"],
“TDApiOle80.TDConnection<functional>”=>
["QueryInterface",
"AddRef",
"Release",
"GetTypeInfoCount",
"GetTypeInfo",
"GetIDsOfNames",
"Invoke",
"InitConnection",
"ReleaseConnection",
"ConnectProject",
"DisconnectProject",
"GetLicense",
"SendMail",
"ChangePassword",
"PurgeRuns",
"GetLicenseStatus",
"InitConnectionEx",
"ConnectProjectEx",
"ConnectToVCSAs",
"GetLicenses",
"SynchronizeFollowUps",
"GetTDVersion",
"GetTypeInfoCount",
"GetTypeInfo",
"GetIDsOfNames",
"Invoke"]}
["Connected",
"ProjectConnected",
"ServerName",
"ProjectName",
"TestRepository",
"UserName",
"TestFactory",
"BugFactory",
"TestSetFactory",
"UserGroupsList",
"HostFactory",
"VCS",
"ProjectsList",
"Command",
"TreeManager",
"ReqFactory",
"ActionPermission",
"DBType",
"DBManager",
"Customization",
"Fields",
"CommonSettings",
"UserSettings",
"HostGroupFactory",
"UsersList",
"Password",
"ExtendedStorage",
"DirectoryPath",
"ChangeFactory",
"MailConditions",
"ServerTime",
"TDSettings",
"ProjectProperties",
"DomainName",
"TextParam",
"TDParams",
"UsingProgress",
"CheckoutRepository",
"ViewsRepository",
"VcsDbRepository",
"RunFactory",
"ModuleVisible",
"ProjectsListEx",
"DomainsList",
"Analysis",
"VMRepository",
"DBName",
"Rules",
"TestSetTreeManager",
"AlertManager",
"AllowReconnect",
"KeepConnection",
"IgnoreHtmlFormat",
"ReportRole",
"ComponentFactory",
"ComponentFolderFactory",
"ServerURL",
"ProductInfo"],
“TDApiOle80.TDConnection<property(set)>”=>
["UsingProgress",
"AllowReconnect",
"KeepConnection",
"IgnoreHtmlFormat",
"ClientType"],
“TDApiOle80.TDConnection<functional>”=>
["QueryInterface",
"AddRef",
"Release",
"GetTypeInfoCount",
"GetTypeInfo",
"GetIDsOfNames",
"Invoke",
"InitConnection",
"ReleaseConnection",
"ConnectProject",
"DisconnectProject",
"GetLicense",
"SendMail",
"ChangePassword",
"PurgeRuns",
"GetLicenseStatus",
"InitConnectionEx",
"ConnectProjectEx",
"ConnectToVCSAs",
"GetLicenses",
"SynchronizeFollowUps",
"GetTDVersion",
"GetTypeInfoCount",
"GetTypeInfo",
"GetIDsOfNames",
"Invoke"]}
http://localhost:4567/projects(得到QC中项目列表,COM中的ProjectsList对象怎么使用还没有找到文档)
引用
<hash>
<ProjectsList>#<WIN32OLE:0×344f07c></ProjectsList>
</hash>
<ProjectsList>#<WIN32OLE:0×344f07c></ProjectsList>
</hash>
http://localhost:4567/bugs(显示当前项目的Bug信息,目前有乱码问题。通过max参数控制显示的数量)
引用
<hash>
<BUGS>
<85>
<Summary>²¿ÃÅÃèÊöΪ511¸ö×Ö·ûµÄ²¿ÃÅ£¬ÔÚ²¿ÃÅÐÅÏ¢µÄ²¿ÃÅÃèÊöÖÐÎÞ·¨ÏÔʾ</Summary>
<AssignedTo>quake.hongwq</AssignedTo>
<DetectedBy>snake.zhangw</DetectedBy>
<Status>Closed</Status>
<Priority></Priority>
</85>
<9>
<Summary>²úÆ·ÐÅÏ¢ÏÔʾ²»ÍêÕû</Summary>
<AssignedTo>morgan.zhul</AssignedTo>
<DetectedBy>snake.zhangw</DetectedBy>
<Status>Closed</Status>
<Priority></Priority>
</9>
<47>
<Summary>±¨¼Û´òÓ¡Ô¤ÀÀҳûÓдòÓ¡ºÍ·µ»Ø°´Å¥</Summary>
<AssignedTo>morgan.zhul</AssignedTo>
<DetectedBy>jack</DetectedBy>
<Status>Closed</Status>
<Priority></Priority>
</47>
<28>
<Summary>ÊäÈë·Ç·¨Ò³Â룬³ö´í</Summary>
<AssignedTo>quake.hongwq</AssignedTo>
<DetectedBy>jack</DetectedBy>
<Status>Closed</Status>
<Priority></Priority>
</28>
<66>
<BUGS>
<85>
<Summary>²¿ÃÅÃèÊöΪ511¸ö×Ö·ûµÄ²¿ÃÅ£¬ÔÚ²¿ÃÅÐÅÏ¢µÄ²¿ÃÅÃèÊöÖÐÎÞ·¨ÏÔʾ</Summary>
<AssignedTo>quake.hongwq</AssignedTo>
<DetectedBy>snake.zhangw</DetectedBy>
<Status>Closed</Status>
<Priority></Priority>
</85>
<9>
<Summary>²úÆ·ÐÅÏ¢ÏÔʾ²»ÍêÕû</Summary>
<AssignedTo>morgan.zhul</AssignedTo>
<DetectedBy>snake.zhangw</DetectedBy>
<Status>Closed</Status>
<Priority></Priority>
</9>
<47>
<Summary>±¨¼Û´òÓ¡Ô¤ÀÀҳûÓдòÓ¡ºÍ·µ»Ø°´Å¥</Summary>
<AssignedTo>morgan.zhul</AssignedTo>
<DetectedBy>jack</DetectedBy>
<Status>Closed</Status>
<Priority></Priority>
</47>
<28>
<Summary>ÊäÈë·Ç·¨Ò³Â룬³ö´í</Summary>
<AssignedTo>quake.hongwq</AssignedTo>
<DetectedBy>jack</DetectedBy>
<Status>Closed</Status>
<Priority></Priority>
</28>
<66>
发表评论
-
N度空间关系图
2011-05-11 17:22 1542计算机 ... -
Rails3和Rack依赖关系图
2011-05-11 17:17 0找到一个好的画图工具不容易啊,试试这个 -
Unicorn和Passenger性能测试对比
2011-05-03 13:04 4305测试工具:ab 测试 ... -
libsmtp--库的一个bug
2011-02-18 17:09 1830http://libsmtp.sourceforge.net/ ... -
从main.c开始走进Ruby-异常
2010-08-26 18:21 1109这一阵子真没时间,9月上旬更没时间,头大. 前天写面试题目的 ... -
从main.c开始走进Ruby-有形亦无形的数据
2010-08-20 00:32 2232上一篇文章我们找到了如何调试Ruby的入口,只要走进去, ... -
从main.c开始走进Ruby-登上调试Ruby之旅
2010-08-18 12:11 1229我想更深入的了解Ruby内 ... -
日积月累-分享我的工具库
2010-08-04 11:53 1151批量替换 指定目录及其子目录中所有文件内的字符串 ... -
关键字和预定义变量:__END__和DATA的问题
2010-05-13 10:07 1292两个文件,a.rb和b.rb 当a.r ... -
[J]Ruby自编译安装
2010-02-24 11:37 1289#直接Copy并粘贴到控制台 #安装Ruby1.9.1- ... -
libvirt和ruby-libvirt在Macos系统上安装失败解决方法
2010-01-22 17:31 1135附件中是补丁及安装脚本, 安装前先看下install那个脚本 ... -
【GUI】LoadRunner的Controller定时执行
2010-01-19 14:38 3659玩玩的,很好玩不是么,工作就是要好玩,否则还工作个屁啊。 ... -
将QC的COM接口开放成Rest服务[续]
2010-01-14 11:53 1470利用QC的开放架构平台的COM组建, 给HP的QC写一个Met ... -
Ruby的ActiveRecord1.9个小时能够插入1000万mysql数据
2009-12-29 15:38 865rtrtrt -
TextMate中Command+R无法执行的变通解决方法
2009-12-28 12:08 2710如果你在升级了雪豹并且设定为64位启动模式后, TM无法通过C ... -
批量更改主机密码
2009-12-22 17:00 762require "rubygems" r ... -
虚拟机!
2009-11-12 16:25 796ruby-libvirt ============ Ruby ... -
Swig编译C/C++代码给Ruby [on Mac]
2009-10-12 15:01 2079charlesdemacbook-pro:swig Cui$ ... -
让一个类include一个模块的几种方法
2009-09-22 10:59 777module Test module ClassMeth ... -
ruby中当前系统分隔符
2009-09-08 15:28 770$/
相关推荐
QC8.2开放式架构指南。 虽然有些过时,但是还是比较经典的,结合QC8.2指南一起,基本上可以触类旁通到9.2
(4)QC8.2开放式测试体系架构指南.pdf (5)QC9.0BPT英文指南.pdf (6)QC9.0Site_Admin_API_Reference英文版 (7)QC9.0安装指南英文版 (8)QC9.O中文版用户手册 (9)QC操作汇总.doc (10)QC测试用例管理.ppt ...
QC资料 QC资料 QC资料QC资料QC资料QC资料QC资料QC资料
QC使用流程QC使用流程QC使用流程QC使用流程QC使用流程QC使用流程QC使用流程
QC9.0License+QC9.2License+QC10.0License,使用时将扩展名"txt"修改成"license
测试管理工具QC培训测试管理工具QC培训测试管理工具QC培训测试管理工具QC培训
QC错误解决方法,关于QC各种问题的详细解决方法,都可以在这里找到
QC小组活动是企业提高工作质量、服务质量、提高职工素质、发挥职工聪明才智、满足职工实现自身价值的有效途径。职工素质的提高、工作质量的改善必将促进人的安全行为的养成和物及周围环境安全状态的形成。QC小组活动...
快充协议QC3.0官方介绍文档,英文版
QC小型化油罐清洗装置的研制.doc QC提高国际项目采办竣工资料一次交验合格率.doc QC提高干挂圆弧石材安装的一次验收合格率.doc QC提高砂岩幕墙面板安装一次合格率.docx QC提高钢筋混凝土坡屋面质量一次合格率.doc QC...
QC9.0+SQLServer2005安装问题解决办法
QC Excel导入插件,经典导入插件,方便使用
QC插件QC插件QC插件QC插件QC插件QC插件QC插件QC插件QC插件
QC教程,有关QC使用方面的相关说明。 qc简介、需求制定、制定计划测试等方面的说明
HP Quality Center10.00安装手册 QC10.0操作手册
类似QTP提供的组件式接口,HP公司的QC(ALM)同样提供了组件式接口。 从tcl程序中,收集了QC常用的接口,包括测试计划、测试集、测试实验室、测试报告等。 该组件对象为:TDApiOle80.TDConnection,希望能给大家提供...
up9616是一个高效率同步整流降压...up9616具有恒定的输出快速充电电压5.1v/9.2v/12.1v(qc2.0 / qc3.0)从D +和D -线和自动检测检测是否连接的供电设备(局部放电)是快速充电(qc2.0 / qc3.0)能够在使输出电压调整。
QC入门到精通,快速上手,使用qc。
qc小组活动记录配电带电检修班QC小组
(品管工具QC七大手法)运用QC方法提高建筑智能化接口质量.pdf