class Gridium::TestRail

Constants

CONFIG
ENV_ERROR

Public Class Methods

new() click to toggle source
# File lib/testrail.rb, line 12
def initialize
  if Gridium.config.testrail
    @url = ENV['GRIDIUM_TR_URL'].empty? || ENV['GRIDIUM_TR_URL'].nil? ? ENV_ERROR : ENV['GRIDIUM_TR_URL'] + '/index.php?/api/v2/'
    @user = ENV['GRIDIUM_TR_USER'].empty? || ENV['GRIDIUM_TR_USER'].nil? ? ENV_ERROR : ENV['GRIDIUM_TR_USER']
    @password = ENV['GRIDIUM_TR_PW'].empty? || ENV['GRIDIUM_TR_PW'].nil? ? ENV_ERROR : ENV['GRIDIUM_TR_PW']
    @pid = ENV['GRIDIUM_TR_PID'].empty? || ENV['GRIDIUM_TR_PID'].nil? ? ENV_ERROR : ENV['GRIDIUM_TR_PID']
    @retry_attempts = 5
    @time_between_retries = 3
    @tc_results = Array.new
    @tc_ids = Array.new
  end
  @run_info = {:id => 0 ,:error => false, :include_all => false}
end

Public Instance Methods

add_case(rspec_test) click to toggle source

Adds determines what the result of the test is and adds information to various arrays for processing during closing.

@param rspec_test [RSpec::Example] the example provided by RSpec @return [bool] determine if case was added or not

# File lib/testrail.rb, line 55
def add_case(rspec_test)
  added = false
  if Gridium.config.testrail
    Log.debug("[GRIDIUM::TestRail] Adding to list of TestRail Cases...")
    if rspec_test.nil? then
      Log.error("[GRIDIUM::TestRail] No test added to results. Turn of Gridium.config.testrail\n")
    end

    if rspec_test.exception
      status = CONFIG[:fail]
      message = rspec_test.exception.message
      screenshot_url = rspec_test.metadata[:screenshot_url]
      if screenshot_url
        message << "\n - Screenshot: #{screenshot_url}\n"
      end

      # add backtrace to test case
      bt_search_re = rspec_test.metadata[:backtrace_regex] || 'sitetestui'
      bt = rspec_test.exception.backtrace.grep(/#{bt_search_re}/)
      message << "\n\n -> " + bt.join("\n -> ") unless bt.empty?

      # replace rspec backtick (`): special formatting for TestRail
      # http://docs.gurock.com/testrail-userguide/userguide-editor
      message.gsub!('`', "'")
    else
      status = CONFIG[:pass]
      message = 'Test Passed.'
    end

    test_info = {:case_id => rspec_test.metadata[:testrail_id], :status_id => status, :comment => message}

    @tc_results.push(test_info)
    @tc_ids.push(test_info[:case_id])
    added = true
  end

  return added
end
add_run(name, desc) click to toggle source

Creates a new test Run in your TestRail instance.

@param name [String] the name of the test run. Error text will be added if an error occurs @param desc [String] a description of the run being added. Error text will be added if an error occurs @return [int] The run ID of the created run or zero if no run created.

# File lib/testrail.rb, line 31
def add_run(name, desc)
  if Gridium.config.testrail
    Log.debug("[GRIDIUM::TestRail] Creating Test Run: name: #{name} desc: #{desc}")
    if name.nil? || name.empty? then
      @run_info[:error] = true
    else
      @run_info[:name] = name
      @run_info[:desc] = desc
    end
    r = _send_request('POST', "#{@url}add_run/#{@pid}", @run_info)
    if r.key?('error') || r["id"].nil?
      @run_info[:error] = true
    else
      @run_info[:id] = r["id"]
      Log.debug("[GRIDIUM::TestRail] Run Added: #{r}")
    end
  end
  return @run_info[:id]
end
close_run(opts = {}) click to toggle source

Updates the existing test run with test cases and results. Adds error text for missing test cases if needed. Closes the run as long as it exists.

@return [bool] if the run was closed or not

# File lib/testrail.rb, line 97
def close_run(opts = {})
  closed = false
  if Gridium.config.testrail && !@run_info[:error]
    Log.debug("[GRIDIUM::TestRail] Closing test runid: #{@run_info[:id]}\n")
    if @tc_ids.size > 0
      r = _send_request('POST', "#{@url}update_run/#{@run_info[:id]}", {:case_ids => @tc_ids})
      Log.debug("[GRIDIUM::TestRail] UPDATE RUN: #{r}")
      sleep 0.25
      r = _send_request('POST', "#{@url}add_results_for_cases/#{@run_info[:id]}", {results: @tc_results})
      Log.debug("[GRIDIUM::TestRail] ADD RESULTS: #{r}")
      sleep 0.25
      Log.debug("[GRIDIUM::TestRail] #{r.class}")
      if r.is_a?(Hash)
        r = _send_request('POST', "#{@url}update_run/#{@run_info[:id]}", {:name => "ER:#{@run_info[:name]}", :description => "#{@run_info[:desc]}\nThe following was returned when adding cases: #{r}"})
        Log.error("[GRIDIUM::TestRail] ERROR: #{r}")
        sleep 0.25
      end
    end
    r = _send_request('POST', "#{@url}close_run/#{@run_info[:id]}", nil, opts)

    Log.debug("[GRIDIUM::TestRail] CLOSE RUN: #{r}")
    if r.has_key?("error")
      Log.error("[GRIDIUM::TestRail]: #{r}")
    else
      closed = true
    end
  end

  closed
end

Private Instance Methods

_send_request(method, uri, data, opts = {}) click to toggle source
# File lib/testrail.rb, line 129
def _send_request(method, uri, data, opts = {})
  read_timeout = opts[:read_timeout]
  attempts = @retry_attempts
  url = URI.parse(uri)
  Log.debug("[GRIDIUM::TestRail] Method: #{method} URL:#{uri} Data:#{data}")

  if method == 'POST'
    request = Net::HTTP::Post.new(url.path + '?' + url.query)
    request.body = JSON.dump(data)
  else
    request = Net::HTTP::Get.new(url.path + '?' + url.query)
  end
  request.basic_auth(@user, @password)
  request.add_field('Content-Type', 'application/json')

  conn = Net::HTTP.new(url.host, url.port)
  conn.read_timeout = read_timeout if read_timeout
  if url.scheme == 'https'
    conn.use_ssl = true
    conn.verify_mode = OpenSSL::SSL::VERIFY_NONE
  end
  begin
    response = conn.request(request)
    if response.body && !response.body.empty?
      result = JSON.parse(response.body)
    else
      result = {}
    end

    if response.code != '200'
      if result && result.key?('error')
        error = '"' + result['error'] + '"'
      else
        error = 'No additional error message received'
      end
       Log.error("[GRIDIUM::TestRail] #{response.code} - Error with request: #{error}")
    end
  rescue SocketError, Net::ReadTimeout => error
    Log.warn("[GRIDIUM::TestRail] Error - Retrying....")
    if attempts > 0
      attempts -= 1
      sleep @time_between_retries
      retry
    end
    Log.error("[GRIDIUM::TestRail] Error after numerous attempts. Error: #{error}")
    result = {error: "Error after #{@retry_attempts} attempts. See Error Log."}
  end

  result
end