这一节,我们继续上一节的内容,为我们的自动化工具添加发送HTTP请求的功能。完成后的代码结构如下:
1.首先我们增加了一个conf目录,这里用来存放全局配置,如要测试的网站的主页,用户名密码等基本信息。
setup.rb的代码如下:
setup {
@baseUrl = "http://www.baidu.com"
}
目前功能还很简单,只是定义了我们要测试的网站主页,这里以百度为例。然后问题就是怎样将这个配置加载到我们的main对象里,使其对main对象可见。
2.main.rb代码如下:
require_relative ‘./class_macro/http_method_macro‘
require_relative ‘./http_methods/http_methods‘
class << self
include HttpClassMacroModule
include HttpMethodModule
http_method :GET
http_method :POST
http_method :DELETE
http_method :PUT
def setup(&block)
self.instance_eval {
block.call
}
end
def load_setup
Dir.glob(‘./conf/setup*.rb‘).each do |file|
load file
end
end
end
load_setup
GET :url=>"/index.html"
红色部分就是我们实现自动加载配置,并将配置定义为main对象的实例变量。和JAVA不同,JAVA一般要解析XML文件,并将解析出的配置转换为对象或变量。我们在ruby
里定义的配置就直接变成了main对象的变量。
实现方法如下:
a.首先定义setup方法,这个方法为main的实例方法,参数为一个block.这个setup方法就只是将这个block在当前对象的上下文中执行了一下,这样这个block中如果定义变量的话,就自动变为当前对象的变量了;同理,如果定义方法就变成这个对象的方法了。
b.然后我们定义load_setup方法,这个方法自动加载conf目录下的所有配置文件,并执行。
c.这样,我们就可以在配置文件中对对象进行定义方法,变量各种操作,就像在配置文件中写代码一样。
3.然后我们在http_methods/http_methods.rb中实现具体的http操作,代码如下:
require ‘net/http‘
require ‘uri‘
module HttpMethodModule
def httpGet(options)
params = options[:params]
url = @baseUrl + params[:url]
uri = URI.parse(url)
req = Net::HTTP::Get.new(params[:url])
Net::HTTP.start(uri.host) do |http|
response = http.request(req)
p response.body
end
end
def httpPost(options)
params = options[:params]
p params
end
def httpPut(options)
params = options[:params]
p params
end
def httpDelete(options)
params = options[:params]
p params
end
end
这里我们只实现了get操作,如果有其它测试需要,可以自己扩展。我们从参数里解析出url等信息,发送具体的HTTP请求,并打印返回的内容。这里的打印只是为了测试。
4.我们扩展上一节的类宏http_method,在具体的GET,POST,DELETE,PUT等方法中发送具体的HTTP请求。class_macro/http_method_macro.rb代码如下:
module HttpClassMacroModule
def self.included(base)
base.extend HttpClassMacros
end
module HttpClassMacros
def http_method(name)
define_method(name) do |*args|
@testCase = {}
@testCase[:params] = args[0]
@testCase[:request] = name.to_s
op = name.to_s.downcase
case op
when "get" then
httpGet(@testCase)
when "post"
httpPost(@testCase)
when "put"
httpPut(@testCase)
when "delete"
httpDelete(@testCase)
else
print "undefined http method:#{op}"
end
end
end
end
end
我们将GET测试用例的输入(GET :url=>"/index.html")分析到@testCase这个hash表里后,传递给具体的http函数,由http函数解析并发送HTTP请求。
最后程序运行结果如下:
"<!DOCTYPE html><!--STATUS OK--><html><head><meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=Edge\"><meta content=\"always\" name=\"referrer\"><link rel=\"dns-prefetch\" href=\"//s1.bdstatic.com\"/><link
rel=\"dns-prefetch\" href=\"//t1.baidu.com\"/></body></html>\r\n"
Process finished with exit code 0
这一节,我们实现了自动加载全局配置,并将测试用例的输入转换为具体的HTTP请求并发送。
下一节,我们将实现操作EXECL的功能,从EXCEL中解析测试用例并执行。