OpisDescription
Moduł ABTesting pozwala na przeprowadzanie eksperymentów A/B z deterministycznym przypisywaniem użytkowników do wariantów, śledzeniem konwersji i integracjąThe ABTesting module enables A/B experiments with deterministic user assignment to variants, conversion tracking, and integration z Remote Config oraz Analytics.
Definiowanie eksperymentuDefining an Experiment
// Prosty eksperyment
ADict.ABTesting.experiment("checkout_flow") {
variant("control", weight = 50)
variant("new_ui", weight = 50)
}
// Z payload'em i targetingiem
ADict.ABTesting.experiment("pricing_page") {
variant("default", weight = 33, payload = mapOf("discount" to 0))
variant("aggressive", weight = 33, payload = mapOf("discount" to 20))
variant("soft", weight = 34, payload = mapOf("discount" to 10))
targetSegments("high_engagement", "paying_user")
syncWithFeatures("pricing_variant")
}
Sprawdzanie wariantuChecking Variant
when (ADict.ABTesting.getVariant("checkout_flow")) {
"control" -> showOldCheckout()
"new_ui" -> showNewCheckout()
else -> showOldCheckout()
}
// Inline helper
val result = ADict.ABTesting.withVariant(
experimentId = "checkout_flow",
onControl = { oldCheckoutLogic() },
onTreatment = { newCheckoutLogic() }
)
// Pobierz payload
val payload = ADict.ABTesting.getPayload("pricing_page")
val discount = payload["discount"] as? Int ?: 0
Śledzenie konwersjiConversion Tracking
// Podstawowa konwersja
ADict.ABTesting.trackConversion("checkout_flow", "purchase")
// Z wartością (dla revenue tracking)
ADict.ABTesting.trackConversion(
experimentId = "pricing_page",
eventName = "purchase",
value = 29.99,
metadata = mapOf("product" to "premium")
)
Statystyki i graduacjaStatistics and Graduation
val stats = ADict.ABTesting.getStats("checkout_flow")
if (stats?.isSignificant(confidenceLevel = 0.95) == true) {
val winner = stats.getWinner()
val uplift = stats.getUplift("control")
Log.d("ABTest", "Winner: $winner, Uplift: $uplift%")
// Graduuj - ustaw zwycięzcę jako domyślny
ADict.ABTesting.graduate("checkout_flow", winner!!)
}
Remote Config Override
// Włącz override przez Remote Config
ADict.ABTesting.enableRemoteOverrides()
// W Remote Config ustaw klucz: ab_checkout_flow = "new_ui"
// Wszyscy użytkownicy zobaczą wariant "new_ui"
CallbackiCallbacks
ADict.ABTesting.onAssignment { experimentId, variantId ->
analytics.log("ab_assigned", mapOf(
"experiment" to experimentId,
"variant" to variantId
))
}
ADict.ABTesting.onConversion { experimentId, variantId, eventName ->
analytics.log("ab_conversion", mapOf(
"experiment" to experimentId,
"variant" to variantId,
"event" to eventName
))
}
Strategie przypisywaniaAssignment Strategies
| CechaFeature | OpisDescription |
|---|---|
| DeterministyczneDeterministic | Ten sam użytkownik zawsze trafia do tego samego wariantuThe same user always ends up in the same variant |
| Weighted | Przypisanie na podstawie wag wariantówAssignment based on variant weights |
| Persistent | Przypisanie zapisywane między sesjamiAssignment saved between sessions |
| Segmented | Możliwość targetowania segmentów użytkownikówAbility to target user segments |
DebugDebugowanie
// Wymuszenie wariantu (do testów)
ADict.ABTesting.forceVariant("checkout_flow", "new_ui")
// Pobierz wszystkie przypisania
val assignments = ADict.ABTesting.getAllAssignments()
// Reset
ADict.ABTesting.resetAssignment("checkout_flow")
ADict.ABTesting.reset() // Reset wszystkiego