govuk_ab_testing 2.4.2 → 2.4.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/dependabot.yml +10 -0
- data/.github/workflows/ci.yml +36 -0
- data/.ruby-version +1 -1
- data/CHANGELOG.md +5 -0
- data/README.md +96 -85
- data/govuk_ab_testing.gemspec +3 -2
- data/lib/govuk_ab_testing/ab_test.rb +1 -4
- data/lib/govuk_ab_testing/configuration.rb +8 -10
- data/lib/govuk_ab_testing/requested_variant.rb +8 -4
- data/lib/govuk_ab_testing/version.rb +1 -1
- metadata +11 -10
- data/Jenkinsfile +0 -7
- /data/{LICENSE.txt → LICENCE} +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6a292ccc01842df0545f9ddfeec92414895271e6127c1cd9905ea30a152f3f58
|
4
|
+
data.tar.gz: 75d28b74e22e0efa9137e7e033daebafd697012fd9f2f17a876fc40c4ef3e66c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0d88b6a20a1c3ffae1bc55abb2deba0cfeec443a12c8d0adad615475de3b889c3ec502bb8bdef5d49fff548cef4bc7bf56eaf826d11322d7a4a554dd8b92c9c2
|
7
|
+
data.tar.gz: e7d98c27fa20cde80ea0ddfbe28be2f9274a6a668257b2cc266387e0db12b1a374b1dbecff1826cceb1bfd9e8aa38386a243c7437bae3eb1d4b31a32b9112525
|
@@ -0,0 +1,36 @@
|
|
1
|
+
on: [push, pull_request]
|
2
|
+
|
3
|
+
jobs:
|
4
|
+
# This matrix job runs the test suite against multiple Ruby versions
|
5
|
+
test_matrix:
|
6
|
+
strategy:
|
7
|
+
fail-fast: false
|
8
|
+
matrix:
|
9
|
+
# Due to https://github.com/actions/runner/issues/849, we have to use quotes for '3.0'
|
10
|
+
ruby: ['3.0', 3.1, 3.2]
|
11
|
+
runs-on: ubuntu-latest
|
12
|
+
steps:
|
13
|
+
- uses: actions/checkout@v3
|
14
|
+
- uses: ruby/setup-ruby@v1
|
15
|
+
with:
|
16
|
+
ruby-version: ${{ matrix.ruby }}
|
17
|
+
bundler-cache: true
|
18
|
+
- run: bundle exec rake
|
19
|
+
|
20
|
+
# Branch protection rules cannot directly depend on status checks from matrix jobs.
|
21
|
+
# So instead we define `test` as a dummy job which only runs after the preceding `test_matrix` checks have passed.
|
22
|
+
# Solution inspired by: https://github.community/t/status-check-for-a-matrix-jobs/127354/3
|
23
|
+
test:
|
24
|
+
needs: test_matrix
|
25
|
+
runs-on: ubuntu-latest
|
26
|
+
steps:
|
27
|
+
- run: echo "All matrix tests have passed 🚀"
|
28
|
+
|
29
|
+
publish:
|
30
|
+
needs: test
|
31
|
+
if: ${{ github.ref == 'refs/heads/main' }}
|
32
|
+
permissions:
|
33
|
+
contents: write
|
34
|
+
uses: alphagov/govuk-infrastructure/.github/workflows/publish-rubygem.yml@main
|
35
|
+
secrets:
|
36
|
+
GEM_HOST_API_KEY: ${{ secrets.ALPHAGOV_RUBYGEMS_API_KEY }}
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
3.0.5
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -2,9 +2,7 @@
|
|
2
2
|
|
3
3
|
Gem to help with A/B testing on the GOV.UK platform.
|
4
4
|
|
5
|
-
##
|
6
|
-
|
7
|
-
### Installation
|
5
|
+
## Installation
|
8
6
|
|
9
7
|
Add this line to your application's Gemfile:
|
10
8
|
|
@@ -16,35 +14,27 @@ And then execute:
|
|
16
14
|
|
17
15
|
$ bundle
|
18
16
|
|
19
|
-
|
17
|
+
## Pre-requisites
|
20
18
|
|
21
19
|
Before starting this, you'll need to:
|
22
20
|
|
23
|
-
- [
|
24
|
-
-
|
21
|
+
- [Read the documentation](https://docs.publishing.service.gov.uk/manual/ab-testing.html) for an overview on how a/b testing works on GOV.UK.
|
22
|
+
- The cookie and header name in [govuk-cdn-config](https://github.com/alphagov/govuk-cdn-config/blob/master/ab_tests/ab_tests.yaml) must match the test name parameter that you pass to the Gem. The cookie name is case-sensitive.
|
25
23
|
|
26
|
-
|
24
|
+
## Usage
|
27
25
|
|
28
|
-
|
29
|
-
2. A HTML meta tag that will be used to measure the results, and which specifies
|
30
|
-
the dimension to use in Google Analytics
|
31
|
-
3. A response HTTP header that tells Fastly you're doing an A/B test
|
26
|
+
### Outline
|
32
27
|
|
33
|
-
|
34
|
-
supports both Capybara and ActiveSupport. In order to configure it, add this to
|
35
|
-
your test helper file:
|
28
|
+
To enable testing in the app, your Rails app needs:
|
36
29
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
```
|
30
|
+
1. [Some piece of logic to be A/B tested](#1-example-ab-test-logic)
|
31
|
+
2. [A response HTTP header that tells Fastly you're doing an A/B test](#2-http-response-header-to-fastly)
|
32
|
+
3. [A HTML meta tag that will be used to measure the results, and which specifies
|
33
|
+
the dimension to use in Google Analytics](#3-add-html-metatag-tags-to-your-layouts)
|
42
34
|
|
43
|
-
|
44
|
-
test cases. If we use ActiveSupport, the gem expects `@request` to be defined in
|
45
|
-
the scope of the test cases.
|
35
|
+
### 1. Example A/B test logic
|
46
36
|
|
47
|
-
|
37
|
+
Let's say you have this controller:
|
48
38
|
|
49
39
|
```ruby
|
50
40
|
# app/controllers/party_controller.rb
|
@@ -73,10 +63,15 @@ end
|
|
73
63
|
|
74
64
|
In this example, we are running a multivariate test with 3 options being
|
75
65
|
tested: the existing version (control), and two title changes. The minimum
|
76
|
-
number of variants in any test should be two.
|
66
|
+
number of variants in any test should be two.
|
67
|
+
|
68
|
+
### 2. HTTP response header to Fastly
|
69
|
+
|
70
|
+
The `configure_response` method used in the example in `step 1` sends the response header. The header helps Fastly to understand which variant was returned to the user and cache appropriately.
|
71
|
+
|
72
|
+
### 3. Add HTML metatag tags to your layouts
|
77
73
|
|
78
|
-
|
79
|
-
by the extension and analytics.
|
74
|
+
This is for the extension and analytics.
|
80
75
|
|
81
76
|
```html
|
82
77
|
<!-- application.html.erb -->
|
@@ -86,11 +81,76 @@ by the extension and analytics.
|
|
86
81
|
```
|
87
82
|
|
88
83
|
The analytics meta tag will include the allowed variants so the extension knows
|
89
|
-
which variants to suggest the user.
|
84
|
+
which variants to suggest to the user.
|
85
|
+
|
86
|
+
## Running the test suite for the gem
|
87
|
+
|
88
|
+
`bundle exec rake`
|
89
|
+
|
90
|
+
## Acceptance testing
|
91
|
+
|
92
|
+
Start by defining which acceptance testing framework you will use. This gem
|
93
|
+
supports both Capybara and ActiveSupport. In order to configure it, add this to
|
94
|
+
your test helper file:
|
95
|
+
|
96
|
+
```
|
97
|
+
GovukAbTesting.configure do |config|
|
98
|
+
config.acceptance_test_framework = :capybara # or :active_support
|
99
|
+
end
|
100
|
+
```
|
101
|
+
|
102
|
+
If we use capybara, the gem expects `page` to be defined in the scope of the
|
103
|
+
test cases. If we use ActiveSupport, the gem expects `@request` to be defined in
|
104
|
+
the scope of the test cases.
|
105
|
+
|
106
|
+
### Test helpers
|
107
|
+
|
108
|
+
#### RSpec
|
109
|
+
|
110
|
+
It is also possible to use `with_variant` and all the individual setup and
|
111
|
+
assertions steps in RSpec tests. Here is an example of a Capybara feature file:
|
112
|
+
|
113
|
+
```ruby
|
114
|
+
# spec/features/ab_testing_spec.rb
|
115
|
+
feature "Viewing a page with an A/B test" do
|
116
|
+
include GovukAbTesting::RspecHelpers
|
117
|
+
|
118
|
+
scenario "viewing the B version of the page" do
|
119
|
+
with_variant your_ab_test_name: 'B' do
|
120
|
+
visit root_path
|
121
|
+
|
122
|
+
expect(page).to have_breadcrumbs
|
123
|
+
expect(page).to have_beta_label
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
```
|
128
|
+
|
129
|
+
And here is an RSpec controller test:
|
130
|
+
|
131
|
+
```ruby
|
132
|
+
# spec/controllers/some_controller_spec.rb
|
133
|
+
describe SomeController, type :controller do
|
134
|
+
include GovukAbTesting::RspecHelpers
|
135
|
+
|
136
|
+
# RSpec doesn't render views for controller specs by default
|
137
|
+
render_views
|
90
138
|
|
91
|
-
|
139
|
+
it "should render the B version of the page" do
|
140
|
+
with_variant your_ab_test_name: 'B' do
|
141
|
+
get :index
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
```
|
92
146
|
|
93
|
-
|
147
|
+
As with the `minitest` version, you can also pass in the following options to
|
148
|
+
`with_variant`:
|
149
|
+
|
150
|
+
- `assert_meta_tag: false`
|
151
|
+
- `dimension: <number>`
|
152
|
+
|
153
|
+
#### Minitest
|
94
154
|
|
95
155
|
The most common usage of an A/B test is to serve two different variants of the
|
96
156
|
same page. In this situation, you can test the controller using `with_variant`.
|
@@ -169,71 +229,22 @@ class PartyControllerTest < ActionController::TestCase
|
|
169
229
|
end
|
170
230
|
```
|
171
231
|
|
172
|
-
|
232
|
+
## API documentation
|
173
233
|
|
174
|
-
|
175
|
-
assertions steps in RSpec tests. Here is an example of a Capybara feature file:
|
234
|
+
See [RubyDoc](http://www.rubydoc.info/gems/govuk_ab_testing) for documentation including all of the assertions for tests.
|
176
235
|
|
177
|
-
|
178
|
-
# spec/features/ab_testing_spec.rb
|
179
|
-
feature "Viewing a page with an A/B test" do
|
180
|
-
include GovukAbTesting::RspecHelpers
|
181
|
-
|
182
|
-
scenario "viewing the B version of the page" do
|
183
|
-
with_variant your_ab_test_name: 'B' do
|
184
|
-
visit root_path
|
185
|
-
|
186
|
-
expect(page).to have_breadcrumbs
|
187
|
-
expect(page).to have_beta_label
|
188
|
-
end
|
189
|
-
end
|
190
|
-
end
|
191
|
-
```
|
192
|
-
|
193
|
-
And here is an RSpec controller test:
|
194
|
-
|
195
|
-
```ruby
|
196
|
-
# spec/controllers/some_controller_spec.rb
|
197
|
-
describe SomeController, type :controller do
|
198
|
-
include GovukAbTesting::RspecHelpers
|
199
|
-
|
200
|
-
# RSpec doesn't render views for controller specs by default
|
201
|
-
render_views
|
202
|
-
|
203
|
-
it "should render the B version of the page" do
|
204
|
-
with_variant your_ab_test_name: 'B' do
|
205
|
-
get :index
|
206
|
-
end
|
207
|
-
end
|
208
|
-
end
|
209
|
-
```
|
210
|
-
|
211
|
-
As with the `minitest` version, you can also pass in the following options to
|
212
|
-
`with_variant`:
|
213
|
-
|
214
|
-
- `assert_meta_tag: false`
|
215
|
-
- `dimension: <number>`
|
216
|
-
|
217
|
-
### Running the test suite
|
236
|
+
To run a Yard server locally to preview documentation, run:
|
218
237
|
|
219
|
-
|
238
|
+
$ bundle exec yard server --reload
|
220
239
|
|
221
|
-
|
240
|
+
## Checking your A/B test in a browser
|
222
241
|
|
223
242
|
If you want to test this behaviour in a browser then you should use the
|
224
|
-
[GOV.UK Toolkit
|
243
|
+
[GOV.UK Toolkit browser extension](https://github.com/alphagov/govuk-browser-extension).
|
225
244
|
|
226
245
|
This detects when you have a test running on a page and enables you to choose
|
227
246
|
between variants.
|
228
247
|
|
229
|
-
### Documentation
|
230
|
-
|
231
|
-
See [RubyDoc](http://www.rubydoc.info/gems/govuk_ab_testing) for some limited documentation.
|
232
|
-
|
233
|
-
To run a Yard server locally to preview documentation, run:
|
234
|
-
|
235
|
-
$ bundle exec yard server --reload
|
236
|
-
|
237
248
|
## Licence
|
238
249
|
|
239
|
-
[MIT License](LICENCE
|
250
|
+
[MIT License](LICENCE)
|
data/govuk_ab_testing.gemspec
CHANGED
@@ -12,8 +12,9 @@ Gem::Specification.new do |spec|
|
|
12
12
|
spec.description = "Gem to help with A/B testing on the GOV.UK platform"
|
13
13
|
spec.homepage = "https://github.com/alphagov/govuk_ab_testing"
|
14
14
|
spec.license = "MIT"
|
15
|
+
spec.required_ruby_version = ">= 3.0"
|
15
16
|
|
16
|
-
spec.files
|
17
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
17
18
|
f.match(%r{^(test|spec|features)/})
|
18
19
|
end
|
19
20
|
spec.bindir = "exe"
|
@@ -22,6 +23,6 @@ Gem::Specification.new do |spec|
|
|
22
23
|
|
23
24
|
spec.add_development_dependency "rake"
|
24
25
|
spec.add_development_dependency "rspec"
|
25
|
-
spec.add_development_dependency "rubocop-govuk"
|
26
|
+
spec.add_development_dependency "rubocop-govuk", "4.10.0"
|
26
27
|
spec.add_development_dependency "yard"
|
27
28
|
end
|
@@ -1,9 +1,6 @@
|
|
1
1
|
module GovukAbTesting
|
2
2
|
class AbTest
|
3
|
-
attr_reader :ab_test_name
|
4
|
-
attr_reader :dimension
|
5
|
-
attr_reader :allowed_variants
|
6
|
-
attr_reader :control_variant
|
3
|
+
attr_reader :ab_test_name, :dimension, :allowed_variants, :control_variant
|
7
4
|
|
8
5
|
alias_method :name, :ab_test_name
|
9
6
|
|
@@ -21,16 +21,14 @@ module GovukAbTesting
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def framework_class
|
24
|
-
@framework_class ||=
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
end
|
33
|
-
end
|
24
|
+
@framework_class ||= case config[:acceptance_test_framework]
|
25
|
+
when :capybara
|
26
|
+
GovukAbTesting::AcceptanceTests::Capybara
|
27
|
+
when :active_support
|
28
|
+
GovukAbTesting::AcceptanceTests::ActiveSupport
|
29
|
+
else
|
30
|
+
raise "Invalid framework #{acceptance_test_framework}"
|
31
|
+
end
|
34
32
|
end
|
35
33
|
end
|
36
34
|
end
|
@@ -63,10 +63,14 @@ module GovukAbTesting
|
|
63
63
|
#
|
64
64
|
# @return [String]
|
65
65
|
def analytics_meta_tag
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
66
|
+
tag = <<~HTML
|
67
|
+
<meta name="govuk:ab-test"
|
68
|
+
content="#{ab_test.meta_tag_name}:#{variant_name}"
|
69
|
+
data-analytics-dimension="#{@dimension}"
|
70
|
+
data-allowed-variants="#{ab_test.allowed_variants.join(',')}">
|
71
|
+
HTML
|
72
|
+
|
73
|
+
tag.gsub(/\n/, "")
|
70
74
|
end
|
71
75
|
end
|
72
76
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: govuk_ab_testing
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.4.
|
4
|
+
version: 2.4.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- GOV.UK Dev
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-03-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -42,16 +42,16 @@ dependencies:
|
|
42
42
|
name: rubocop-govuk
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - '='
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 4.10.0
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - '='
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 4.10.0
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: yard
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -73,14 +73,15 @@ executables: []
|
|
73
73
|
extensions: []
|
74
74
|
extra_rdoc_files: []
|
75
75
|
files:
|
76
|
+
- ".github/dependabot.yml"
|
77
|
+
- ".github/workflows/ci.yml"
|
76
78
|
- ".gitignore"
|
77
79
|
- ".rspec"
|
78
80
|
- ".rubocop.yml"
|
79
81
|
- ".ruby-version"
|
80
82
|
- CHANGELOG.md
|
81
83
|
- Gemfile
|
82
|
-
-
|
83
|
-
- LICENSE.txt
|
84
|
+
- LICENCE
|
84
85
|
- README.md
|
85
86
|
- Rakefile
|
86
87
|
- bin/console
|
@@ -111,14 +112,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
111
112
|
requirements:
|
112
113
|
- - ">="
|
113
114
|
- !ruby/object:Gem::Version
|
114
|
-
version: '0'
|
115
|
+
version: '3.0'
|
115
116
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
116
117
|
requirements:
|
117
118
|
- - ">="
|
118
119
|
- !ruby/object:Gem::Version
|
119
120
|
version: '0'
|
120
121
|
requirements: []
|
121
|
-
rubygems_version: 3.
|
122
|
+
rubygems_version: 3.4.9
|
122
123
|
signing_key:
|
123
124
|
specification_version: 4
|
124
125
|
summary: Gem to help with A/B testing on the GOV.UK platform
|
data/Jenkinsfile
DELETED
/data/{LICENSE.txt → LICENCE}
RENAMED
File without changes
|