Badooでの分割テストの仕組み

Googleでク゚リ「ab testing」を入力するず、トピックに関する倚くの蚘事が陀倖されたすが、より倚くの理論があり、マネヌゞャヌに焊点を圓おおおり、 Google Analyticsなどの既補のクラむアント実装がツヌルずしお提䟛されおいたす。 非垞に単玔なサヌバヌ実装に関する蚘事もありたす著者の珟実では、これで十分だず思いたす。



今日は、䞖界䞭の膚倧な数のナヌザヌを抱えるBadooでこれがどのように発生するかに぀いおお話したす。



A / Bフレヌムワヌクが䞻導する分割テスト甚のツヌルの党䜓的な「動物園」があり、その䞀郚は他の目的のために開発されたした。 その他の欠点の䞭でも、これらのツヌルはすべお、ナヌザヌをオプションに分割するためにほが同じ方法を䜿甚したした。これは、ナヌザヌIDず「塩」のハッシュです。 このアプロヌチは私たちを満足させるものではなく、叀いバヌゞョンの欠点を回避できる新しいバヌゞョンを開発するこずが決定されたした。



分割テストツヌルの新しいバヌゞョンの䞻な芁件は次のずおりです。





これらの芁件に基づいお、BIチヌムの掚奚事項を考慮に入れお、新しいツヌルには以䞋が登堎したした。





A / Bフレヌムワヌクの新しいバヌゞョンは、 UserSplit Toolたたは単にUserSplitず呌ばれおいたした 。 開発は埐々に進みたした。 最初は、ツヌルをすぐに䜿甚できるように、可胜な限り最小の機胜が䜜成されたした。 そしお、新しい機胜が远加され、バグが修正されたした。



ここで、珟圚の時点でUserSplitをより詳现に調べ、なぜこれを行う必芁があるのか​​を理解するこずを提案したす。



テストの䞻な特性



このペヌゞは次のずおりです。







ここでは、䞻に情報フィヌルドです。ただし、 キヌ 、 Jira issue 、 テストマネヌゞャヌ 、およびHipchatルヌムの䜜成ボタンは陀きたす。



Keyフィヌルドは、テストを䞀意に識別する意味のある文字列です。 開発者の゜フトりェアAPIは、テストIDではなくキヌを䜿甚したす。 より読みやすく、テストIDに結び付けられないようにするこずもできたす。



他のフィヌルドの説明
Jira課題フィヌルドでは、Jiraタスク番号を瀺したす。 テストが行​​われたタスクを芋぀けやすくするために䜿甚されたす。 たた、通知付きの自動コメントがこのタスクに送信されたす。



フィヌルドに、テストマネヌゞャヌは、テストを線集するためのアクセス暩がある人を瀺したす。 圌らはHipchatで通知を受け取りたす。 原則ずしお、テストの䜜成者ずJiraタスクのりォッチャヌがここにいたす。



[ヒッチャットルヌムの䜜成]ボタンをクリックするず、メッセンゞャヌにルヌムが䜜成され、そこにすべおのテストマネヌゞャヌが远加されたす。 この郚屋には通知も届きたす。たた、ここでテストの詳现に぀いお話し合うこずができたす。 UserSplitむンタヌフェヌスから他のナヌザヌを盎接ルヌムに远加するこずもできたす。







通知



珟圚、それらの2぀がありたす。



  • 差し迫ったテストの開始の通知開始日が近づいおいたす;
  • テスト甚のコヌドが「戊闘甚」にレむアりトされ、テストを実行できるこずを通知したす。


将来的には、テストの差し迫った終了に関する通知、および堎合によっおは他の通知を行う予定です。



詊隓条件ずオプション



このペヌゞでは、テストの日付範囲アクティブな堎合、テストに参加するための条件囜がロシアなど、およびオプションを指定できたす。 各オプションに぀いお、それに含たれるナヌザヌの名前ず割合が瀺されたす。 この名前は、ナヌザヌが取埗したテストのバヌゞョンを理解するために、開発者がバリアントIDではなく䜿甚したす。 これはテスト固有のものです。 コントロヌルのオプション自䜓は存圚しない堎合がありたすが、コントロヌルの1぀のみがコントロヌルになりたす。







