Like a lot of modern, data driven sites, WordPress.com uses A/B testing extensively to introduce new features. These tests may be as simple as a label change or as complex as changing the entire sign up flow, for example by offering a free trial.
Since I have been working on a set of automated end-to-end tests for WordPress.com, I have found A/B testing to be problematic for automated testing on this very fast moving codebase, namely:
- Automated tests need to be deterministic: having a randomised experiment as an A/B test means the first test run may get an entirely different sign up flow than a second test run which is very hard to automate; and
- Automated tests need to know which experiments are running otherwise they may encounter unexpected behaviour randomly.
What we need is two methods to deal with A/B tests when running automated tests:
- We need to be able to see which A/B tests are active and compare this to a known list of expected A/B tests – so that we don’t suddenly encounter some unexpected/random behaviour for some of our test runs
- We need to be able to set the desired behaviour to the control group so that are our tests are deterministic.
Different sites conduct A/B testing using different tools and approaches, WordPress.com uses HTML5 local storage to set which A/B tests are active and which group the user belongs to.
Luckily it’s easy to read and update local storage using WebDriver and JavaScript. This means our approach is to:
- Each time a page object is initialised, there is a call on the base page model that checks the A/B tests that are active using something like
return window.localStorage.ABTests;
and then compares this to the known list of A/B tests which are checked in as a config item. This fails the test if there’s a new A/B test introduced that isn’t in the list of known tests. This is better than not knowing about the A/B test and failing based upon some non-deterministic behaviour. - When a new A/B test is introduced and we wish to ensure our automated tests always use the control group, we can set this using a similar method
window.localStorage.setItem('ABTests','{"flow":"default"}');
and refresh the page.
Ideally it would be good to know and plan every A/B test for our automated e2e tests, but since this isn’t possible, checking against known A/B tests and ensuring control groups are set means our automated tests are at least more consistent and deterministic, and fail a lot faster and more consistently when a new A/B test has been introduced.
How do you deal with non-determinism with A/B tests?
One reply on “Running Automated Tests with A/B Testing”
Nice post. I had to deal with this before, and took on similar solution using our company’s A/B test framework. We used a cookie instead of local storage. And we also had to specifically test both A & B cases, not just stick with the control flow (e.g. A). So in some tests we set to new flow to test new features being A/B tested, while the rest of the tests default in control flow.
I blogged about this a while back, might be a good read for you and other readers (the post and subsequent comments there): https://autumnator.wordpress.com/2014/09/12/ab-testing-and-selenium-automation/