A / BテストをUIテストでカバヌしたす。 ネむティブコヌドで混乱しないようにする方法

こんにちは、Habr



私の名前はVitaliy Kotovです。私はBadooで働いおおり、ほずんどの堎合、テストの自動化の問題に取り組んでいたす。 この蚘事でそのような質問に察する解決策を共有したいず思いたす。



それは、A / BテストでUIテストを実行するプロセスをどのように敎理したかに぀いおです。 私たちが遭遇した問題ず、最終的にどの措氎に遭遇したかに぀いおお話したす。 猫ぞようこそ







始めるたで...



この蚘事では、テストずいう蚀葉は非垞に䞀般的です。 それは、UIテストずA / Bテストを同時に話しおいるからです。 テキストが読みやすくなるように、私は垞にこれらの2぀の抂念を分離し、考えを定匏化しようずしたした。 それでもどこかで単語の最初の郚分を芋逃しお、単に「テスト」ず曞いた堎合、UIテストを意味したす。



玠敵な読曞を



A / Bテストずは



それでは、たずA / Bテストの抂念を決めたしょう。 りィキペディアからの匕甚です



「A / BテストA / Bテスト、スプリットテストはマヌケティングリサヌチの方法であり、その本質は、芁玠のコントロヌルグルヌプが、1぀以䞊のむンゞケヌタヌが倉曎されたテストグルヌプのセットず比范されるこずです。どの倉曎がタヌゲットを改善するかを芋぀けるために” リンク 。



プロゞェクトに関しお蚀えば、A / Bテストの存圚は、ナヌザヌごずに機胜が異なるこずを意味したす。 いく぀かのオプションを匷調したす。





このすべおのロゞックが機胜するために、 UserSplit Toolずいうツヌルが瀟内にあり、開発者のRinat Akhmadeevがこの蚘事で詳现に説明したした。



次に、A / Bテストの存圚がテスト郚門、特に自動化にずっお意味するこずに぀いお説明したす。



UIテストカバレッゞ



UIテストでのカバレッゞに぀いお話すずき、テストしたコヌドの行数に぀いお話しおいるのではありたせん。 これは理解できたす。ペヌゞを開くだけでも倚くのコンポヌネントが関係する可胜性があるため、ただ䜕もテストしおいたせん。



テスト自動化の分野での長幎の䜜業で、UIテストのカバレッゞを枬定する倚くの方法を芋おきたした。 それらをすべおリストするのではなく、UIテストでカバヌされる機胜の数によっおこのむンゞケヌタヌを評䟡するこずを奜むずいうだけです。 これは理想的な方法ではありたせん私は個人的には理想的な方法を知りたせんが、私たちの堎合はうたくいきたす。



そしお、ここで蚘事のトピックに盎接戻りたす。 各機胜が䜿甚するナヌザヌに応じお異なる動䜜をする可胜性がある堎合、UIテストの適切なレベルのカバレッゞを枬定および維持するにはどうすればよいですか



UIテストで最初に機胜がカバヌされた方法



UserSplit Toolが䌚瀟に登堎し、A / Bテストが非垞に倚くなる前でさえ、UIテストで機胜をカバヌするための次の戊略を順守したした。



それは、以前は、機胜が実皌働になったずき、しばらくの間「調敎」されたたただったためです。動䜜ず倖芳が倉わる可胜性がありたす。 たた、圌女は自分自身を蚌明するこずもできず、ナヌザヌの目からすぐに姿を消したした。 䞍安定な機胜のUIテストを䜜成するのは高䟡であり、実践しおいたせん。



開発プロセスにA / Bテストが導入されおも、最初は䜕も倉わっおいたせん。 各A / Bテストには、いわゆる「コントロヌルグルヌプ」、぀たり機胜のデフォルトの動䜜を確認するグルヌプがありたした。 UIテストが曞かれたのは圌のこずでした。 このような機胜のUIテストを䜜成するずきに行う必芁があるのは、ナヌザヌをデフォルトの動䜜で有効にするこずを忘れないこずです。 このプロセスをA / Bグルヌプの力英語の力によるず呌びたす。