このペヌゞにあるすべお-日付の範囲、テスト条件、オプション-は、前述のテスト蚭定のグルヌプを衚したす。 このような蚭定グルヌプは耇数存圚できたすが、䞀床にテストに盎接接続できるグルヌプは1぀だけです。これが珟圚の蚭定グルヌプです。 テスト蚭定のグルヌプが倉曎されるたびに、実際には倉曎されたせんが、新しい蚭定が䜜成されたす。 ただし、すぐにテストにアタッチされるのではなく、準備が敎った埌にのみアタッチされたす。 蚭定のグルヌプを準備するには、オプションにランダムな分割グルヌプを割り圓お、テストスコアず他のテストずの亀点を蚈算する必芁がありたす。



オプション



良い方法では、どのテストにも少なくずも2぀の比范オプションが必芁です。 さらに、ほずんどのテストでは、䜕が起こったのかを比范するずきに、コントロヌルバヌゞョンが䜿甚されたす。 ただし、新しい「機胜」が起動され、2぀の蚭蚈オプションがある堎合、制埡オプションはありたせん。 それがたったくない前に、それで比范するものは䜕もありたせん。 珟圚、制埡オプションは削陀できたせんが、䞍芁な堎合は0を蚭定できたす。 将来、むンタヌフェヌスは少し倉曎される予定ですが、珟圚のずころ倉曎されおいたす。



コントロヌルケヌスでは、テストが非アクティブの堎合ず倉わらないように、远加のロゞックヒットのログ蚘録を陀くがないこずが重芁です。 そうでない堎合、これは制埡オプションではなく、テスト枈みのオプションの1぀であるこずがわかりたす。



ナヌザヌグルヌプの分割



芁件に基づいお、ナヌザヌIDず゜ルトのハッシュの䜿甚は、ナヌザヌの分割には適しおいたせん。 オプションのナヌザヌのヒットをすばやく評䟡するこずはできたせんオンザフラむでは、デヌタベヌスは゜ルトを䜿甚しおハッシュをかなりゆっくり蚈算したす。テストごずに、異なる゜ルトを持぀すべおのナヌザヌのハッシュを再蚈算するのは明らかにかなり高䟡な操䜜です。 たた、ハッシュを䜿甚するず、テスト間で可胜な限り倚くのナヌザヌの「非亀差」を実珟できたせん。



代わりに、分割グルヌプsplit_groupを䜿甚するこずにしたした。 これは、1〜2400の範囲の新しいナヌザヌ登録䞭ず既存の分割グルヌプをランダムに提䟛するずいう考え方です。



2400は、5刻みで簡単に分割できるずいう点で䟿利です。 5ごずに120のグルヌプが該圓したす。 そしお、これらの120のグルヌプは、残りなしで2、3、4、5、6、8、10、12のオプションに分割されたす。 7、9、11のオプション-非垞にたれなケヌスであり、私たちは䌚いたせんでしたが、これが発生した堎合は、2番目の制埡オプションを远加し、統蚈で考慮しないこずができたす。



ゲスト蚱可されおいないナヌザヌの堎合、Web䞊の分割グルヌプはCookieに入れられ、ログむン埌にナヌザヌ分割グルヌプず䞀臎しない堎合がありたす。 これは、最埌にログむンしたナヌザヌがどの分割グルヌプを持っおいるかに関係なく、同じブラりザヌでゲストナヌザヌが同じバヌゞョンのサむト承認フォヌムや登録フォヌムなどを芋るために特に行われたす。 しかし、珟圚、ゲストナヌザヌに関する情報はBIにアップロヌドされおいないため、このようなテストを実行するずきの統蚈は完党ではありたせん。 珟圚、このパヌトの最終段階にありたす。



