Skip to content

Commit c3fa2b5

Browse files
committed
Adding Benchmarking test suite
1 parent 64eb79f commit c3fa2b5

File tree

4 files changed

+3600
-1
lines changed

4 files changed

+3600
-1
lines changed

optimizely/optimizely.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ def track(self, event_key, user_id, attributes=None, event_value=None):
142142
self.logger.log(enums.LogLevels.INFO, 'Not tracking user "%s" for event "%s".' % (user_id, event_key))
143143
return
144144

145-
# filter out experiments that are not running or that do not include the user in audience conditions
145+
# Filter out experiments that are not running or that do not include the user in audience conditions
146146
valid_experiments = []
147147
for experiment_id in experiment_ids:
148148
experiment_key = self.config.get_experiment_key(experiment_id)

requirements/test.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ mock==1.3.0
44
nose==1.3.7
55
pep8==1.7.0
66
python-coveralls==2.7.0
7+
tabulate==0.7.5
Lines changed: 222 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,222 @@
1+
import json
2+
import time
3+
from tabulate import tabulate
4+
5+
from optimizely import optimizely
6+
7+
import data
8+
9+
10+
ITERATIONS = 10
11+
12+
13+
class BenchmarkingTests(object):
14+
15+
def create_object(self, datafile):
16+
start_time = time.clock()
17+
optimizely.Optimizely(json.dumps(datafile))
18+
end_time = time.clock()
19+
return (end_time - start_time)
20+
21+
def create_object_schema_validation_off(self, datafile):
22+
start_time = time.clock()
23+
optimizely.Optimizely(json.dumps(datafile), skip_json_validation=True)
24+
end_time = time.clock()
25+
return (end_time - start_time)
26+
27+
def activate_with_no_attributes(self, optimizely_obj, user_id):
28+
start_time = time.clock()
29+
variation_key = optimizely_obj.activate('testExperiment2', user_id)
30+
end_time = time.clock()
31+
assert variation_key == 'control'
32+
return (end_time - start_time)
33+
34+
def activate_with_attributes(self, optimizely_obj, user_id):
35+
start_time = time.clock()
36+
variation_key = optimizely_obj.activate('testExperimentWithFirefoxAudience',
37+
user_id, attributes={'browser_type': 'firefox'})
38+
end_time = time.clock()
39+
assert variation_key == 'variation'
40+
return (end_time - start_time)
41+
42+
def activate_with_forced_variation(self, optimizely_obj, user_id):
43+
start_time = time.clock()
44+
variation_key = optimizely_obj.activate('testExperiment2', user_id)
45+
end_time = time.clock()
46+
assert variation_key == 'variation'
47+
return (end_time - start_time)
48+
49+
def activate_grouped_experiment_no_attributes(self, optimizely_obj, user_id):
50+
start_time = time.clock()
51+
variation_key = optimizely_obj.activate('mutex_exp2', user_id)
52+
end_time = time.clock()
53+
assert variation_key == 'b'
54+
return (end_time - start_time)
55+
56+
def activate_grouped_experiment_with_attributes(self, optimizely_obj, user_id):
57+
start_time = time.clock()
58+
variation_key = optimizely_obj.activate('mutex_exp1', user_id, attributes={'browser_type': 'chrome'})
59+
end_time = time.clock()
60+
assert variation_key == 'a'
61+
return (end_time - start_time)
62+
63+
def get_variation_with_no_attributes(self, optimizely_obj, user_id):
64+
start_time = time.clock()
65+
variation_key = optimizely_obj.get_variation('testExperiment2', user_id)
66+
end_time = time.clock()
67+
assert variation_key == 'control'
68+
return (end_time - start_time)
69+
70+
def get_variation_with_attributes(self, optimizely_obj, user_id):
71+
start_time = time.clock()
72+
variation_key = optimizely_obj.get_variation('testExperimentWithFirefoxAudience',
73+
user_id, attributes={'browser_type': 'firefox'})
74+
end_time = time.clock()
75+
assert variation_key == 'variation'
76+
return (end_time - start_time)
77+
78+
def get_variation_with_forced_variation(self, optimizely_obj, user_id):
79+
start_time = time.clock()
80+
variation_key = optimizely_obj.get_variation('testExperiment2', user_id)
81+
end_time = time.clock()
82+
assert variation_key == 'variation'
83+
return (end_time - start_time)
84+
85+
def get_variation_grouped_experiment_no_attributes(self, optimizely_obj, user_id):
86+
start_time = time.clock()
87+
variation_key = optimizely_obj.get_variation('mutex_exp2', user_id)
88+
end_time = time.clock()
89+
assert variation_key == 'b'
90+
return (end_time - start_time)
91+
92+
def get_variation_grouped_experiment_with_attributes(self, optimizely_obj, user_id):
93+
start_time = time.clock()
94+
variation_key = optimizely_obj.get_variation('mutex_exp1', user_id, attributes={'browser_type': 'chrome'})
95+
end_time = time.clock()
96+
assert variation_key == 'a'
97+
return (end_time - start_time)
98+
99+
def track_with_attributes(self, optimizely_obj, user_id):
100+
start_time = time.clock()
101+
optimizely_obj.track('testEventWithAudiences', user_id, attributes={'browser_type': 'firefox'})
102+
end_time = time.clock()
103+
return (end_time - start_time)
104+
105+
def track_with_revenue(self, optimizely_obj, user_id):
106+
start_time = time.clock()
107+
optimizely_obj.track('testEvent', user_id, event_value=666)
108+
end_time = time.clock()
109+
return (end_time - start_time)
110+
111+
def track_with_attributes_and_revenue(self, optimizely_obj, user_id):
112+
start_time = time.clock()
113+
optimizely_obj.track('testEventWithAudiences', user_id,
114+
attributes={'browser_type': 'firefox'}, event_value=666)
115+
end_time = time.clock()
116+
return (end_time - start_time)
117+
118+
def track_no_attributes_no_revenue(self, optimizely_obj, user_id):
119+
start_time = time.clock()
120+
optimizely_obj.track('testEvent', user_id)
121+
end_time = time.clock()
122+
return (end_time - start_time)
123+
124+
def track_grouped_experiment(self, optimizely_obj, user_id):
125+
start_time = time.clock()
126+
optimizely_obj.track('testEventWithMultipleGroupedExperiments', user_id)
127+
end_time = time.clock()
128+
return (end_time - start_time)
129+
130+
def track_grouped_experiment_with_attributes(self, optimizely_obj, user_id):
131+
start_time = time.clock()
132+
optimizely_obj.track('testEventWithMultipleExperiments', user_id, attributes={'browser_type': 'chrome'})
133+
end_time = time.clock()
134+
return (end_time - start_time)
135+
136+
def track_grouped_experiment_with_revenue(self, optimizely_obj, user_id):
137+
start_time = time.clock()
138+
optimizely_obj.track('testEventWithMultipleGroupedExperiments', user_id, event_value=666)
139+
end_time = time.clock()
140+
return (end_time - start_time)
141+
142+
def track_grouped_experiment_with_attributes_and_revenue(self, optimizely_obj, user_id):
143+
start_time = time.clock()
144+
optimizely_obj.track('testEventWithMultipleExperiments', user_id,
145+
attributes={'browser_type': 'chrome'}, event_value=666)
146+
end_time = time.clock()
147+
return (end_time - start_time)
148+
149+
150+
def compute_average(values):
151+
""" Given a set of values compute the average.
152+
153+
Args:
154+
values: Set of values for which average is to be computed.
155+
156+
Returns:
157+
Average of all values.
158+
"""
159+
return float(sum(values))/len(values)
160+
161+
162+
def compute_median(values):
163+
""" Given a set of values compute the median.
164+
165+
Args:
166+
values: Set of values for which median is to be computed.
167+
168+
Returns:
169+
Median of all values.
170+
"""
171+
172+
sorted_values = sorted(values)
173+
num1 = (len(values) - 1) / 2
174+
num2 = len(values) / 2
175+
return float(sorted_values[num1] + sorted_values[num2])/2
176+
177+
178+
def display_results(results_average, results_median):
179+
""" Format and print results on screen.
180+
181+
Args:
182+
results_average: Dict holding averages.
183+
results_median: Dict holding medians.
184+
"""
185+
186+
table_data = []
187+
table_headers = ['Test Name',
188+
'10 Experiment Average', '10 Experiment Median',
189+
'25 Experiment Average', '25 Experiment Median',
190+
'50 Experiment Average', '50 Experiment Median']
191+
for test_name, test_method in BenchmarkingTests.__dict__.iteritems():
192+
if callable(test_method):
193+
row_data = [test_name]
194+
for experiment_count in sorted(data.datafiles.keys()):
195+
row_data.append(results_average.get(experiment_count).get(test_name))
196+
row_data.append(results_median.get(experiment_count).get(test_name))
197+
table_data.append(row_data)
198+
199+
print tabulate(table_data, headers=table_headers)
200+
201+
202+
def run_benchmarking_tests():
203+
all_test_results_average = {}
204+
all_test_results_median = {}
205+
test_data = data.test_data
206+
for experiment_count in data.datafiles:
207+
all_test_results_average[experiment_count] = {}
208+
all_test_results_median[experiment_count] = {}
209+
for test_name, test_method in BenchmarkingTests.__dict__.iteritems():
210+
if callable(test_method):
211+
values = []
212+
for i in xrange(ITERATIONS):
213+
values.append(1000 * test_method(BenchmarkingTests(), *test_data.get(test_name).get(experiment_count)))
214+
time_in_milliseconds_avg = compute_average(values)
215+
time_in_milliseconds_median = compute_median(values)
216+
all_test_results_average[experiment_count][test_name] = time_in_milliseconds_avg
217+
all_test_results_median[experiment_count][test_name] = time_in_milliseconds_median
218+
219+
display_results(all_test_results_average, all_test_results_median)
220+
221+
if __name__ == '__main__':
222+
run_benchmarking_tests()

0 commit comments

Comments
 (0)