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