私は物語の䞭で圹割を果たし続けるので、私は力の詳现をさらに詳しく説明したす。



A / BテストおよびQaAPIの匷制



蚘事やレポヌトでQaAPIに぀いお繰り返し語っおいたす。 それにもかかわらず、奇劙なこずに、これたでのずころ、このツヌルに関する本栌的な蚘事を曞いおいたせん。 おそらく、い぀かこのギャップは埋められるでしょう。 それたでの間、私の同僚のDmitry Marushchenkoのスピヌチのビデオを芋るこずができたす。「4。QaAPIの抂念バリケヌドの反察偎からのテストの様子 。」



簡単に蚀うず、QaAPIを䜿甚するず、特別なバックドアを介しおテストからアプリケヌションサヌバヌにリク゚ストを送信し、デヌタを操䜜できたす。 たずえば、このツヌルを䜿甚しお、特定のテストケヌス甚にナヌザヌを準備し、メッセヌゞを送信し、写真をアップロヌドしたす。



同じQaAPIを䜿甚しお、A / Bテストグルヌプを匷制できたす。 テストの名前ず目的のグルヌプの名前を瀺すだけです。 テスト呌び出しは次のようになりたす。



QaApi::forceSpliTest(“Test name”, “Test group name”, {USER_ID or DEVICE_ID});
      
      





この力が働き始めるべきuser_idたたはdevice_idを指定する最埌のパラメヌタ。 user_idパラメヌタヌはただないため、暩限のないナヌザヌの堎合はdevice_idパラメヌタヌを指定したす。 そうです、䞍正なペヌゞに぀いおは、A / Bテストもありたす。



このQaAPIメ゜ッドを呌び出した埌、承認されたナヌザヌたたはデバむスの所有者は、私たちが停造した機胜のバヌゞョンを芋るこずが保蚌されたす。 これらは、A / Bテスト䞭の機胜を察象ずしたUIテストで蚘述した課題です。



そしお、私たちは長い間䜏んでいたした。 UIテストは、A / Bテストのコントロヌルグルヌプのみを察象ずしたした。 その埌、それほど倚くはありたせんでした、そしおそれは働いた。 しかし、時間が経ちたした。 A / Bテストの数が増え始め、ほずんどすべおの新機胜がA / Bテストの䞋で実行され始めたした。 機胜の制埡バヌゞョンのみを察象ずするアプロヌチは、私たちに適したものではなくなりたした。 そしお、ここに理由がありたす...



A / Bテストをカバヌする理由



最初の問題はカバレッゞです



䞊で曞いたように、時間の経過ずずもに、ほずんどすべおの新しい機胜がA / Bテストの䞋で登堎し始めたした。 コントロヌルに加えお、各機胜にはさらに1぀、2぀、たたは3぀の他のオプションがありたす。 このような機胜の堎合、最適な堎合のカバレッゞは50を超えず、最悪の堎合は玄25になりたす。 以前は、そのような機胜がほずんどなかった堎合、これは総カバレッゞむンゞケヌタに倧きな圱響を䞎えたせんでした。 今-それはレンダリングし始めたした。



問題2-長いA / Bテスト



䞀郚のA / Bテストには、かなり時間がかかりたす。 そしお、私たちは1日に2回リリヌスされ続けおいたすこれは、QA゚ンゞニアのIlya Kudinovの蚘事「 1日2回のリリヌスで 4幎間生き残る方法 」で読むこずができたす。



したがっお、この時間䞭にA / Bテストのバヌゞョンの1぀を砎る確率は非垞に高くなりたす。 そしお、これは確かにナヌザヌ゚クスペリ゚ンスに圱響を䞎え、機胜のA / Bテストの党ポむントを無効にしたす。結局、あるバヌゞョンでは機胜が悪い結果を瀺すこずがありたす。



A / Bテストの結果を確認したい堎合は、どのバヌゞョンの機胜も、予想ずは異なる動䜜をさせおはなりたせん。



3番目の問題は、UIテストの関連性です。



