테스트 그룹 분배

A/B 테스트를 진행할 때, 테스트 그룹을 대상으로 사용자를 분배하고 각 테스트 그룹에 해당하는 로직을 작성해야 합니다.
이 때 사용자 분배를 핵클 SDK를 통해 진행할 수 있습니다.

variation

variation() 메소드에 실험 키를 전달하면 사용자를 분배하고 결과를 전달받을 수 있습니다.

파라미터타입필수제약사항
실험 키 (key)int필수-

예제

아래 예제 코드에서는 실험 키 42를 전달하고 있으며, 테스트 그룹은 A와 B 두 개가 존재합니다.

import io.hackle.android.HackleApp
import io.hackle.sdk.common.Variation
  
// 실험 키가 42인 A/B 테스트에서 사용자에게 노출할 테스트 그룹을 결정합니다.
// 결정하지 못하는 상황인 경우 테스트 그룹 A를 반환합니다.
val variation = hackleApp.variation(42)

// 할당받은 그룹에 대한 로직
if (variation == Variation.A) {
  // 그룹 A 로직
} else if (variation == Variation.B) {
  // 그룹 B 로직
}
import io.hackle.android.HackleApp;
import io.hackle.sdk.common.Variation;
  
// 실험 키가 42인 A/B 테스트에서 사용자에게 노출할 테스트 그룹을 결정합니다.
// 결정하지 못하는 상황인 경우 테스트 그룹 A를 반환합니다.
Variation variation = hackleApp.variation(42);

// 할당받은 그룹에 대한 로직
if (variation == Variation.A) {
  // 그룹 A 로직
} else if (variation == Variation.B) {
  // 그룹 B 로직
}

variationDetail

variationDetail() 메소드는 variation() 메소드와 동일하게 동작하고 분배된 사유를 같이 제공합니다.
이 메소드는 분배가 잘 되고 있는지 살펴볼 때 유용하게 사용할 수 있습니다.

파라미터타입필수제약사항
실험 키 (key)int필수-

예제

아래 예제 코드의 경우 실험 키 42를 전달하고 있습니다.

import io.hackle.android.HackleApp
import io.hackle.sdk.common.Variation
import io.hackle.sdk.common.decision.Decision
import io.hackle.sdk.common.decision.DecisionReason
  
// 분배 결정 상세
val decision = hackleApp.variationDetail(42)

// 분배 그룹
val variation = decision.variation

// 분배 결정 사유
val reason = decision.reason
import io.hackle.android.HackleApp;
import io.hackle.sdk.common.Variation;
import io.hackle.sdk.common.decision.Decision;
import io.hackle.sdk.common.decision.DecisionReason;
  
// 분배 결정 상세
Decision decision = hackleApp.variationDetail(42);

// 분배 그룹
Variation variation = decision.getVariation();

// 분배 결정 사유
DecisionReason reason = decision.getReason();

분배 사유

분배 결정 사유는 SDK_NOT_READY 와 같은 형태로 받게 됩니다. 자세한 내용은 아래 표를 참고해주세요.

사유

설명

분배 결과

SDK_NOT_READY

SDK 사용 준비가 되지 않았습니다.
(예: 잘못된 SDK 키로 초기화 시도)

기본 그룹(A)

EXPERIMENT_NOT_FOUND

전달한 실험 키에 대한 A/B 테스트를 찾을 수 없습니다.
실험 키가 잘못되었거나 해당 실험이 보관 상태일 수 있습니다.

기본 그룹(A)

NOT_IN_MUTUAL_EXCLUSION_EXPERIMENT

실험이 상호 배타적 설정에 포함되어 있지만 해당 상호 배타적 그룹에 할당되지 않은 경우

기본 그룹(A)

EXPERIMENT_DRAFT

A/B 테스트가 준비 상태입니다.

기본 그룹(A)

EXPERIMENT_PAUSED

A/B 테스트가 일시 정지 상태입니다.

기본 그룹(A)

EXPERIMENT_COMPLETED

A/B 테스트가 종료되었습니다.

종료 시 선택한
승리 그룹

OVERRIDDEN

사용자가 수동할당에 의해 특정 그룹으로 결정되었습니다.

수동할당한 그룹

NOT_IN_EXPERIMENT_TARGET

사용자가 A/B 테스트 타겟이 아닙니다.

기본 그룹(A)

TRAFFIC_NOT_ALLOCATED

A/B 테스트가 실행 중이지만 사용자가 테스트에 할당되지 않았습니다.

기본 그룹(A)

TRAFFIC_ALLOCATED

사용자가 A/B 테스트에 할당되었습니다.

할당된 그룹

VARIATION_DROPPED

원래 할당된 그룹이 테스트에서 제외되었습니다.

기본 그룹(A)

EXCEPTION

알 수 없는 오류가 발생했습니다.

기본 그룹(A)


파라미터

Android SDK 2.9.0 이상 버전에서 지원하는 기능입니다.
  • variationDetail() 메소드를 통해 분배된 그룹의 파라미터 값도 같이 제공받을 수 있습니다.
  • variationDetail() 메소드를 통해 전달받은 Decision 인스턴스에는 전체 파라미터 설정 정보가 담긴 ParameterConfig 객체가 존재합니다.
  • 핵클의 A/B 테스트 화면에서 설정한 파라미터 값이 key, value 형태로 존재하기 때문에, 설정한 파라미터 유형에 따라 아래 메소드를 사용하여 설정한 파라미터 값을 받아 활용할 수 있습니다.
  • 분배된 그룹의 설정된 값은 아래 함수를 이용하여 조회할 수 있습니다.
구분value type설명
getStringstringSTRING, JSON 유형으로 설정된 parameter값을 반환합니다.
getIntintNUMBER 유형으로 설정된 parameter 값을 int 타입으로 반환합니다.
getDoubledoubleNUMBER 유형으로 설정된 parameter 값을 double 타입으로 반환합니다
getLonglongNUMBER 유형으로 설정된 parameter 값을 long 타입으로 반환합니다
getBooleanbooleanBoolean 유형으로 설정된 parameter값을 반환합니다.

예제

import io.hackle.android.HackleApp
import io.hackle.sdk.common.decision.Decision
import io.hackle.sdk.common.ParameterConfig

val decision: Decision = hackleApp.variationDetail(42)
val config: ParameterConfig = decision.config

val strValue: String = decision.getString("parameter_key_string_type", "defaultValue")
val strValueInConfig: String = config.getString("parameter_key_string_type", "defaultValue")

val jsonValue: String = decision.getString("parameter_key_json_type", "defaultValue")
val jsonValueInConfig: String = config.getString("parameter_key_json_type", "defaultValue")

val intValue: Int = decision.getInt("parameter_key_number_type", 0)
val intValueInConfig: Int = config.getInt("parameter_key_number_type", 0)

val doubleValue: Double = decision.getDouble("parameter_key_number_type", 0.0)
val doubleValueInConfig: Double = config.getDouble("parameter_key_number_type", 0.0)

val longValue: Long = decision.getLong("parameter_key_number_type", 0L)
val longValueInConfig: Long = config.getLong("parameter_key_number_type", 0L)

val booleanValue: Boolean = decision.getBoolean("parameter_key_boolean_type", false)
val booleanValueInConfig: Boolean = config.getBoolean("parameter_key_boolean_type", false)
import io.hackle.android.HackleApp
import io.hackle.sdk.common.decision.Decision
import io.hackle.sdk.common.ParameterConfig
  
Decision decision = hackleApp.variationDetail(42);
ParameterConfig config = decision.getConfig();
  
String strValue = decision.getString("parameter_key_string_type", "defaultValue");
String strValueInConfig = config.getString("parameter_key_string_type", "defaultValue");
  
String jsonValue = decision.getString("parameter_key_json_type", "defaultValue");
String jsonValueInConfig = config.getString("parameter_key_json_type", "defaultValue");

int intValue: Int = decision.getInt("parameter_key_number_type", 0)
int intValueInConfig: Int = config.getInt("parameter_key_number_type", 0)

double doubleValue: Double = decision.getDouble("parameter_key_number_type", 0.0)
double doubleValueInConfig: Double = config.getDouble("parameter_key_number_type", 0.0)

long longValue: Long = decision.getLong("parameter_key_number_type", 0L)
long longValueInConfig: Long = config.getLong("parameter_key_number_type", 0L)

boolean booleanValue: Boolean = decision.getBoolean("parameter_key_boolean_type", false)
boolean booleanValueInConfig: Boolean = config.getBoolean("parameter_key_boolean_type", false)