testrail_rspec_formatter 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9c6ed2420e271a13f68503bc3c95a17ad71a3afb
4
- data.tar.gz: 6dcfcf9dc87468142dc91209546097e5ea2e536c
3
+ metadata.gz: 7b4673b0d7956f86f4ab15a919497f4b363b8d3b
4
+ data.tar.gz: cf3cf82f5ca169f1cf1c6035849fadfe31b5b3ad
5
5
  SHA512:
6
- metadata.gz: 5868d6f21d1b2a1ba92b225fb1defa46b3b94c5ed967ef12178ee81e5f95b420d32daae01f82cfb69f012961fd70e8182adc255f1ccaae0ba1d9e01640d48548
7
- data.tar.gz: e9a5a560aa363d75f0fe48a0dae8176735158c73084bb5517f781367595312d5361f15a480f3c59850cb1096e7ac4b5cff86a0ddbed747c90a2f45181777962b
6
+ metadata.gz: 2448d88a23d8279dcdfbf4560472a5266164e657f225acb31378b140cdfba35fefbf120f26f6960491851215cc747f334dc97a9dd957a5ab04d25c10c5260d60
7
+ data.tar.gz: 83d567833ad7c1f6ccf5675e681db0884538c2b89c3fe5955d4401669f8ef36d0eabda9163e9babac995a927b2c4bf50d7aa0df31865cd3c9086e33c253cfad6
data/README.md CHANGED
@@ -1,8 +1,6 @@
1
1
  # TestrailRspecFormatter
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/testrail_rspec_formatter`. To experiment with that code, run `bin/console` for an interactive prompt.
4
-
5
- TODO: Delete this and the text above, and describe your gem
3
+ An RSpec formatter that sends results to [TestRail](http://www.gurock.com/testrail/)
6
4
 
7
5
  ## Installation
8
6
 
@@ -22,7 +20,62 @@ Or install it yourself as:
22
20
 
23
21
  ## Usage
24
22
 
25
- TODO: Write usage instructions here
23
+ After specs run the formatter will mark test cases of a test run as either passed, failed or retest,
24
+ depending on whether a spec passed, failed or is pending. Specs are associated with TestRail test cases
25
+ by adding a tag with the name `testrail` to them:
26
+
27
+ ```ruby
28
+ describe "som test" do
29
+ id "some spec", testrail: 1234 do # 1234 is the id of a test case
30
+ # ...
31
+ end
32
+ end
33
+ ```
34
+
35
+ The formatter must be configured with a run name inside a project id. If a run with that name doesn't exist
36
+ it is created.
37
+
38
+ The recommended way to use this formatter is to set the run name to a project's version or tag, and only
39
+ run it on release or deploy versions (using the disabeld configuration option).
40
+
41
+ ### Configuration
42
+
43
+ In addition to the configuration specified below, the formatter is only ran when passed to rspec
44
+ via a `--formatter` argument (which can be in the `.rspec` file):
45
+
46
+ ```
47
+ rspec spec --format TestrailRspecFormatter::Formatter
48
+ ```
49
+
50
+ To have it ran in addition to the default progress (dots) formatter, execute:
51
+
52
+ ```
53
+ rspec spec --format progress --format TestrailRspecFormatter::Formatter
54
+ ```
55
+
56
+ Configure it via `ENV` variables or `RSpec.configure` (or with a mix of them).
57
+
58
+ ### Via ENV
59
+
60
+ * TESTRAIL_FORMATTER_PROJECT_ID: (required) the id of the TestRail project
61
+ * TESTRAIL_FORMATTER_RUN_NAME: (required) the name of the run to target
62
+ * TESTRAIL_FORMATTER_URL: (required) the URL to target (`"https://your-user.testrail.com"``)
63
+ * TESTRAIL_FORMATTER_USER: (required) your TestRail user
64
+ * TESTRAIL_FORMATTER_PASSWORD: (required) your TestRail password (not recommended) or API key (recommended)
65
+ * TESTRAIL_FORMATTER_DISABLED: (optional) set to 1 to disable the formatter
66
+
67
+ ### Via `RSpec.configure`
68
+
69
+ ```ruby
70
+ RSpec.configure do |config|
71
+ config.testrail_formatter_options[:project_id] = ... # (required) the id of the TestRail project
72
+ config.testrail_formatter_options[:run_name] = ... # (required) the name of the run to target
73
+ config.testrail_formatter_options[:url] = ... # (required) the URL to target (`"https://your-user.testrail.com"``)
74
+ config.testrail_formatter_options[:user] = ... # (required) your TestRail user
75
+ config.testrail_formatter_options[:password] = ... # (required) your TestRail password (not recommended) or API key (recommended)
76
+ config.testrail_formatter_options[:disabled] = ... # (optional) set to true to disable the formatter
77
+ end
78
+ ```
26
79
 
27
80
  ## Development
28
81
 
@@ -32,10 +85,8 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
32
85
 
33
86
  ## Contributing
34
87
 
35
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/testrail_rspec_formatter.
36
-
88
+ Bug reports and pull requests are welcome on GitHub at https://github.com/manastech/testrail_rspec_formatter.
37
89
 
38
90
  ## License
39
91
 
40
92
  The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
41
-
@@ -14,6 +14,7 @@ require 'json'
14
14
 
15
15
  module TestrailRspecFormatter
16
16
  class APIClient
17
+ attr_accessor :base_url
17
18
  attr_accessor :user
18
19
  attr_accessor :password
19
20
 
@@ -21,6 +22,7 @@ module TestrailRspecFormatter
21
22
  if !base_url.match(/\/$/)
22
23
  base_url += '/'
23
24
  end
25
+ @base_url = base_url
24
26
  @url = base_url + 'index.php?/api/v2/'
25
27
  end
26
28
 
@@ -35,7 +37,7 @@ module TestrailRspecFormatter
35
37
  # uri The API method to call including parameters
36
38
  # (e.g. get_case/1)
37
39
  #
38
- def send_get(uri)
40
+ def get(uri)
39
41
  _send_request('GET', uri, nil)
40
42
  end
41
43
 
@@ -52,7 +54,7 @@ module TestrailRspecFormatter
52
54
  # data The data to submit as part of the request (as
53
55
  # Ruby hash, strings must be UTF-8 encoded)
54
56
  #
55
- def send_post(uri, data)
57
+ def post(uri, data)
56
58
  _send_request('POST', uri, data)
57
59
  end
58
60
 
@@ -87,8 +89,9 @@ module TestrailRspecFormatter
87
89
  else
88
90
  error = 'No additional error message received'
89
91
  end
90
- raise APIError.new('TestRail API returned HTTP %s (%s)' %
91
- [response.code, error])
92
+ ex = APIError.new('TestRail API returned HTTP %s (%s)' % [response.code, error])
93
+ ex.code = response.code.to_i
94
+ raise
92
95
  end
93
96
 
94
97
  result
@@ -96,5 +99,6 @@ module TestrailRspecFormatter
96
99
  end
97
100
 
98
101
  class APIError < StandardError
102
+ attr_accessor :code
99
103
  end
100
104
  end
@@ -17,11 +17,17 @@ module TestrailRspecFormatter
17
17
  RSpec::Core::Formatters.register self, :start, :close, :dump_summary, :dump_failures, :dump_pending
18
18
 
19
19
  def dump_summary(notification)
20
+ disabled = testrail_config_value(:disabled, "TESTRAIL_FORMATTER_DISABLED", false)
21
+ if disabled == "1" || disabled == true
22
+ testrail_log "skipped because it was disabled"
23
+ return
24
+ end
25
+
26
+ testrail_log "starting..."
27
+
20
28
  examples = notification.examples
21
29
  results = []
22
30
  examples.each do |example|
23
- next if example.pending?
24
-
25
31
  testrail_metadata = example.metadata[:testrail]
26
32
  next unless testrail_metadata
27
33
 
@@ -32,9 +38,13 @@ module TestrailRspecFormatter
32
38
  results << result
33
39
  end
34
40
 
35
- unless results.empty?
41
+ if results.empty?
42
+ testrail_log "no test cases found (no spec had a testrail tag)"
43
+ else
36
44
  post_testrail_results(results)
37
45
  end
46
+ ensure
47
+ testrail_log "finished"
38
48
  end
39
49
 
40
50
  def dump_failures(*)
@@ -49,10 +59,32 @@ module TestrailRspecFormatter
49
59
 
50
60
  def post_testrail_results(results)
51
61
  client = new_testrail_client
52
- run_id = testrail_config_value(:run_id, "TESTRAIL_FORMATTER_RUN_ID")
53
62
 
54
- json = {results: results}
55
- client.send_post("add_results_for_cases/#{run_id}", json)
63
+ project_id = testrail_config_value(:project_id, "TESTRAIL_FORMATTER_PROJECT_ID")
64
+ run_name = testrail_config_value(:run_name, "TESTRAIL_FORMATTER_RUN_NAME")
65
+
66
+ testrail_log "target url is: #{client.base_url}"
67
+
68
+ runs = client.get("get_runs/#{project_id}")
69
+ run = runs.find { |run| run["name"] == run_name }
70
+ if run
71
+ run_id = run["id"]
72
+ testrail_log "found run with name #{run_name.inspect}, id is #{run["id"]}"
73
+ else
74
+ testrail_log "no run found with name #{run_name.inspect}, creating one..."
75
+ case_ids = results.map { |result| result[:case_id] }
76
+ run = client.post("add_run/#{project_id}", {
77
+ name: run_name,
78
+ include_all: false,
79
+ case_ids: case_ids,
80
+ })
81
+ run_id = run["id"]
82
+ testrail_log "created run with id #{run["id"]}"
83
+ end
84
+
85
+ testrail_log "sending results for #{results.size} test case#{results.size == 1 ? "" : "s"}..."
86
+
87
+ client.post("add_results_for_cases/#{run_id}", {results: results})
56
88
  end
57
89
 
58
90
  def new_testrail_client
@@ -62,17 +94,27 @@ module TestrailRspecFormatter
62
94
  client
63
95
  end
64
96
 
65
- def testrail_config_value(hash_key, env_key)
66
- RSpec.configuration.testrail_formatter_options[hash_key] || ENV[env_key] || raise("Missing RSpec.configuration.testrail_formatter_options[#{hash_key.inspect}] or ENV[#{env_key.inspect}]")
97
+ def testrail_config_value(hash_key, env_key, default = nil)
98
+ value = RSpec.configuration.testrail_formatter_options[hash_key] || ENV[env_key]
99
+ if !value && default == nil
100
+ raise("Missing RSpec.configuration.testrail_formatter_options[#{hash_key.inspect}] or ENV[#{env_key.inspect}]")
101
+ end
102
+ value || default
67
103
  end
68
104
 
69
105
  def testrail_status(example)
70
- case example.execution_result.status
71
- when :passed
106
+ case
107
+ when example.pending?
108
+ RETEST
109
+ when example.execution_result.status == :passed
72
110
  PASSED
73
111
  else
74
112
  FAILED
75
113
  end
76
114
  end
115
+
116
+ def testrail_log(message)
117
+ output.puts "TestRail: #{message}"
118
+ end
77
119
  end
78
120
  end
@@ -1,3 +1,3 @@
1
1
  module TestrailRspecFormatter
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: testrail_rspec_formatter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ary Borenszweig
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-05-04 00:00:00.000000000 Z
11
+ date: 2016-05-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec