Иногда нам нужно протестировать новую функциональность в приложении. Посмотреть, как повлияет, например, новый дизайн на retention и DAU, понравится он пользователям, или нет. Для этого используются AB-тесты.
В упрощенном виде это выглядит так: на бэкенд-стороне администратор выставляет какой части пользователей показывать вариант A (новый дизайн), какой части — вариант B (старый дизайн). Клиент-сторона запрашивает у сервера, какой вариант, А или B, он должен показать. И далее обычной if- или switch- проверкой запускается нужный код.
К счастью для многих мобильных разработчиков, многофункциональный сервис Firebase предоставляет в числе прочего возможность AB-тестов.
Чтобы создать эксперимент, идем в консоль Firebase.
Заходим в нужный проект. Если у Вас еще нет проекта, создайте его.
Для наглядности, я буду добавлять эксперимент по изменению цвета UI-элемента в своем проекте секундомера.
Итак, слева, в разделе Grow выбираем пункт A/B Testing и жмем Create experiment->Remote config. Вводим название эксперимента, описание, выбираем наше приложение и вводим процент целевой аудитории

Жмем далее. Можно добавить не только два, но и больше вариантов. В моем случае хватит двух Добавляем параметр red_circle_enabled. Выставляем значение этого параметра для созданных вариантов:

Остается выбрать цели, по которым мы будем отслеживать результативность тестов:

Жмем Review и запускаем эксперимент.
Теперь нам нужно имплементировать A/B логику на клиенте.
В Codelabs есть хорошее описание как это сделать на Android
Все, что нам нужно, лежит в пакете com.google.firebase.remoteconfig, поэтому добавляем зависимость в build.gradle:
implementation 'com.google.firebase:firebase-config:15.0.0'
Затем инициализируем инстанс Remote Config там, где будет реализована логика A/B теста:
FirebaseRemoteConfig mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance();FirebaseRemoteConfigSettings firebaseRemoteConfigSettings =
new FirebaseRemoteConfigSettings.Builder()
.setDeveloperModeEnabled(true)
.build();
// Инициализируем данные по умолчанию
Map<String, Object> defaultConfigMap = new HashMap<>();
defaultConfigMap.put("red_circle_enabled", false);
firebaseRemoteConfig.setConfigSettings(firebaseRemoteConfigSettings);
firebaseRemoteConfig.setDefaults(defaultConfigMap);
fetchConfig();
Метод fetchConfig запрашивает конфигурационные данные у Firebase
public void fetchConfig() {
long cacheExpiration = 3600;
if (firebaseRemoteConfig.getInfo().getConfigSettings()
.isDeveloperModeEnabled()) {
cacheExpiration = 0;
}
firebaseRemoteConfig.fetch(cacheExpiration)
.addOnSuccessListener(aVoid -> {
firebaseRemoteConfig.activateFetched();
applyRedCircleTest();
})
.addOnFailureListener(e -> {
Log.w(TAG, "Error fetching config: " +
e.getMessage());
applyRedCircleTest();
});
}
Метод applyRedCircleTest непосредственно реализует логику в зависимости от полученного значения A/B теста
private void applyRedCircleTest() {
Boolean redCircleEnabled = firebaseRemoteConfig.getBoolean(Constants.AB_TEST_RED_CIRCLE);
circleStrokeTextView.setRedCircleEnabled(redCircleEnabled.booleanValue());
}
Вот мы и добавили A/B тест в приложение за 15 минут с помощью Firebase!