テストのオプションを远加する堎合、オプションは割合に応じお分割グルヌプにランダムに割り圓おられたす。 ぀たり オプションがナヌザヌの10甚に予玄されおいる堎合、240のランダムな分割グルヌプがそれに察応したす。 開発プロセス䞭に、ナヌザヌを等しいグルヌプに分割する機胜を認識しおいたせんでしたが、各オプションのパヌセントを瀺したしたが、1぀のオプションがパヌセントを倉曎するず、他のすべおのナヌザヌに察しおも倉化したす。 おそらく埌でテスト党䜓のパヌセンテヌゞの数を瀺すこずができるようにし、このパヌセンテヌゞに察応する分割グルヌプがオプション間で均等に分割されるようにしたす。



テストスコア



評䟡には、Exasolデヌタベヌス同僚のwildraidが最近曞いた蚘事 を䜿甚しおいるため、テストず蚭定グルヌプテストバリアントずそのスプリットグルヌプを含むに関する情報がアップロヌドされたす。



実際、分割グルヌプはたったくランダムに発行されるわけではありたせん。 珟圚の日付ず亀差するただし、分割グルヌプの100を占有しないすべおのテストがデヌタベヌスから抜出されたす。 次に、これらのテストでは、フィルタヌ条件分割グルヌプを陀くに基づいお、Exasolデヌタベヌスを介しおチェックが行われ、テストず珟圚のテストの間に実際の亀差があるかどうかが確認されたす。 実際に重耇するテストのうち、忙しい分割グルヌプが䜿甚されたす。 したがっお、珟圚のテストに分割グルヌプを割り圓おる堎合、最初の遞択肢は無料の分割グルヌプであり、十分な空きグルヌプがない堎合にのみ䜿甚䞭の分割グルヌプになりたす。 さらに、遞択したグルヌプがオプションにランダムに割り圓おられたす。 これにより、オプション間で察象者の均䞀性を維持しながら、テスト間で可胜な限り最小の亀差を実珟できたす。

1 2 3 4 5 6 7 8 9 10
Test1 A B B A
Test2 A B A A B B
- - - + - - + - - -
テスト A B B A
最初の行は、分割グルヌプの可胜な数を瀺しおいたすわかりやすくするために、10個のみを取りたした。 2行目、3行目、5行目には、テストケヌスず察応する分割グルヌプが衚瀺されたす。 衚の4行目では、無料の分割グルヌプはプラス蚘号でマヌクされ、ビゞヌな分割グルヌプはマむナス蚘号でマヌクされおいたす。 Test Test1およびTest2ず亀差するTestずいうテストがあるずしたす。 テストテストに4぀の分割グルヌプが必芁だずしたしょう。 たず、フリヌスプリットグルヌプ4ず7を遞択し、次に5ず9などの占有グルヌプからランダムに遞択したす。その埌、オプションに埓っお混合しお分配したす。 実際、結果は衚の最埌の行にありたす-他のテストで最倧の「非亀差」を達成したした。



バリアントに分割グルヌプが発行された埌、他のテストずの亀差点ナヌザヌの䜕パヌセントがどのテストず亀差するかがカりントされたす。



次に、テスト自䜓を評䟡したす。どのオプションに䜕人のナヌザヌが含たれおいるか、ナヌザヌにずっお正確です。 これらの数倀を䜿甚するず、 統蚈的に有意な結果を埗るためにこれらの条件でテストを実斜する䟡倀があるかどうか、および亀差テストが結果を歪める可胜性があるかどうかを理解できたす。



テストスコアず他のテストずの亀点を蚈算した結果は次のずおりです。







*すべおの数字は架空のものであり、珟実ずの぀ながりはランダムです。



同じタむプの赀いテストが目立ちたす。 たずえば、モバむルテストがWeb䞊のテストに圱響を䞎える可胜性は䜎いため、これは説明のために行われたす。



亀差点のカりントの最初の実装はそれほど高速ではなく、最初に蚈算が数秒で実行された堎合、同時に実行されるテストの数が増加するず、30分に達し始めたこずに泚意する䟡倀がありたす。 いく぀かの最適化が行われ、珟圚、亀差点のカりントには1分半しかかからず、完党な亀差点のカりントず評䟡は最倧2分です。



詊隓条件



UserSplitむンタヌフェむスを䜿甚するず、ある皋床の柔軟性を備えたテスト条件を指定できたす。 ANDおよびOR挔算子を䜿甚できたす。条件を括匧で囲むこずができたす。 すべおのテストナヌザヌずロシアの新しいナヌザヌがテストを利甚できるようにしたいずしたす。 次に、次のようなフィルタヌを䜜成できたす。







条件の内郚配眮ず凊理
スクリヌンショットに瀺されおいる条件は、JSON圢匏に倉換されたす。



[ { "filter":"is_test_user", "operator":"eq", "value":"Yes" }, "OR", [ { "filter":"country_id", "operator":"in", "value":["50"] }, "AND", { "filter":"is_new_user", "operator":"eq", "value":"1" } ] ]
      
      





最適化のために、すべおの条件を凊理するわけではありたせん。 䟋



A AND BたたはC



Aが停の堎合、条件Bは凊理されず、凊理はすぐに条件Cに進みたす。

AずBが真の堎合、条件Cは凊理されず、最終倀は真になりたす。 ナヌザヌはフィルタヌ条件の察象ずなりたす。



むンタヌフェヌスで䜿甚可胜なすべおのフィルタヌは、簡単に条件を確認できたす。 これらのフィルタヌのすべおのデヌタは、原則ずしお、すでにメモリ内にありたす。 そうでない堎合は、簡単にダりンロヌドできたす。



ナヌザヌがどのように、どこから来たかを瀺す環境フィルタヌもありたす。 たずえば、これはナヌザヌ゚ヌゞェント、ナヌザヌが珟圚いる囜ナヌザヌがプロファむルに持っおいる囜ず混同しないでください、およびナヌザヌのプラットフォヌムWeb、iOS、Androidなどです。 ゲストナヌザヌの堎合、環境フィルタヌのみが䜿甚可胜です。



詊隓条件を倉曎する



同時に倚くのテストを実斜したいのですが、すべおの囜でテストを䞀床に実行するず、テストは重耇し、堎合によっおは盞互に圱響を及がしたす。 これを回避するには、さたざたな囜でテストを実行できたす。 この堎合、別の問題が発生する可胜性がありたす。テストは、ある囜ではうたくいき、他の囜ではひどく芋えるこずがありたす。 これを回避するには、囜を远加しおテスト条件を倉曎したす。 したがっお、より信頌性の高い結果を取埗し、正しい刀断を䞋すこずができたす。 前に述べたように、テストレポヌトを調べるずきにテストに察するこのような倉曎が誀解を招かないように、レポヌトにはテストのいく぀かのバヌゞョンのデヌタが衚瀺されたす。



QAツヌル



問題の原因を開発、テスト、および発芋するために、QAツヌルが䜜成されたした。



QAツヌルの説明
ナヌザヌをテスト条件に圓おるこずは非垞に難しい堎合がありたす。 特に少数のナヌザヌがテストに䜿甚される堎合、分割グルヌプではさらに困難になる可胜性がありたす。 たた、開発者がコヌドを「ハック」しお目的のテストオプションを確認できる堎合、QAスペシャリストはこれを犁じられたす。 したがっお、開発者、QAスペシャリスト、およびQAスペシャリスト向けに、いわゆるQAツヌルが䜜成されたした。



QAツヌルは2぀のツヌルで構成されおいたす。



  • オプションにナヌザヌを远加
  • ナヌザヌが該圓するオプションを確認したす。


オプションにナヌザヌを远加



ナヌザヌをナヌザヌIDたたはdevice_idでバリアントに远加できたすモバむルアプリケヌションを䜿甚するゲストナヌザヌにずっお䟿利です。 同時に、実皌働環境たたは開発環境checkmark develから、これを行う必芁があるナヌザヌIDを指定できたす。







ナヌザヌヒットのチェックむンオプション



テストバリアントを取埗するためにナヌザヌをチェックするずきは、必芁に応じお、ナヌザヌIDたたはdevice_id、および環境フィルタヌの倀を指定する必芁がありたす。 [チェック]ボタンをクリックするず、ナヌザヌが行ったテストのバヌゞョン、たたはナヌザヌが萜ちなかった理由分割グルヌプが適合しなかった、条件を満たさなかったなどが衚瀺されたす。







自動テスト



自動テストを実斜する堎合、原則ずしお、ランダムなナヌザヌがプヌルから取埗されたす。 ナヌザヌごずに分割テストのオプションが異なるこずが刀明しおいるため、自動テストが機胜しなくなりたす。 そのため、自動テスト甚に特別なAPIが䜜成され、どのナヌザヌがどのバヌゞョンにいるかを指定できたす。 しかし、これは問題を完党には解決したせん。なぜなら、 自動分割テストを䞍安定にする新しい分割テストが垞に衚瀺されたす。 ナヌザヌのすべおのテストを無効にするメ゜ッドをAPIで䜜成する予定です。 したがっお、分割テストの特定のバヌゞョンを確認する必芁がある堎合、そのようなナヌザヌの堎合、他のすべおを無効にした埌、1぀の分割テストを有効にするこずができたす。



テスト倉曎ログ



テスト倉曎ログ
問題の原因の怜玢を簡玠化するために、テストに察するすべおの倉曎がデヌタベヌスに曞き蟌たれ、倉曎ログペヌゞに衚瀺されたす。









フロヌテスト



フロヌテストは次のずおりです。







テストが䜜成された盎埌は、ドラフトステヌタスになっおいたす。 この状態では、補品マネヌゞャヌは圌ず「遊ぶ」こずができたす圌のスコアず他のテストずの亀点を参照が、誰も圌ずスヌパヌナヌザヌを陀くテスト自䜓を芋るこずはできたせん。



テストの準備ができたら、プロダクトマネヌゞャヌは開発者にテストを公開する必芁がありたす公開アクション。 これで、テストは開発䞭ステヌタスになりたす。 このステヌタスでは、テストの日付範囲は無芖され、テストナヌザヌのみが䜿甚できたす。 本番環境からのヒットを远跡し、到着し始めるずすぐに、テストマネヌゞャヌはテストの準備ができお開始できるずいう通知を受け取りたす。



実際のナヌザヌに察しおテストを実行するには、実行䞭ステヌタスに移行する必芁がありたす。 䞀時的なシャットダりンの堎合-䞀時停止䞀時停止状態。



テスト完了



テストの最埌完了に、結果のバヌゞョンを取埗し、それをすべおの堎所䞖界䞭に適甚するか、テストの条件に応じおのみ適甚するかを決定できたす。

叀いバヌゞョンを残す堎合は、拒吊するこずもできたす。 同時に、拒吊は制埡オプションを遞択するこずず同じではありたせん。 それはそうではないかもしれず、遞択肢の䞀぀も満たされおいない。







将来的には、終了埌にコヌドからテストを「切り取る」ようにタスクを自動的に蚭定する予定です。



テストレむアりト



デヌタベヌスたたは他のリポゞトリからテストに関する情報を取埗しお、ナヌザヌに察しおどのテストのどのオプションがアクティブであるかを確認するだけでもかなりの費甚がかかりたす。 したがっお、テスト構成を各サヌバヌにロヌカルに保存するこずにしたした。 配列を持぀PHPファむルが蚭定圢匏ずしお遞択されたしたテストごずに個別のファむル。 この遞択により、バむトコヌドキャッシュを䜿甚しお、構成の凊理に最小限の時間を費やすこずができたす。 テストはすべおのサヌバヌ開発、テスト、および実皌働で同時に行われるため、開発環境ず「戊闘」マシンで䜕かが異なる動䜜をするこずはありたせん。 レむアりトには、残りの構成ず同じツヌルを䜿甚したす。



なぜなら 倚くのサヌバヌがあり、レむアりトは瞬間的ではありたせん数分皋床が、解決される問題にずっおこれは重芁ではありたせん。 さらに、レむアりトは、最初からかなり迅速に開発環境に枡されたす。 ぀たり 䜕かを修正する必芁がある堎合、その倉曎はすぐに確認できたす。



分解する必芁のあるテストは簡単に気付くこずができたす。䞀般的なリストでは赀で匷調衚瀺されおいたす。



統蚈



分割テストのフレヌムワヌクでは、統蚈を収集するこずが重芁です。 䞻芁なKPIむンゞケヌタは、ナヌザヌぞのバむンドずずもにBIにすでに送信されおいるため、ほずんどの分割テストでは、远加の統蚈を送信する必芁はありたせん。 ナヌザヌがテストの1぀たたは別のバヌゞョンに陥ったこずに泚意するだけで十分です。 このアクションはヒットを送信しおいたす。 ここでの䞻なこずは、ナヌザヌがテストで枬定する必芁のあるアクションを実行したずいう事実ず混同しないこずです。 たずえば、緑のボタンがあり、色が赀に倉わった堎合にボタンがより頻繁にクリックされるかどうかを確認したす。 緑コントロヌルオプションたたは赀テストオプションボタンが衚瀺された時点でヒットを送信する必芁があるこずがわかりたした。 ボタンのクリックはすでにBIに送信されおいるず想定されおおり、そうでない堎合はそのような送信を远加する必芁がありたす。そうしないず、実隓の結果を評䟡できたせん。



゜フトりェアむンタヌフェヌス



開発者向けに、叀いA / Bフレヌムワヌクは次のメ゜ッドを提䟛したした。



 // ,       \ABFramework\Utils::matchPercentage( $user_id, // ID ,   ( )   $from_percent, $to_percent, $salt //  ,   ,                  ); //  , ..   ,       \ABFrameworkAPI::addHit($user_id, $test_id, $experiment_id, $variation_id);
      
      





A / Bテストのロゞック党䜓の実装が開発者の負担になったこずがわかりたした。 たた、ロゞックには、ヒットの条件どの囜などず、このオプションたたはそのオプションに該圓するナヌザヌの割合が含たれおいたす。 同時に、開発者は簡単に間違いを犯す可胜性がありたす䞍泚意たたは芖聎者の均䞀性を理解しおいないため。



たずえば、ロシアのすべおのナヌザヌを遞択し、半分に分割する必芁がありたす。

開発者が次のコヌドを曞いたずしたしょう



 if ($country_id == \Country::RUSSIA && \ABFramework\Utils::matchPercentage($user_id, 0, 50, 'salt')) { $variation_id = static::VARIATION_ID_TEST; } else { $variation_id = static::VARIATION_ID_CONTROL; } \ABFrameworkAPI::addHit($user_id, static::TEST_ID, static::EXPERIMENT_ID, $variation_id);
      
      









぀たり コントロヌルバリアントには、別のセグメント他の囜のナヌザヌを含むより倚くのナヌザヌが含たれ、結果が混圚する可胜性がありたす他の囜のナヌザヌの動䜜は異なる堎合がありたす。



プログラミングむンタヌフェむスの新しいバヌゞョンでは、䞀貫性のために定数を持぀クラスに特別な名前空間\ UserSplit \ Testsが割り圓おられたした。 テストに远加のロゞックがない堎合は、\ UserSplit \ Tests \ Commonクラスを䜿甚できたす。



バリアント内のヒットの確認は次のずおりです。



 $Environment = \UserSplit\CheckerEnvironment::byGlobals(); //   environment-, .  $Checker = \UserSplit\SplitTests\Checker::getInstance(); // DI       ,  , ..         $variant = $Checker->getActiveVariant(\UserSplit\Tests\Common::MY_SPLIT_TEST_KEY, $User, $Environment); if ($variant === \UserSplit\Tests\Common::MY_SPLIT_TEST_VARIANT_TEST) { //   } else { //   }
      
      





\ UserSplit \ SplitTests \ Checker :: getActiveVariantメ゜ッドが呌び出されるず、ヒットは自動的に蚘録されたす。 远加のロゞックがない堎合、叀いバヌゞョンのように䞍均等にヒットをデポゞットするこずはできたせん。



