One minute
GoでABテスト対象のユーザーを振り分けるライブラリを書いた
ABテストとは

ABテストとは? 今さら聞けないABテストの基礎中の基礎まとめ | 株式会社SHIFT
ABテストを実施するには、いくつかの要素があり、大きく下記がある。
事前準備として、
- ABテストを定義 (名前、割合etc..)
- 全ユーザーをグルーピング
そしてリクエストごとに、
- リクエスト元ユーザーの所属グループの決定
- 出し分け
- 結果のロギング
- 検証
- 繰り返し…
使い方
このパッケージは、「事前準備」と「各リクエストの1」をサーバーサイドでやるためのもので、
- あるABテストに対応するグループを定義 (e.g. group-A, group-B)
- グループに適用する割合を定義 (e.g. 80:20)
- 上記定義で初期化したインスタンスに、id (e.g. user-001)を渡す
- 所属しているグループを返す (e.g. group-A)
というすごくシンプルなもの。
基本的な使用例はこんな感じ。
package main
import (
"fmt"
"github.com/takecy/grouping"
)
// SimpleElem implements `grouping.Elementer`
type SimpleElem struct {
name string
ratio int
}
func (e *SimpleElem) GetName() string { return e.name }
func (e *SimpleElem) GetRatio() int { return e.ratio }
func (e *SimpleElem) SetRatio(r int) { e.ratio = r }
func main() {
group := grouping.GroupDefinition{
// case: A+B+C=100
Elems: []grouping.Elementer{
&SimpleElem{name: "group-A", ratio: 10},
&SimpleElem{name: "group-B", ratio: 20},
&SimpleElem{name: "group-C", ratio: 70},
},
}
g, err := grouping.New(group)
if err != nil {
panic(err)
}
//
// The same result will be obtained no matter how many times it is executed.
//
testName := "welcome_content_test"
userID1 := "user-001"
elem1, err := g.GetGroup(userID1, testName)
if err != nil {
panic(err)
}
fmt.Printf("elem1: %v\n", elem1.GetName()) // group-A
userID2 := "user-002"
elem2, err := g.GetGroup(userID2, testName)
if err != nil {
panic(err)
}
fmt.Printf("elem2: %v\n", elem2.GetName()) // group-C
}
同じIDであれば、何度呼び出しても同じグループが返されるため、DBなどに保存しておく必要はない。
feature flagとしても使用可能
また、グループ判定に使用するハッシュ値を生成する関数を外から渡すことや、全体の20%に適用という指定も可能なので、feature flagとしても使える。
後はABテストを実施する箇所、例えばコンテンツのリストを作るところ、クライアント画面表示 などで、取得されたグループを参照し、分岐するよう実装する。
ログを取得し、検証し、さらに別のABを・・と、まだまだ道程は長いが、とりあえず最初の一歩用に。
Read other posts