Ruby实现Http自动化测试(二)-----实现http方法

这一节,我们继续上一节的内容,为我们的自动化工具添加发送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中解析测试用例并执行。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。