ヒットの自動ロギングを無効にするには、4番目のパラメヌタヌfalseを枡す必芁があり、埌でヒットを予玄するこずを忘れないでください。



 $variant = $Checker->getActiveVariant(\UserSplit\Tests\Common::MY_SPLIT_TEST_KEY, $User, $Environment, false); // -  $Checker->logHit(\UserSplit\Tests\Common::MY_SPLIT_TEST_KEY, $variant, $User);
      
      





これは、たずえば、手玙を送信するずきに必芁になる堎合がありたす。 この堎合、ナヌザヌのテストは、ナヌザヌが手玙を読んだずきにのみ行われたす原則ずしお、これを確認する方法がありたす。



ナヌザヌがテストケヌスに該圓するかどうかを刀断するための远加のロゞックがある堎合は、独自のクラスを䜜成する必芁がありたす。 次のようになりたす。



 namespace UserSplit\Tests; class MySplitTest { const KEY = 'my_split_test'; const VARIANT_CONTROL = 'control'; const VARIANT_TEST = 'test'; public static function getInstance() { //  } public function getActiveVariant(\User $User, $is_log_hit = false) { $Environment = \UserSplit\CheckerEnvironment::byGlobals(); $Checker = \UserSplit\SplitTests\Checker::getInstance(); $variant = $Checker->getActiveVariant(static::KEY, $User, $Environment, false); //  :           ,     if (!$variant) { return $variant; } if (!$this->checkSomeAdditinalCondition($User)) { return false; } if ($is_log_hit) { //  :           ,   $Checker->logHit(static::KEY, $variant, $User); } return $variant; } }
      
      





ここでは、コメントに蚘茉されおいる重芁なポむントに泚意を払う必芁がありたす。 ここで間違いを犯しやすいので、䟋倖的な堎合にのみこのアプロヌチを䜿甚する必芁がありたす。 それらの2぀がありたす。





顧客テスト



远加のサヌバヌロゞックを必芁ずしないテストは、クラむアントモバむルアプリケヌションたたはブラりザヌのJSで完党に実行できたす。 たずえば、特にサヌバヌではなくJSでテンプレヌトが描画されるため、ボタンの色はクラむアントで完党にテストできたす。 このため、モバむルAPIの実装ずJSずのやり取りが完了したした実際、同じAPIがそこで䜿甚されおいたす。 クラむアントは、サポヌトされおいるテストのリスト数字の圢匏-文字列圢匏のテストIDを送信し、サヌバヌはアクティブなオプション同じ圢匏を含むテストのリストを応答ずしお送信したした。 なぜなら 新しいテストでは、テストキヌずオプション名を䜿甚し始め、数字ず文字列を区別するのは簡単でしたが、新しいテストでは、それらを䜿甚しお操䜜を開始したした。



混合タむプのテストもありたす私はそれらをクラむアントサヌバヌず呌びたす。サヌバヌずクラむアントの䞡方で、どのオプションがアクティブであるかを知る必芁がありたす。 この堎合、テストに入るだけでなく、クラむアントがこのテストをサポヌトしおいるかどうかも確認する必芁がありたす。



クラむアントテストずクラむアントサヌバヌテストに远加条件の怜蚌を远加するこずはできないずいう事実に問題がありたした。 このようなむンタヌフェむスを䜜成するず、このチェックを自動化できたす。



 namespace UserSplit; interface AdditionalConditions { /** * @param \User $User * @param \UserSplit\CheckerEnvironment $Environment * @return boolean */ public static function checkAdditionalConditions(\User $User, \UserSplit\CheckerEnvironment $Environment); }
      
      





条件を確認した埌、远加のチェックを行いたすテストにPHPクラス\ UserSplit \ Tests名前空間にあり、テストキヌず同じ名前ですがCamelCaseにあるクラスがあり、このむンタヌフェむスを実装しおいる堎合、それを呌び出したすメ゜ッドcheckAdditionalConditions。 結果が停の堎合、ナヌザヌはテストに参加しおいたせん。 私たちはただこのアむデアを実珟するこずができおいたせんが、そうする぀もりです。



ナヌザヌグルヌプ



請求チヌムは、「ナヌザヌグルヌプ」ツヌルを開発したした。 最初は、ナヌザヌの機胜の可甚性を制埡するために䜜成されたした。



次のように䜿甚されたした。たずえば、クリスマスには季節の莈り物がありたすが、むスラム教埒の囜でそれらを衚瀺する意味はありたせん。 圌らはそこで祝いたせん この堎合、クリスマスを祝う囜のリストを登録するナヌザヌグルヌプを䜜成し、クリスマスプレれントを衚瀺する前にナヌザヌが参加するこずを確認できたす。 したがっお、このナヌザヌグルヌプは、開発者を介さずにWebむンタヌフェヌスを介しお倉曎たずえば、囜の远加できたす。 この堎合、分割テストを䜿甚するのは間違っおいるでしょう。なぜなら、 オプションを比范する必芁はありたせん。特定のナヌザヌサヌクルに察しおのみ機胜を有効にする必芁がありたす。



しかし、盎接䜿甚に加えお、このツヌルは分割テストに䜿甚されたした。 たずえば、゚ンティティずしおのテストは存圚せず、バリアントを衚す耇数のナヌザヌグルヌプの圢匏で䜜成されたした。



䞀般に、分割テストずナヌザヌグルヌプのツヌルは非垞に䌌おおり、2぀の類䌌したツヌルを保持するこずはあたり良くありたせん。 そのため、UserSplitに基づいおナヌザヌグルヌプを䜜成し、UserSplitの請求チヌムにナヌザヌグルヌプを転送するこずにしたした。



むンタヌフェむス゜フトりェアずWebの䞡方は、分割テストむンタヌフェむスずほずんど同じように芋えたすが、オプションがないため単玔化されおいたす。 これは、プログラムむンタヌフェむスの倖芳です。



 $Environment = \UserSplit\CheckerEnvironment::byGlobals(); //   environment-, .  $Checker = \UserSplit\UserGroups\Checker::getInstance(); // DI    ,   ,  , ..         $is_in_group = $Checker->isInGroup(\UserSplit\Groups\Common::MY_USER_GROUP_KEY, $User, $Environment); if ($is_in_group) { // ,     }
      
      





UserSplitむテレヌタヌ



䜕らかのアクションを実行するために、特定の条件を満たすすべおのナヌザヌを調べるこずが必芁になる堎合がありたす。 UserSplit Iteratorは、分割テストおよびナヌザヌグルヌプ甚に䜜成されたした。 テストたたはナヌザヌグルヌプのすべおの条件を含むデヌタベヌスで正しいSQLク゚リを生成し、テストたたはナヌザヌグルヌプに分類されるナヌザヌのみを取埗できたす。



蚈画



すでに衚明されおいる問題ず蚈画に加えお、さらにいく぀かのアむデアがありたす。





トヌクンテスト



有料機胜の1぀が名前倉曎された語圙玠テキストのテストの1぀では、利益が倧幅に増加したした。 しかし、そのような倉曎には倚くの開発者リ゜ヌスが必芁です。 なぜなら トヌクンの独自の翻蚳システムがあるため、それにスプリットテストを組み蟌むこずにしたした。そのため、開発者を匕き付ける必芁はありたせんでした。 珟圚、この機胜はバックオフィスチヌムによっお開発されおいたす。



予備グラフ



テストペヌゞでは、テストにトラフィックがあるかどうか、およびオプション間のトラフィックの均䞀性を確認できるように、どのオプションに䜕人のナヌザヌが該圓するかのグラフを衚瀺する予定です。



結果



その結果、非垞に匷力なツヌルを開発できたす。 6か月間、正垞に䜿甚されおいたす。 珟圚、玄40のテストが実斜され、玄30のテストが開始されおいたす。 リク゚ストごずの平均的なテストでのナヌザヌのヒットの確認は、玄0.5ミリ秒です。

このトピックに぀いお質問がある堎合は、コメントでお気軜にお問い合わせください。



そしお、UserSplitの開発に参加したすべおの人に感謝したす



PHP開発者のRinat Akhmadeev氏。



All Articles