ruby-testrail 1.1.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 +15 -0
- data/.rubocop.yml +56 -0
- data/.travis.yml +15 -0
- data/Gemfile +5 -0
- data/LICENSE.md +13 -0
- data/README.md +63 -0
- data/TESTRAIL_LICENSE.md +23 -0
- data/features/docs/testrail/adaptor.feature +45 -0
- data/features/lib/step_definitions/testrail/adaptor.rb +152 -0
- data/features/lib/support/env.rb +24 -0
- data/features/lib/support/hooks.rb +25 -0
- data/lib/testrail/adaptor.rb +73 -0
- data/lib/testrail/api_client.rb +119 -0
- data/lib/testrail/cucumber_adaptor.rb +47 -0
- data/lib/testrail/rspec_adaptor.rb +38 -0
- data/lib/testrail/test_case.rb +38 -0
- data/lib/testrail/test_result.rb +46 -0
- data/lib/testrail/test_run.rb +46 -0
- data/lib/testrail/test_section.rb +35 -0
- data/lib/testrail/test_suite.rb +98 -0
- data/lib/testrail/testrail_client.rb +72 -0
- data/ruby-testrail.gemspec +19 -0
- metadata +164 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
OGQ3MDc4NzM4YjdmOWRlZGY3ZjZiZjVlYjU3YzVlY2QwNTliZjUxZg==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
MmVmOThiYzE4NWYwZTg0NDUwZDQ1ZWY0NjMzMTZiYjFkN2Y4NmVlZA==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
MDZlNGE4ZTdlNzg1OWI4MTY3YmI5YjZlZWExZDE4MzIxZDI1MWEzNWYxM2Vj
|
10
|
+
MWUyYWM4NDE1YjQwNGU1NDkzZjg4ZWU4ZjQyMWY1M2Y3MTk4OWI1NWNkMjBh
|
11
|
+
MGJlYWZlYjk3ODA5Mjg5MTAxYzJmMzM2OWVjOGY2MTRjNGQyYTQ=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
Y2FiMzhiZGRiOTgwZjA5MWI1MzhjMGFlYzFkNzU4ZWY3MTFmZGM2ZmEyOWJk
|
14
|
+
OTRhODBkNmJlNTNkYjljZjk0YWYxNzRkNzM4ZjdjNTg3NDdlMmEwMmRmN2U2
|
15
|
+
ZWVjNDg3NDFlOWRiYmEzODY3M2JjZDE1NDQxNGZiNTZiNjM0MzA=
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
AllCops:
|
2
|
+
TargetRubyVersion: 2.2
|
3
|
+
|
4
|
+
Lint/UnusedBlockArgument:
|
5
|
+
Enabled: false
|
6
|
+
|
7
|
+
Metrics/AbcSize:
|
8
|
+
Enabled: false
|
9
|
+
|
10
|
+
Metrics/LineLength:
|
11
|
+
Max: 120
|
12
|
+
|
13
|
+
Metrics/MethodLength:
|
14
|
+
Enabled: false
|
15
|
+
|
16
|
+
Metrics/ParameterLists:
|
17
|
+
Max: 7
|
18
|
+
|
19
|
+
Metrics/ClassLength:
|
20
|
+
Enabled: false
|
21
|
+
|
22
|
+
Style/AccessorMethodName:
|
23
|
+
Enabled: false
|
24
|
+
|
25
|
+
Style/BracesAroundHashParameters:
|
26
|
+
Enabled: false
|
27
|
+
|
28
|
+
Style/ClassAndModuleChildren:
|
29
|
+
Enabled: false
|
30
|
+
|
31
|
+
Style/ClassVars:
|
32
|
+
Enabled: false
|
33
|
+
|
34
|
+
Style/Documentation:
|
35
|
+
Enabled: false
|
36
|
+
|
37
|
+
Style/EmptyLinesAroundBlockBody:
|
38
|
+
Enabled: false
|
39
|
+
|
40
|
+
Style/EmptyLinesAroundClassBody:
|
41
|
+
EnforcedStyle: empty_lines
|
42
|
+
|
43
|
+
Style/EmptyLinesAroundModuleBody:
|
44
|
+
EnforcedStyle: empty_lines
|
45
|
+
|
46
|
+
Style/IndentationWidth:
|
47
|
+
Width: 2
|
48
|
+
|
49
|
+
Style/IndentHash:
|
50
|
+
Enabled: false
|
51
|
+
|
52
|
+
Style/WordArray:
|
53
|
+
Enabled: false
|
54
|
+
|
55
|
+
Lint/HandleExceptions:
|
56
|
+
Enabled: false
|
data/.travis.yml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
language: ruby
|
2
|
+
rvm:
|
3
|
+
- 2.2
|
4
|
+
before_install: gem update --remote bundler
|
5
|
+
install:
|
6
|
+
- bundle install --retry=3
|
7
|
+
script:
|
8
|
+
- bundle exec rubocop features lib
|
9
|
+
- bundle exec cucumber features
|
10
|
+
deploy:
|
11
|
+
provider: rubygems
|
12
|
+
api_key:
|
13
|
+
secure: DcF9uIbKdFzbKdz6xbYBbauG0dBV90i+HQRxpl41sz9hua/tfEkNtWCKa1A15xD4MhSkeKNkwwM3Axm/OA8Fp63nc9dHPTd3mcWwL0CmmKVAlolgbdHvTr04Vz0s1M9dV4w0XBhX/M/Vezi23MoHT2Z3B0YvYnbBVQEtIH+t5CPcY5tWXm/Dyz3J8CGhuO4oboW906K3MVBRqclz/njM3PXezNwOXrNGVyOnr94WTDXG857qzZnr2p1U1gRVCX7eyHIY6/pgxuejfcIkXS8c7WZ8tYuyc4xfcHGMdpHdFRRXuf7anpGikFPz2Qw2r2uaDhVAUzRgXjTF9JfYPPyDP3iZHVXa+G+jMHhXCCNPX85D4mfQz87okNH1PelRv2U9kZv3sxxtuIuOAwuKS+fWAc/dmhf7Q5PWROxGLzkwjbzqfQGz6Ia2jTvv+c4/1hyZLLctwf6Mq4E/XOqiU0ebjY77xhuMghtEscCp6D+HfD0p2GXiNbUfIPpczNZYZ2mv/kova7hExaldcrV0hE3y2OhxmxPEishjWm43wtoPXbpyK3w7Rm2mJXQk8OhwYpOh+OKg33GOBzI221KLnPvnip0vQ5Zw8FZuVH3ygyX4JA2WiqM2JKaqFTGzcNwMJdL6rDG61jKpVv7Hb8mO8zGWtew5FEwjdD6ypVtx5h4LqE4=
|
14
|
+
on:
|
15
|
+
tags: true
|
data/Gemfile
ADDED
data/LICENSE.md
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
Copyright 2016 Findly Inc. NZ
|
2
|
+
|
3
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
you may not use this file except in compliance with the License.
|
5
|
+
You may obtain a copy of the License at
|
6
|
+
|
7
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
|
9
|
+
Unless required by applicable law or agreed to in writing, software
|
10
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
See the License for the specific language governing permissions and
|
13
|
+
limitations under the License.
|
data/README.md
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
### Status
|
2
|
+
[](https://travis-ci.org/Findly-Inc/ruby-testrail)
|
3
|
+
|
4
|
+
### Supported Ruby Version
|
5
|
+
2.2
|
6
|
+
|
7
|
+
TestRail Integration Adaptor
|
8
|
+
============================
|
9
|
+
|
10
|
+
The tool provides a way to integrate Cucumber/RSpec test suites with
|
11
|
+
TestRail using it's API.
|
12
|
+
|
13
|
+
The adaptor gets all the tests results in a cache so it doesn't make
|
14
|
+
https for each test. Instead, it sends a single API call with all the
|
15
|
+
results together. This avoid problems with the server throttling enforced
|
16
|
+
by the server.
|
17
|
+
|
18
|
+
### Installation
|
19
|
+
|
20
|
+
Just include the gem in your Gemfile
|
21
|
+
|
22
|
+
```ruby
|
23
|
+
gem 'ruby-testrail'
|
24
|
+
```
|
25
|
+
|
26
|
+
### Usage
|
27
|
+
|
28
|
+
Create a Test Adaptor with the required configuration
|
29
|
+
|
30
|
+
```ruby
|
31
|
+
testrail_adaptor = TestRail::Adaptor.new(
|
32
|
+
enabled: flag, # Enable or Disable the TestRail runner(default: false)
|
33
|
+
url: url, # URL for custom TestRail Integration
|
34
|
+
username: username, # Authentication Username
|
35
|
+
password: password, # Authentication Password
|
36
|
+
project_id: project_id, # TestRail Project ID
|
37
|
+
suite_id: suite_id # TestRail Suite ID
|
38
|
+
)
|
39
|
+
```
|
40
|
+
|
41
|
+
When the test suite is ready, start a test run
|
42
|
+
|
43
|
+
```ruby
|
44
|
+
testrail_adaptor.start_test_run
|
45
|
+
```
|
46
|
+
|
47
|
+
As an example, a Cucumber test suite is used to send results to the adaptor
|
48
|
+
Each scenario is being sent using the **submit** method:
|
49
|
+
|
50
|
+
```ruby
|
51
|
+
After do |scenario|
|
52
|
+
...
|
53
|
+
testrail_adaptor.submit(scenario)
|
54
|
+
...
|
55
|
+
end
|
56
|
+
|
57
|
+
at_exit do
|
58
|
+
testrail_adaptor.end_test_run
|
59
|
+
end
|
60
|
+
```
|
61
|
+
|
62
|
+
At the end of the test suite the adaptor needs to be finished to send the results
|
63
|
+
to TestRail. This is done with the **end_test_run** method.
|
data/TESTRAIL_LICENSE.md
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
License
|
2
|
+
-------
|
3
|
+
|
4
|
+
Copyright (c) 2010-2014 Gurock Software GmbH
|
5
|
+
|
6
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
7
|
+
a copy of this software and associated documentation files (the
|
8
|
+
"Software"), to deal in the Software without restriction, including
|
9
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
10
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
11
|
+
permit persons to whom the Software is furnished to do so, subject to
|
12
|
+
the following conditions:
|
13
|
+
|
14
|
+
The above copyright notice and this permission notice shall be
|
15
|
+
included in all copies or substantial portions of the Software.
|
16
|
+
|
17
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
18
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
19
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
20
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
21
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
22
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
23
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
@@ -0,0 +1,45 @@
|
|
1
|
+
Feature: Test suite adaptor
|
2
|
+
|
3
|
+
Scenario: Start test run actually starts a test suite run
|
4
|
+
Given a Cucumber Adaptor
|
5
|
+
When a test run is started
|
6
|
+
Then the test suite starts a test run
|
7
|
+
|
8
|
+
Scenario: End test run finishes a successful run
|
9
|
+
Given a Cucumber Adaptor
|
10
|
+
And a test run is started
|
11
|
+
When the rest run is ended
|
12
|
+
Then the test suite submit the results
|
13
|
+
And the test suite is closed
|
14
|
+
|
15
|
+
Scenario: End test run doesn't close a run with failures
|
16
|
+
Given a Cucumber Adaptor
|
17
|
+
And a test run is started
|
18
|
+
And an invalid test result is submitted
|
19
|
+
When the rest run is ended
|
20
|
+
Then the test suite submit the results
|
21
|
+
And the test suite is not closed
|
22
|
+
|
23
|
+
Scenario: Disabled adaptor does not perform any operations
|
24
|
+
Given a disabled Cucumber Adaptor
|
25
|
+
And a test run is started
|
26
|
+
When the rest run is ended
|
27
|
+
Then no interactions are made to the test suite
|
28
|
+
|
29
|
+
Scenario Outline: Submit supports Cucumber scenarios types
|
30
|
+
Given a Cucumber Adaptor
|
31
|
+
And a test run is started
|
32
|
+
When a result of type "<Result Type>" is submitted
|
33
|
+
And the rest run is ended
|
34
|
+
Then the submitted results contains the provided details
|
35
|
+
Examples:
|
36
|
+
| Result Type |
|
37
|
+
| Cucumber Scenario Outline |
|
38
|
+
| Cucumber Simple Scenario |
|
39
|
+
|
40
|
+
Scenario: Submit supports RSpec examples
|
41
|
+
Given a RSpec Adaptor
|
42
|
+
And a test run is started
|
43
|
+
When a result of type "RSpec Example" is submitted
|
44
|
+
And the rest run is ended
|
45
|
+
Then the submitted results contains the provided details
|
@@ -0,0 +1,152 @@
|
|
1
|
+
# Copyright 2016 Findly Inc. NZ
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
def setup_adaptor(enabled: true, type: 'Cucumber')
|
16
|
+
@test_suite = spy('test_suite')
|
17
|
+
@enabled = enabled
|
18
|
+
options = {
|
19
|
+
enabled: @enabled,
|
20
|
+
url: 'fakeurl',
|
21
|
+
username: 'username',
|
22
|
+
password: 'password',
|
23
|
+
project_id: 'project_id',
|
24
|
+
suite_id: 'suite_id',
|
25
|
+
test_suite: @test_suite
|
26
|
+
}
|
27
|
+
@adaptor = case type
|
28
|
+
when 'RSpec'
|
29
|
+
TestRail::RSpecAdaptor.new(options)
|
30
|
+
else
|
31
|
+
TestRail::CucumberAdaptor.new(options)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def create_test_result(type, test_case_result: true)
|
36
|
+
result_class = double('result_class')
|
37
|
+
test_result = double('test_result')
|
38
|
+
|
39
|
+
@test_case_section = 'test_case_section'
|
40
|
+
@test_case_name = 'test_case_name'
|
41
|
+
@test_case_comment = 'test_case_comment'
|
42
|
+
|
43
|
+
case type
|
44
|
+
when 'Cucumber Scenario Outline'
|
45
|
+
class_name = 'Cucumber::RunningTestCase::ScenarioOutlineExample'
|
46
|
+
scenario_outline = double('scenario_outline')
|
47
|
+
feature = double('feature')
|
48
|
+
|
49
|
+
allow(test_result).to receive(:scenario_outline) { scenario_outline }
|
50
|
+
allow(test_result).to receive(:failed?) { !test_case_result }
|
51
|
+
allow(test_result).to receive(:exception) { @test_case_comment }
|
52
|
+
allow(scenario_outline).to receive(:feature) { feature }
|
53
|
+
allow(scenario_outline).to receive(:name) { @test_case_name }
|
54
|
+
allow(feature).to receive(:name) { @test_case_section }
|
55
|
+
when 'Cucumber Simple Scenario'
|
56
|
+
class_name = 'Cucumber::RunningTestCase::Scenario'
|
57
|
+
feature = double('feature')
|
58
|
+
|
59
|
+
allow(test_result).to receive(:feature) { feature }
|
60
|
+
allow(test_result).to receive(:name) { @test_case_name }
|
61
|
+
allow(test_result).to receive(:failed?) { !test_case_result }
|
62
|
+
allow(test_result).to receive(:exception) { @test_case_comment }
|
63
|
+
allow(feature).to receive(:name) { @test_case_section }
|
64
|
+
when 'RSpec Example'
|
65
|
+
example_group = double('example_group')
|
66
|
+
|
67
|
+
allow(test_result).to receive(:example_group) { example_group }
|
68
|
+
allow(test_result).to receive(:description) { @test_case_name }
|
69
|
+
if test_case_result
|
70
|
+
allow(test_result).to receive(:exception) { nil }
|
71
|
+
@test_case_comment = nil
|
72
|
+
else
|
73
|
+
allow(test_result).to receive(:exception) { @test_case_comment }
|
74
|
+
end
|
75
|
+
allow(example_group).to receive(:description) { @test_case_section }
|
76
|
+
end
|
77
|
+
|
78
|
+
unless result_class.nil?
|
79
|
+
allow(test_result).to receive(:class) { result_class }
|
80
|
+
allow(result_class).to receive(:name) { class_name }
|
81
|
+
end
|
82
|
+
test_result
|
83
|
+
end
|
84
|
+
|
85
|
+
Given(/^a Cucumber Adaptor$/) do
|
86
|
+
setup_adaptor
|
87
|
+
end
|
88
|
+
|
89
|
+
Given(/^a RSpec Adaptor$/) do
|
90
|
+
setup_adaptor(type: 'RSpec')
|
91
|
+
end
|
92
|
+
|
93
|
+
When(/^a test run is started$/) do
|
94
|
+
@test_run = spy('test_run')
|
95
|
+
allow(@test_suite).to receive(:start_test_run) { @test_run } if @enabled
|
96
|
+
@adaptor.start_test_run
|
97
|
+
end
|
98
|
+
|
99
|
+
Then(/^the test suite starts a test run$/) do
|
100
|
+
expect(@test_suite).to have_received(:start_test_run) if @enabled
|
101
|
+
end
|
102
|
+
|
103
|
+
When(/^the rest run is ended$/) do
|
104
|
+
if @enabled
|
105
|
+
@failure_count = @failure_count ||= 0
|
106
|
+
allow(@test_run).to receive(:submit_results)
|
107
|
+
allow(@test_run).to receive(:failure_count) { @failure_count }
|
108
|
+
end
|
109
|
+
@adaptor.end_test_run
|
110
|
+
end
|
111
|
+
|
112
|
+
Then(/^the test suite submit the results$/) do
|
113
|
+
expect(@test_run).to have_received(:submit_results)
|
114
|
+
end
|
115
|
+
|
116
|
+
Then(/^the test suite is closed$/) do
|
117
|
+
expect(@test_run).to have_received(:close)
|
118
|
+
end
|
119
|
+
|
120
|
+
Given(/^an invalid test result is submitted$/) do
|
121
|
+
@failure_count = 1
|
122
|
+
end
|
123
|
+
|
124
|
+
Then(/^the test suite is not closed$/) do
|
125
|
+
expect(@test_run).to_not have_received(:close)
|
126
|
+
end
|
127
|
+
|
128
|
+
Given(/^a disabled Cucumber Adaptor$/) do
|
129
|
+
setup_adaptor(enabled: false)
|
130
|
+
end
|
131
|
+
|
132
|
+
Then(/^no interactions are made to the test suite$/) do
|
133
|
+
expect(@test_run).to_not have_received(:submit_results)
|
134
|
+
expect(@test_run).to_not have_received(:failure_count)
|
135
|
+
expect(@test_run).to_not have_received(:close)
|
136
|
+
end
|
137
|
+
|
138
|
+
When(/^a result of type "([^"]*)" is submitted$/) do |result_type|
|
139
|
+
@test_result = create_test_result(result_type)
|
140
|
+
allow(@test_run).to receive(:add_test_result)
|
141
|
+
@adaptor.submit(@test_result)
|
142
|
+
end
|
143
|
+
|
144
|
+
Then(/^the submitted results contains the provided details/) do
|
145
|
+
expect(@test_run).to have_received(:submit_results)
|
146
|
+
expect(@test_run).to have_received(:add_test_result).with({
|
147
|
+
section_name: @test_case_section,
|
148
|
+
test_name: @test_case_name,
|
149
|
+
success: true,
|
150
|
+
comment: @test_case_comment
|
151
|
+
})
|
152
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# Copyright 2016 Findly Inc. NZ
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require 'require_all'
|
16
|
+
require 'rspec'
|
17
|
+
require 'rspec/core'
|
18
|
+
require 'rspec/expectations'
|
19
|
+
require 'rspec/mocks'
|
20
|
+
require 'rspec/support'
|
21
|
+
|
22
|
+
require_all('lib')
|
23
|
+
|
24
|
+
World(RSpec::Mocks::ExampleMethods)
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# Copyright 2016 Findly Inc. NZ
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
Before do
|
16
|
+
RSpec::Mocks.setup
|
17
|
+
end
|
18
|
+
|
19
|
+
After do
|
20
|
+
begin
|
21
|
+
RSpec::Mocks.verify
|
22
|
+
ensure
|
23
|
+
RSpec::Mocks.teardown
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# Copyright 2016 Findly Inc. NZ
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require 'testrail/api_client'
|
16
|
+
require 'testrail/testrail_client'
|
17
|
+
|
18
|
+
module TestRail
|
19
|
+
|
20
|
+
class Adaptor
|
21
|
+
|
22
|
+
def initialize(
|
23
|
+
enabled: true,
|
24
|
+
test_suite: nil,
|
25
|
+
url:,
|
26
|
+
username:,
|
27
|
+
password:,
|
28
|
+
project_id:,
|
29
|
+
suite_id:
|
30
|
+
)
|
31
|
+
@enabled = enabled
|
32
|
+
return unless @enabled
|
33
|
+
if test_suite.nil?
|
34
|
+
testrail_client = TestRail::APIClient.new(url)
|
35
|
+
testrail_client.user = username
|
36
|
+
testrail_client.password = password
|
37
|
+
@test_suite = TestRail::TestRailClient.new(testrail_client).get_suite(
|
38
|
+
project_id: project_id,
|
39
|
+
suite_id: suite_id
|
40
|
+
)
|
41
|
+
else
|
42
|
+
@test_suite = test_suite
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# A new test result is submitted to TestRails. The type of test depends on the Test Suite
|
47
|
+
# Each adaptor implementation should be able to determine the required information
|
48
|
+
# from the test provided as a parameter
|
49
|
+
def submit(_test)
|
50
|
+
raise 'submit should be overrided by Adaptor implementations'
|
51
|
+
end
|
52
|
+
|
53
|
+
# This method initiates a test run against a project, and specified testsuite.
|
54
|
+
# ruby functional test file (.rb) containing a range of test cases.
|
55
|
+
# Each test case (in the ruby functional test file) will have a corresponding Test Case in TestRail.
|
56
|
+
# These Test Rail test cases will belong to a test suite that has the title of the corresponding
|
57
|
+
# ruby functional test file.
|
58
|
+
def start_test_run
|
59
|
+
return unless @enabled
|
60
|
+
@test_run = @test_suite.start_test_run
|
61
|
+
end
|
62
|
+
|
63
|
+
# Checks to see if any of the tests in a particular test run have failed, if they have then the
|
64
|
+
# it will leave the run opened. If there are no failed tests then it will call close the particular run.
|
65
|
+
def end_test_run
|
66
|
+
return if !@enabled || @test_run.nil?
|
67
|
+
@test_run.submit_results
|
68
|
+
@test_run.close unless @test_run.failure_count > 0
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
@@ -0,0 +1,119 @@
|
|
1
|
+
#
|
2
|
+
# TestRail API binding for Ruby (API v2, available since TestRail 3.0)
|
3
|
+
#
|
4
|
+
# Learn more:
|
5
|
+
#
|
6
|
+
# http://docs.gurock.com/testrail-api2/start
|
7
|
+
# http://docs.gurock.com/testrail-api2/accessing
|
8
|
+
#
|
9
|
+
# Copyright Gurock Software GmbH. See TESTRAIL_LICENSE.md for details.
|
10
|
+
#
|
11
|
+
|
12
|
+
require 'net/http'
|
13
|
+
require 'net/https'
|
14
|
+
require 'uri'
|
15
|
+
require 'json'
|
16
|
+
|
17
|
+
module TestRail
|
18
|
+
|
19
|
+
class APIClient
|
20
|
+
|
21
|
+
@url = ''
|
22
|
+
@user = ''
|
23
|
+
@password = ''
|
24
|
+
|
25
|
+
attr_accessor :user
|
26
|
+
attr_accessor :password
|
27
|
+
|
28
|
+
def initialize(base_url)
|
29
|
+
base_url += base_url =~ %r{/$} ? '/' : ''
|
30
|
+
@url = base_url + 'index.php?/api/v2/'
|
31
|
+
end
|
32
|
+
|
33
|
+
#
|
34
|
+
# Send Get
|
35
|
+
#
|
36
|
+
# Issues a GET request (read) against the API and returns the result
|
37
|
+
# (as Ruby hash).
|
38
|
+
#
|
39
|
+
# Arguments:
|
40
|
+
#
|
41
|
+
# uri The API method to call including parameters
|
42
|
+
# (e.g. get_case/1)
|
43
|
+
#
|
44
|
+
def send_get(uri)
|
45
|
+
_send_request('GET', uri, nil)
|
46
|
+
end
|
47
|
+
|
48
|
+
#
|
49
|
+
# Send POST
|
50
|
+
#
|
51
|
+
# Issues a POST request (write) against the API and returns the result
|
52
|
+
# (as Ruby hash).
|
53
|
+
#
|
54
|
+
# Arguments:
|
55
|
+
#
|
56
|
+
# uri The API method to call including parameters
|
57
|
+
# (e.g. add_case/1)
|
58
|
+
# data The data to submit as part of the request (as
|
59
|
+
# Ruby hash, strings must be UTF-8 encoded)
|
60
|
+
#
|
61
|
+
def send_post(uri, data)
|
62
|
+
_send_request('POST', uri, data)
|
63
|
+
end
|
64
|
+
|
65
|
+
private
|
66
|
+
|
67
|
+
def _secure_channel(conn, url)
|
68
|
+
return unless url.scheme == 'https'
|
69
|
+
conn.use_ssl = true
|
70
|
+
conn.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
71
|
+
end
|
72
|
+
|
73
|
+
def _get_result(response)
|
74
|
+
result = if response.body && !response.body.empty?
|
75
|
+
JSON.parse(response.body)
|
76
|
+
else
|
77
|
+
{}
|
78
|
+
end
|
79
|
+
result
|
80
|
+
end
|
81
|
+
|
82
|
+
def _send_request(method, uri, data)
|
83
|
+
url = URI.parse(@url + uri)
|
84
|
+
if method == 'POST'
|
85
|
+
request = Net::HTTP::Post.new(url.path + '?' + url.query)
|
86
|
+
request.body = JSON.dump(data)
|
87
|
+
else
|
88
|
+
request = Net::HTTP::Get.new(url.path + '?' + url.query)
|
89
|
+
end
|
90
|
+
|
91
|
+
request.basic_auth(@user, @password)
|
92
|
+
request.add_field('Content-Type', 'application/json')
|
93
|
+
|
94
|
+
conn = Net::HTTP.new(url.host, url.port)
|
95
|
+
_secure_channel(conn, url)
|
96
|
+
|
97
|
+
response = conn.request(request)
|
98
|
+
|
99
|
+
result = _get_result(response)
|
100
|
+
|
101
|
+
if response.code != '200'
|
102
|
+
error = if result && result.key?('error')
|
103
|
+
'"' + result['error'] + '"'
|
104
|
+
else
|
105
|
+
'No additional error message received'
|
106
|
+
end
|
107
|
+
raise APIError.new, "TestRail API returned HTTP #{response.code} (#{error})"
|
108
|
+
end
|
109
|
+
|
110
|
+
result
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
|
115
|
+
class APIError < StandardError
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# Copyright 2016 Findly Inc. NZ
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
module TestRail
|
16
|
+
|
17
|
+
class CucumberAdaptor < Adaptor
|
18
|
+
|
19
|
+
# Submits an scenario test results
|
20
|
+
# If the test case exists, it will reuse the id, otherwise it will create a new Test Case in TestRails
|
21
|
+
# @param scenario [Cucumber::RunningTestCase::ScenarioOutlineExample|Cucumber::RunningTestCase::Scenario]
|
22
|
+
# A test case scenario after execution
|
23
|
+
def submit(scenario)
|
24
|
+
return unless @enabled
|
25
|
+
case scenario.class.name
|
26
|
+
when 'Cucumber::RunningTestCase::ScenarioOutlineExample'
|
27
|
+
test_case_section = scenario.scenario_outline.feature.name.strip
|
28
|
+
test_case_name = scenario.scenario_outline.name.strip
|
29
|
+
test_result = !scenario.failed?
|
30
|
+
test_comment = scenario.exception
|
31
|
+
when 'Cucumber::RunningTestCase::Scenario'
|
32
|
+
test_case_section = scenario.feature.name.strip
|
33
|
+
test_case_name = scenario.name.strip
|
34
|
+
test_result = !scenario.failed?
|
35
|
+
test_comment = scenario.exception
|
36
|
+
end
|
37
|
+
|
38
|
+
@test_run.add_test_result(
|
39
|
+
section_name: test_case_section,
|
40
|
+
test_name: test_case_name,
|
41
|
+
success: test_result,
|
42
|
+
comment: test_comment)
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# Copyright 2016 Findly Inc. NZ
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
module TestRail
|
16
|
+
|
17
|
+
class RSpecAdaptor < Adaptor
|
18
|
+
|
19
|
+
# Submits an example test results
|
20
|
+
# If the test case exists, it will reuse the id, otherwise it will create a new Test Case in TestRails
|
21
|
+
# @param example [RSpec::Core::Example] A test case example after execution
|
22
|
+
def submit(example)
|
23
|
+
return unless @enabled
|
24
|
+
test_case_section = example.example_group.description.strip
|
25
|
+
test_case_name = example.description.strip
|
26
|
+
test_result = example.exception.nil?
|
27
|
+
test_comment = example.exception
|
28
|
+
|
29
|
+
@test_run.add_test_result(
|
30
|
+
section_name: test_case_section,
|
31
|
+
test_name: test_case_name,
|
32
|
+
success: test_result,
|
33
|
+
comment: test_comment)
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# Copyright 2016 Findly Inc. NZ
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require 'testrail/test_result'
|
16
|
+
|
17
|
+
module TestRail
|
18
|
+
|
19
|
+
class TestCase
|
20
|
+
|
21
|
+
attr_reader :id, :name, :section
|
22
|
+
|
23
|
+
def initialize(id:, name:, section:, testrail_client:)
|
24
|
+
raise(ArgumentError, 'test case id nil') if id.nil?
|
25
|
+
raise(ArgumentError, 'test case name nil') if name.nil?
|
26
|
+
@id = id
|
27
|
+
@name = name
|
28
|
+
@section = section
|
29
|
+
@testrail_client = testrail_client
|
30
|
+
end
|
31
|
+
|
32
|
+
def create_result(success:, comment:)
|
33
|
+
TestResult.new(test_case: self, success: success, comment: comment)
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# Copyright 2016 Findly Inc. NZ
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
module TestRail
|
16
|
+
|
17
|
+
class TestResult
|
18
|
+
|
19
|
+
STATUS_SUCCESS = 1
|
20
|
+
STATUS_ERROR = 5
|
21
|
+
|
22
|
+
attr_reader :comment
|
23
|
+
attr_reader :success
|
24
|
+
alias success? success
|
25
|
+
|
26
|
+
def initialize(test_case:, success:, comment:)
|
27
|
+
@test_case = test_case
|
28
|
+
@success = success
|
29
|
+
@comment = comment
|
30
|
+
end
|
31
|
+
|
32
|
+
def status_id
|
33
|
+
success? ? STATUS_SUCCESS : STATUS_ERROR
|
34
|
+
end
|
35
|
+
|
36
|
+
def to_hash
|
37
|
+
{
|
38
|
+
'case_id': @test_case.id,
|
39
|
+
'status_id': status_id,
|
40
|
+
'comment': comment
|
41
|
+
}
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# Copyright 2016 Findly Inc. NZ
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
module TestRail
|
16
|
+
|
17
|
+
class TestRun
|
18
|
+
|
19
|
+
def initialize(suite:, id:)
|
20
|
+
@suite = suite
|
21
|
+
@id = id
|
22
|
+
@results = []
|
23
|
+
end
|
24
|
+
|
25
|
+
def add_test_result(section_name:, test_name:, success:, comment: nil)
|
26
|
+
@results << @suite
|
27
|
+
.get_or_create_section(section_name)
|
28
|
+
.get_or_create_test_case(test_name)
|
29
|
+
.create_result(success: success, comment: comment)
|
30
|
+
end
|
31
|
+
|
32
|
+
def submit_results
|
33
|
+
@suite.submit_test_results(run_id: @id, results: @results)
|
34
|
+
end
|
35
|
+
|
36
|
+
def close
|
37
|
+
@suite.close_test_run(@id)
|
38
|
+
end
|
39
|
+
|
40
|
+
def failure_count
|
41
|
+
@results.count { |r| !r.success? }
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# Copyright 2016 Findly Inc. NZ
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
module TestRail
|
16
|
+
|
17
|
+
class TestSection
|
18
|
+
|
19
|
+
attr_reader :id, :name
|
20
|
+
|
21
|
+
def initialize(id:, name:, test_suite:)
|
22
|
+
raise(ArgumentError, 'section id nil') if id.nil?
|
23
|
+
raise(ArgumentError, 'section name nil') if name.nil?
|
24
|
+
@id = id
|
25
|
+
@name = name
|
26
|
+
@test_suite = test_suite
|
27
|
+
end
|
28
|
+
|
29
|
+
def get_or_create_test_case(name)
|
30
|
+
@test_suite.get_or_create_test_case(section_id: @id, name: name)
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
# Copyright 2016 Findly Inc. NZ
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require 'testrail/test_run'
|
16
|
+
require 'testrail/test_section'
|
17
|
+
require 'testrail/test_case'
|
18
|
+
|
19
|
+
module TestRail
|
20
|
+
|
21
|
+
class TestSuite
|
22
|
+
|
23
|
+
def initialize(project_id:, suite_id:, testrail_client:)
|
24
|
+
@project_id = project_id
|
25
|
+
@suite_id = suite_id
|
26
|
+
@testrail_client = testrail_client
|
27
|
+
sections = testrail_client.get_sections(project_id: project_id, suite_id: suite_id)
|
28
|
+
.map { |s| new_test_section(s) }
|
29
|
+
@sections_by_name = Hash[sections.map { |s| [s.name, s] }]
|
30
|
+
@sections_by_id = Hash[sections.map { |s| [s.id, s] }]
|
31
|
+
@test_cases = Hash[testrail_client.get_test_cases(project_id: project_id, suite_id: suite_id)
|
32
|
+
.lazy
|
33
|
+
.map { |t| new_test_case(t) }
|
34
|
+
.map { |t| [test_case_key(t.section.id, t.name), t] }
|
35
|
+
.to_a]
|
36
|
+
end
|
37
|
+
|
38
|
+
def start_test_run
|
39
|
+
run = @testrail_client.start_test_run(project_id: @project_id, suite_id: @suite_id)
|
40
|
+
TestRun.new(suite: self, id: run['id'])
|
41
|
+
end
|
42
|
+
|
43
|
+
def submit_test_results(run_id:, results:)
|
44
|
+
@testrail_client.submit_test_results(run_id: run_id, results: results.map(&:to_hash))
|
45
|
+
end
|
46
|
+
|
47
|
+
def close_test_run(run_id)
|
48
|
+
@testrail_client.close_test_run(run_id)
|
49
|
+
end
|
50
|
+
|
51
|
+
def get_or_create_section(section_name)
|
52
|
+
@sections_by_name[section_name] || create_section(section_name)
|
53
|
+
end
|
54
|
+
|
55
|
+
def get_or_create_test_case(section_id:, name:)
|
56
|
+
@test_cases[test_case_key(section_id, name)] || create_test_case(section_id: section_id, name: name)
|
57
|
+
end
|
58
|
+
|
59
|
+
def create_section(section_name)
|
60
|
+
section = new_test_section(@testrail_client.create_section(
|
61
|
+
project_id: @project_id,
|
62
|
+
suite_id: @suite_id,
|
63
|
+
section_name: section_name))
|
64
|
+
@sections_by_name[section_name] = section
|
65
|
+
@sections_by_id[section.id] = section
|
66
|
+
end
|
67
|
+
|
68
|
+
def create_test_case(section_id:, name:)
|
69
|
+
test_case = new_test_case(@testrail_client.create_test_case(
|
70
|
+
section_id: section_id,
|
71
|
+
name: name))
|
72
|
+
@test_cases[test_case_key(test_case.section.id, test_case.name)] = test_case
|
73
|
+
end
|
74
|
+
|
75
|
+
private
|
76
|
+
|
77
|
+
def test_case_key(section_id, name)
|
78
|
+
{ s: section_id, n: name }
|
79
|
+
end
|
80
|
+
|
81
|
+
def new_test_section(section)
|
82
|
+
TestSection.new(
|
83
|
+
id: section['id'],
|
84
|
+
name: section['name'],
|
85
|
+
test_suite: self)
|
86
|
+
end
|
87
|
+
|
88
|
+
def new_test_case(test_case)
|
89
|
+
TestCase.new(
|
90
|
+
id: test_case['id'],
|
91
|
+
name: test_case['title'],
|
92
|
+
section: @sections_by_id[test_case['section_id']],
|
93
|
+
testrail_client: @testrail_client)
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# Copyright 2016 Findly Inc. NZ
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require 'testrail/test_suite'
|
16
|
+
|
17
|
+
module TestRail
|
18
|
+
|
19
|
+
class TestRailClient
|
20
|
+
|
21
|
+
def initialize(testrail_http_client)
|
22
|
+
@testrail_http_client = testrail_http_client
|
23
|
+
end
|
24
|
+
|
25
|
+
def get_suite(project_id:, suite_id:)
|
26
|
+
TestSuite.new(
|
27
|
+
project_id: project_id,
|
28
|
+
suite_id: suite_id,
|
29
|
+
testrail_client: self)
|
30
|
+
end
|
31
|
+
|
32
|
+
def start_test_run(project_id:, suite_id:)
|
33
|
+
@testrail_http_client.send_post("add_run/#{project_id}",
|
34
|
+
suite_id: suite_id)
|
35
|
+
end
|
36
|
+
|
37
|
+
def close_test_run(run_id)
|
38
|
+
@testrail_http_client.send_post("close_run/#{run_id}", {})
|
39
|
+
end
|
40
|
+
|
41
|
+
def create_test_case(section_id:, name:)
|
42
|
+
@testrail_http_client.send_post("add_case/#{section_id}",
|
43
|
+
title: name)
|
44
|
+
end
|
45
|
+
|
46
|
+
def create_section(project_id:, suite_id:, section_name:)
|
47
|
+
@testrail_http_client.send_post("add_section/#{project_id}",
|
48
|
+
suite_id: suite_id,
|
49
|
+
name: section_name)
|
50
|
+
end
|
51
|
+
|
52
|
+
def get_sections(project_id:, suite_id:)
|
53
|
+
@testrail_http_client.send_get("get_sections/#{project_id}\&suite_id=#{suite_id}")
|
54
|
+
end
|
55
|
+
|
56
|
+
def get_test_cases(project_id:, suite_id:)
|
57
|
+
@testrail_http_client.send_get("get_cases/#{project_id}&suite_id=#{suite_id}")
|
58
|
+
end
|
59
|
+
|
60
|
+
def submit_test_result(run_id:, test_case_id:, status_id:, comment: nil)
|
61
|
+
@testrail_http_client.send_post("add_result_for_case/#{run_id}/#{test_case_id}",
|
62
|
+
status_id: status_id,
|
63
|
+
comment: comment)
|
64
|
+
end
|
65
|
+
|
66
|
+
def submit_test_results(run_id:, results:)
|
67
|
+
@testrail_http_client.send_post("add_results_for_cases/#{run_id}", { results: results })
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
Gem::Specification.new do |spec|
|
2
|
+
spec.name = 'ruby-testrail'
|
3
|
+
spec.version = '1.1.0'
|
4
|
+
spec.date = '2016-04-26'
|
5
|
+
spec.summary = 'Ruby TestRail integration with RSpec and Cucumber Test Suites'
|
6
|
+
spec.description = 'Library to integrate Test Suite with TestRail'
|
7
|
+
spec.authors = ['Javier Durante', 'Will Gauvin', 'Nathan Jones']
|
8
|
+
spec.email = 'mercury@findly.com'
|
9
|
+
spec.license = 'Apache-2.0'
|
10
|
+
spec.files = `git ls-files`.split("\n").reject {|path| path =~ /\.gitignore$/ }
|
11
|
+
spec.homepage = 'https://github.com/Findly-Inc/ruby-testrail'
|
12
|
+
spec.add_development_dependency 'rspec', '>= 3.0'
|
13
|
+
spec.add_development_dependency 'pry'
|
14
|
+
spec.add_development_dependency 'rspec-core'
|
15
|
+
spec.add_development_dependency 'rspec-expectations'
|
16
|
+
spec.add_development_dependency 'rspec-mocks'
|
17
|
+
spec.add_development_dependency 'rspec-support'
|
18
|
+
spec.add_development_dependency 'require_all'
|
19
|
+
end
|
metadata
ADDED
@@ -0,0 +1,164 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ruby-testrail
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Javier Durante
|
8
|
+
- Will Gauvin
|
9
|
+
- Nathan Jones
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2016-04-26 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: rspec
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '3.0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
requirements:
|
26
|
+
- - ! '>='
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
version: '3.0'
|
29
|
+
- !ruby/object:Gem::Dependency
|
30
|
+
name: pry
|
31
|
+
requirement: !ruby/object:Gem::Requirement
|
32
|
+
requirements:
|
33
|
+
- - ! '>='
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: '0'
|
36
|
+
type: :development
|
37
|
+
prerelease: false
|
38
|
+
version_requirements: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - ! '>='
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '0'
|
43
|
+
- !ruby/object:Gem::Dependency
|
44
|
+
name: rspec-core
|
45
|
+
requirement: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - ! '>='
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '0'
|
50
|
+
type: :development
|
51
|
+
prerelease: false
|
52
|
+
version_requirements: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - ! '>='
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
57
|
+
- !ruby/object:Gem::Dependency
|
58
|
+
name: rspec-expectations
|
59
|
+
requirement: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ! '>='
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '0'
|
64
|
+
type: :development
|
65
|
+
prerelease: false
|
66
|
+
version_requirements: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - ! '>='
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
71
|
+
- !ruby/object:Gem::Dependency
|
72
|
+
name: rspec-mocks
|
73
|
+
requirement: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
type: :development
|
79
|
+
prerelease: false
|
80
|
+
version_requirements: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - ! '>='
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: '0'
|
85
|
+
- !ruby/object:Gem::Dependency
|
86
|
+
name: rspec-support
|
87
|
+
requirement: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- - ! '>='
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '0'
|
92
|
+
type: :development
|
93
|
+
prerelease: false
|
94
|
+
version_requirements: !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - ! '>='
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '0'
|
99
|
+
- !ruby/object:Gem::Dependency
|
100
|
+
name: require_all
|
101
|
+
requirement: !ruby/object:Gem::Requirement
|
102
|
+
requirements:
|
103
|
+
- - ! '>='
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: '0'
|
106
|
+
type: :development
|
107
|
+
prerelease: false
|
108
|
+
version_requirements: !ruby/object:Gem::Requirement
|
109
|
+
requirements:
|
110
|
+
- - ! '>='
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: '0'
|
113
|
+
description: Library to integrate Test Suite with TestRail
|
114
|
+
email: mercury@findly.com
|
115
|
+
executables: []
|
116
|
+
extensions: []
|
117
|
+
extra_rdoc_files: []
|
118
|
+
files:
|
119
|
+
- .rubocop.yml
|
120
|
+
- .travis.yml
|
121
|
+
- Gemfile
|
122
|
+
- LICENSE.md
|
123
|
+
- README.md
|
124
|
+
- TESTRAIL_LICENSE.md
|
125
|
+
- features/docs/testrail/adaptor.feature
|
126
|
+
- features/lib/step_definitions/testrail/adaptor.rb
|
127
|
+
- features/lib/support/env.rb
|
128
|
+
- features/lib/support/hooks.rb
|
129
|
+
- lib/testrail/adaptor.rb
|
130
|
+
- lib/testrail/api_client.rb
|
131
|
+
- lib/testrail/cucumber_adaptor.rb
|
132
|
+
- lib/testrail/rspec_adaptor.rb
|
133
|
+
- lib/testrail/test_case.rb
|
134
|
+
- lib/testrail/test_result.rb
|
135
|
+
- lib/testrail/test_run.rb
|
136
|
+
- lib/testrail/test_section.rb
|
137
|
+
- lib/testrail/test_suite.rb
|
138
|
+
- lib/testrail/testrail_client.rb
|
139
|
+
- ruby-testrail.gemspec
|
140
|
+
homepage: https://github.com/Findly-Inc/ruby-testrail
|
141
|
+
licenses:
|
142
|
+
- Apache-2.0
|
143
|
+
metadata: {}
|
144
|
+
post_install_message:
|
145
|
+
rdoc_options: []
|
146
|
+
require_paths:
|
147
|
+
- lib
|
148
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ! '>='
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
154
|
+
requirements:
|
155
|
+
- - ! '>='
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: '0'
|
158
|
+
requirements: []
|
159
|
+
rubyforge_project:
|
160
|
+
rubygems_version: 2.4.5
|
161
|
+
signing_key:
|
162
|
+
specification_version: 4
|
163
|
+
summary: Ruby TestRail integration with RSpec and Cucumber Test Suites
|
164
|
+
test_files: []
|