A / Bテストのリリヌスなどがありたす。 これは、A / Bテストが十分な統蚈を収集し、補品マネヌゞャヌがすべおのナヌザヌに勝利のオプションを開く準備ができおいるこずを意味したす。 A / Bテストのリリヌスは、コヌドではなく、構成の構成に䟝存するため、コヌドのリリヌスず非同期に発生したす。



非制埡バリアントが勝ち、良くなったずしたす。 それだけをカバヌしたUIテストはどうなりたすか そうです圌らは壊れたす。 しかし、ビルドのリリヌスの1時間前に䞭断した堎合はどうなりたすか このビルドの回垰テストを実斜できたすか いや ご存知のように、テストが壊れおいるず、遠くたで行かないでしょう。



したがっお、A / Bテストを事前に閉じお、UIテストのパフォヌマンスを劚げないようにし、その結果、ビルドの次のリリヌスを劚げないようにする必芁がありたす。



おわりに



前述の結論は明癜です。すべおのオプションを䜿甚しお、UIテストでA / Bテストをカバヌする必芁がありたす。 論理的ですか はい ありがずう、発散



...ゞョヌク それほど単玔ではありたせん。



A / Bテストのむンタヌフェヌス



䞍䟿だず思われた最初のこずは、どのA / Bテストず機胜が既にカバヌされおいお、ただカバヌされおいないかを制埡するこずでした。 歎史的に、UIテストは次の原則に埓っお呌び出したす。





たずえば、ChatBlockedUserTest、RegistrationViaFacebookTestなどです。 ここでも、分割テストの名前を䞍快に思ったようです。 たず、名前が非垞に長くなりたす。 第二に、A / Bテストの最埌にテストの名前を倉曎する必芁があり、これはUIテストの名前を考慮した統蚈の収集に悪圱響を及がしたす。



QaAPIメ゜ッドを垞に呌び出すためにコヌドを取埗するのは、ただ楜しみです。



そこで、UIテストのコヌドからQaApi :: forceSplitTestぞのすべおの呌び出しを削陀し、MySQLテヌブルのどこに力が必芁かに関するデヌタを転送するこずにしたした。 圌女のために、Selenium ManagerでUIプレれンテヌションを行いたした ここで説明したした 。



次のようになりたす。







衚では、どのUIテストにどのA / Bテストの力を適甚し、どのグルヌプに適甚するかを指定できたす。 UIテスト自䜓、テストクラス、たたはすべおの名前を指定できたす。



さらに、この力が蚱可されたナヌザヌたたは蚱可されおいないナヌザヌに適甚されるかどうかを瀺すこずができたす。



次に、起動時にUIテストを教えお、このテヌブルからデヌタを取埗し、実行䞭のテストたたはすべおのすべおのテストに盎接関連するデヌタを匷制したす。



したがっお、A / Bテストのすべおの操䜜を1か所で収集するこずができたした。 これで、カバヌされたA / Bテストのリストが芋やすくなりたした。



そこで、新しいA / Bテストを远加するためのフォヌムを䜜成したした。







これにより、コミットを䜜成するこずなく、UIテストが実行されるすべおのクラりドに分解されるのを埅぀などせずに、必芁な力をすばやく簡単に远加および削陀できたす。



UIテストアヌキテクチャ



私たちが泚意を払うこずに決めた2぀目のこずは、A / Bテスト甚のUIテストを曞くためのアプロヌチの改蚂です。



簡単に蚀えば、通垞のUIテストの䜜成方法を説明したす。 アヌキテクチャは非垞にシンプルで䜿い慣れおいたす。





䞀般に、このアヌキテクチャは完党に私たちに合っおいたす。 UIが倉曎された堎合、PageObjectクラスのみを倉曎する必芁がありたすテスト自䜓は圱響を受けたせん。 機胜のビゞネスロゞックが倉曎された堎合、シナリオを倉曎したす。



前回の蚘事で曞いたように、誰もがUIテスト手動テスト郚門ず開発者の䞡方で䜜業したす。 このプロセスが単玔で理解しやすいほど、それらに盎接関係のない人がテストを実行する頻床が高くなりたす。



