馃И ABTesting

System A/B test贸w z integracj膮 Remote Config i Analytics

Opis

Modu艂 ABTesting pozwala na przeprowadzanie eksperyment贸w A/B z deterministycznym przypisywaniem u偶ytkownik贸w do wariant贸w, 艣ledzeniem konwersji i integracj膮 z Remote Config oraz Analytics.

Definiowanie eksperymentu

// 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 wariantu

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 konwersji

// 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 graduacja

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"

Callbacks

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 przypisywania

Cecha Opis
Deterministyczne Ten sam u偶ytkownik zawsze trafia do tego samego wariantu
Weighted Przypisanie na podstawie wag wariant贸w
Persistent Przypisanie zapisywane mi臋dzy sesjami
Segmented Mo偶liwo艣膰 targetowania segment贸w u偶ytkownik贸w

Debug

// 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