dat-science 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +13 -12
- data/dat-science.gemspec +1 -1
- data/lib/dat/science/experiment.rb +3 -0
- data/test/dat_science_experiment_test.rb +2 -0
- metadata +1 -1
data/README.md
CHANGED
@@ -115,8 +115,8 @@ By default the results of an experiment are discarded. This isn't very useful.
|
|
115
115
|
`Experiment#publish` can be overridden to publish results via any
|
116
116
|
instrumentation mechansim, which makes it easy to graph durations or
|
117
117
|
matches/mismatches and store results. The only two events published by an
|
118
|
-
experiment are
|
119
|
-
are the same, and
|
118
|
+
experiment are `:match` when the result of the control and candidate behaviors
|
119
|
+
are the same, and `:mismatch` when they aren't.
|
120
120
|
|
121
121
|
```ruby
|
122
122
|
def publish(event, payload)
|
@@ -129,6 +129,8 @@ The published `payload` is a Symbol-keyed Hash:
|
|
129
129
|
```ruby
|
130
130
|
{
|
131
131
|
:experiment => "widget-permissions",
|
132
|
+
:first => :control,
|
133
|
+
:timestamp => <a-Time-instance>,
|
132
134
|
|
133
135
|
:candidate => {
|
134
136
|
:duration => 2.5,
|
@@ -140,32 +142,31 @@ The published `payload` is a Symbol-keyed Hash:
|
|
140
142
|
:duration => 25.0,
|
141
143
|
:exception => nil,
|
142
144
|
:value => 24
|
143
|
-
}
|
144
|
-
|
145
|
-
:first => :control
|
145
|
+
}
|
146
146
|
}
|
147
147
|
```
|
148
148
|
|
149
|
+
`:experiment` is the name of the experiment. `:first` is either `:candidate` or
|
150
|
+
`:control`, depending on which block was run first during the experiment.
|
151
|
+
`:timestamp` is the Time when the experiment started.
|
152
|
+
|
149
153
|
The `:candidate` and `:control` Hashes have the same keys:
|
150
154
|
|
151
155
|
* `:duration` is the execution in ms, expressed as a float.
|
152
156
|
* `:exception` is a reference to any raised exception or `nil`.
|
153
157
|
* `:value` is the result of the block.
|
154
158
|
|
155
|
-
`:first` is either `:candidate` or `:control`, depending on which block was run
|
156
|
-
first during the experiment. `:experiment` is the name of the experiment.
|
157
|
-
|
158
159
|
#### Adding context
|
159
160
|
|
160
161
|
It's often useful to add more information to your results, and
|
161
162
|
`Experiment#context` makes it easy:
|
162
163
|
|
163
164
|
```ruby
|
164
|
-
science "widget-permissions" do |
|
165
|
-
|
165
|
+
science "widget-permissions" do |e|
|
166
|
+
e.context :user => user
|
166
167
|
|
167
|
-
|
168
|
-
|
168
|
+
e.control { model.check_user(user).valid? } # old way
|
169
|
+
e.candidate { user.can? :read, model } # new way
|
169
170
|
end
|
170
171
|
```
|
171
172
|
|
data/dat-science.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |gem|
|
2
2
|
gem.name = "dat-science"
|
3
|
-
gem.version = "1.
|
3
|
+
gem.version = "1.1.0"
|
4
4
|
gem.authors = ["John Barnette", "Rick Bradley"]
|
5
5
|
gem.email = ["jbarnette@github.com"]
|
6
6
|
gem.description = "Gradually test, measure, and track refactored code."
|
@@ -50,6 +50,8 @@ module Dat
|
|
50
50
|
def run
|
51
51
|
return run_control unless candidate? && enabled?
|
52
52
|
|
53
|
+
timestamp = Time.now
|
54
|
+
|
53
55
|
if control_runs_first?
|
54
56
|
control = observe_control
|
55
57
|
candidate = observe_candidate
|
@@ -59,6 +61,7 @@ module Dat
|
|
59
61
|
end
|
60
62
|
|
61
63
|
payload = {
|
64
|
+
:timestamp => timestamp,
|
62
65
|
:candidate => candidate.payload,
|
63
66
|
:control => control.payload,
|
64
67
|
:first => control_runs_first? ? :control : :candidate
|
@@ -106,6 +106,8 @@ class DatScienceExperimentTest < MiniTest::Unit::TestCase
|
|
106
106
|
assert_equal "foo", payload[:experiment]
|
107
107
|
assert_equal :control, payload[:first]
|
108
108
|
|
109
|
+
assert_in_delta Time.now.to_f, payload[:timestamp].to_f, 2.0
|
110
|
+
|
109
111
|
assert payload[:control][:duration]
|
110
112
|
assert_nil payload[:control][:exception]
|
111
113
|
assert_equal :foo, payload[:control][:value]
|