しかし、私が䞊で曞いたように、十分に確立された機胜ずは異なり、A / Bテストは出入りしたす。 通垞のUIテストず同じ圢匏で蚘述した堎合、A / Bテストの完了埌、倚くの異なる堎所からコヌドを氞久に削陀する必芁がありたす。 リファクタリングのために、特にそれなしですべおが機胜する堎合、時間を割り圓おるこずが垞に可胜であるずは限りたせん。



それにもかかわらず、未䜿甚のメ゜ッドずロケヌタヌでクラスを成長させる気はありたせん;これにより、同じPageObjectsを䜿甚するのが難しくなりたす。 あなたの人生を楜にする方法は



その埌、PhpStormが私たちを救いに来たした䟿利なIDEを提䟛しおくれたJetBrainsの方々に感謝したす 。぀たり、この機胜です 。



぀たり、特別なタグを䜿甚しお、コヌドをいわゆるリヌゞョンに分割できたす。 私たちは詊したした-そしお私たちはそれが奜きでした。 1぀のファむルでアクティブなA / Bテスト甚の䞀時的なUIテストの䜜成を開始し、コヌドゟヌンを、このコヌドを将来配眮するクラスを瀺す領域に分割したした。



その結果、テストコヌドは次のようになりたした。







各領域には、特定のクラスに属するコヌドがありたす。 確かに他のIDEにも䌌たようなものがありたす。



したがっお、A / Bテストのすべおのバリアントを1぀のテストクラスでカバヌし、PageObjectメ゜ッドずロケヌタヌの䞡方をそこに配眮したした。 そしお、その完了埌、最初にクラスから倱われたオプションを削陀し、その埌、リヌゞョンに瀺されおいる内容に埓っお残りのコヌドを簡単に目的のクラスに配垃したした。



A / Bテストを閉じる方法



すべおのA / Bテストを䞀床にUIテストでカバヌしおカバヌするこずはできたせん。 䞀方、そのようなタスクはありたせん。 自動化の芳点からの課題は、重芁で長時間実行されるテストのみを迅速にカバヌするこずです。



それにもかかわらず、最小のA / Bテストでもリリヌスする前に、勝利バヌゞョンですべおのUIテストを実行し、すべおが正垞に機胜するこずを確認し、100のナヌザヌのために高品質の䜜業機胜を耇補したいず思いたす。



MySQLテヌブルを䜿甚した䞊蚘の゜リュヌションは、この目的には適しおいたせん。 実際、そこに力を加えるず、すべおのUIテストですぐに有効になりたす。 ステヌゞングテストのフルセットを実行する運甚前環境に加えお、これは個々のタスクのブランチに察しお起動されるUIテストにも圱響したす。 手動テスト郚門の同僚は、これらのリリヌスの結果を凊理したす。 たた、倱敗したA / Bテストにバグがある堎合、タスクのテストもドロップされ、問題はA / Bテストではなくタスクにあるず刀断できたす。 このため、テストず詊甚には時間がかかるこずがありたす誰も満足したせん。



これたで最小限の倉曎で管理しおおり、タヌゲット環境をテヌブルに指定する機胜を远加したした。







この環境は、既存のレコヌドでオンザフラむで倉曎できたす。 したがっお、個々のタスクのテストに合栌した結果に圱響を䞎えるこずなく、ステヌゞングにのみ力を加えるこずができたす。



たずめるず



そのため、このストヌリヌを開始する前に、UIテストはA / Bテストのメむンコントロヌルグルヌプのみを察象ずしおいたした。 しかし、私たちはもっず欲しいず思い、A / Bテストの他のバヌゞョンもカバヌする必芁があるずいう結論に達したした。



芁玄するず





これらすべおにより、テストの自動化を絶えず倉化する機胜に適合させ、カバレッゞのレベルを簡単に制埡および向䞊させるこずができ、レガシヌコヌドで倧きくなるこずはありたせん。



æ··controlledずした状況を䞀芋管理された秩序にもたらし、自分自身や同僚の生掻を簡玠化した経隓はありたすか コメントで共有しおください。 :)



ご枅聎ありがずうございたした そしお明けたしおおめでずうございたす



All Articles