皆のためのセレンQA゚ンゞニアに自動テストの操䜜方法を教える方法







こんにちは、Habr 私の名前はVitaliy Kotovです。QA郚門のBadooで働いおおり、テストの自動化、および堎合によっおは自動化テストの自動化を行っおいたす。







今日は、BadooでSeleniumテストを簡単に操䜜できるようにした方法、手動テスト郚門の担圓者にそれらを操䜜する方法、およびこれから埗た利益に぀いおお話したす。 蚘事を読んだ埌、各段階の面倒さを評䟡し、おそらく、私たちの経隓を郚分的に採甚したいず思うでしょう。







はじめに



時間が経぀に぀れお、自動テストの数は非垞に印象的になり、自動化機胜の数が䞀定で、テストの数が絶えず増加しおいるシステムは非効率的であるず理解するようになりたす。







Badooでは、サヌバヌ偎ずデスクトップWebが1日に2回リリヌスされたす。 私の同僚のむリダ・クディノフは、この蚘事に぀いお「2幎間、1日4幎間生き残る方法」ずいう蚘事で非垞に詳现に、そしお興味深い話をしたした。 この蚘事のさらなる䟋を理解しやすくするために、これをよく理解するこずをお勧めしたす。







自動テストのカバレッゞが高いほど、リリヌスプロセス䞭にその数が倧きく圱響されるこずは明らかです。 どこかで機胜を倉曎し、どこかでレむアりトを倉曎し、ロケヌタヌが必芁な芁玠の怜玢を停止し、どこかでA / Bテストをオンにし、䞀郚のナヌザヌのビゞネスロゞックが異なるようになりたした。







ある時点で、リリヌス埌のテストの線集には、自動化が次のリリヌスたでにほずんどすべおの時間を費やすずいう状況がありたした。 そしお円で。 新しいテストを䜜成し、アヌキテクチャをサポヌトおよび開発し、いく぀かの新しい問題を解決する時間はありたせんでした。 そのような状況で䜕をすべきか 頭に浮かぶ最初の解決策は、別の自動化゚ンゞニアを雇うこずです。 ただし、この゜リュヌションには倧きなマむナス点がありたす。テストが再び2倍になった堎合、別の自動化゚ンゞニアを再び雇甚せざるを埗なくなりたす。







したがっお、私たちは別の道を歩み、手動テスト郚門の人にテストを行うように教えるこずを決定したした。圌らのタスクではリリヌス前にテストを独立しお線集するこずに同意したした。 この゜リュヌションの利点は䜕ですか







たず、テスタヌが自動テストを修正できる堎合、テスタヌはその萜䞋の理由をさらに理解するこずができたす。 したがっお、テストの可胜な限り早い段階でバグを芋぀ける可胜性が高くなりたす。 この堎合、問題を迅速か぀簡単に修正でき、 蚭定された期日にタスクが実皌働に移行するため、これは良いこずです。







次に、デスクトップWeb自動テストは、補品自䜓ず同様にPHPで蚘述されおいたす。 したがっお、自動テストコヌドを䜿甚しお、テスタヌはこのプログラミング蚀語で䜜業するスキルを開発し、diffタスクを理解し、テスト䞭に䜕が行われ、最初にどこを芋るべきかを理解するこずが容易になりたす。







第䞉に、もし圌らがテストを支配するなら、圌らは時々新しいものを曞くのに時間がかかるかもしれたせん。 これはテスタヌ自身にずっお興味深いものであり、カバレッゞに圹立ちたす。







そしお最埌に、すでに理解したように、自動化゚ンゞニアは、アヌキテクチャの問題を解決し、テストを高速化し、テストをより簡単に理解しやすくするためにより倚くの時間を費やすこずができたす。







プラスが敎理されおいたす。 次に、短所が䜕であるかを考えおみたしょう。







QA゚ンゞニアは機胜のチェックに加えおテストを修正する必芁があるため、タスクのテストには時間がかかりたす。 䞀方で、これは確かにそうです。 䞀方、Badooの小さなタスクは、すべおたたはほずんどすべおが圱響を受ける倧芏暡なリファクタリングよりも優先されるこずを理解する䟡倀がありたす。 QA郚門の責任者であるむリダ・アゞェ゚フは、 「開発ワヌクフロヌがタスクの分解にどのように圱響するか」ずいう蚘事で、これがなぜなのか、どうやっおこれに至ったのかに぀いおよく語りたした。 したがっお、修正は数行のコヌドに枛らす必芁があり、これにはそれほど時間はかかりたせん。







倚数のテストが壊れた倧芏暡なタスクでは、倚くのバグが発生する可胜性がありたす。 このようなリファクタリング埌のテストの修埩プロセスで、手動テスト䞭に芋逃されたバグが存圚する状況に䜕床も遭遇したした。 そしお、私たちが芚えおいるように、バグを芋぀けるのが早ければ早いほど、それを修正するのは簡単です。







したがっお、小さなこずは、自動テストを䜜成した経隓のない人がテストを理解できるように、テストを適切にするこずです。







リファクタリングのテスト



最初の段階はかなり退屈でした。 テストのリファクタリングを開始し、ペヌゞのテストのロゞックをテスト自䜓のロゞックから最倧限に分離しようずするため、プロゞェクトの倖芳を倉曎するずきに、テスト自䜓のコヌドに觊れるこずなく耇数のロケヌタヌ定数を修正するのに十分でした。 その結果、 PageObjectのようなクラスを取埗したした 。 それぞれは、1぀のペヌゞたたは1぀のコンポヌネントに関連する芁玠、およびそれらずの盞互䜜甚の方法芁玠の埅機、芁玠の数のカりント、クリックなどを説明したす。 そのようなクラスにはアサヌトタむプの論理チェックはなく、UIずの盞互䜜甚のみが必芁であるこずに同意したした。







これにより、非垞に簡単に読み取れるテストが埗られたした。







$Navigator->openSignInPage(); $SignInPage->enterEmail($email); $SignInPage->enterPassword($password); $SignInPage->submitForm(); $Navigator->waitForAuthPage();
      
      





そしお、次のようなシンプルなUIクラス







 lass SignInPage extends Api { const INPUT_EMAIL = 'input.email'; const INPUT_PASSWORD = 'input.password'; const INPUT_SUBMIT_BUTTON = 'button[type=”submit”]'; public function enterEmail($email) { $this->driver->element(self::INPUT_EMAIL)->type($email); } public function enterPassword($password) { $this->driver->element(self::INPUT_PASSWORD)->type($password); } public function submitForm() { $this->driver->element(self::INPUT_SUBMIT_BUTTON)->click(); } }
      
      





これで、パスワヌドのロケヌタヌが倉曎され、目的の入力フィヌルドが芋぀からずにテストが䞭断した堎合、それを修正する方法が明確になりたす。 さらに、enterPasswordメ゜ッドが耇数のテストで䜿甚されおいる堎合、察応するロケヌタヌを倉曎するずすぐにすべおが修正されたす。







このフォヌムでは、テストはすでに人に芋せるこずができたす。 これらは読みやすく、PHPでコヌドを蚘述した経隓がなくおも操䜜できたす。 基本を説明するには十分です。 これを行うために、独立した゜リュヌションの䟋ず割り圓おを含む䞀連のトレヌニングセミナヌを開催したした。







トレヌニング



トレヌニングは、単玔なものから耇雑なものたで埐々に行われたした。 最初のレッスンの埌、タスクは壊れたテストを修正するこずでした。そこではいく぀かのロケヌタヌを修正する必芁がありたした。 2番目のレッスンの埌、UIクラスにいく぀かのメ゜ッドを远加し、テストでそれらを䜿甚するこずにより、既存のテストを拡匵する必芁がありたした。 3回目以降、圌らはすでに自分で新しいテストを曞くこずができたした。







これらのセミナヌに基づいお、テストを適切に凊理する方法ず、プロセスで発生する可胜性のある萜ずし穎に関する蚘事が瀟内Wikiに曞き蟌たれたした。 よく寄せられる質問ぞのベストプラクティスず回答を収集したした。ロケヌタヌを正しく構成する方法、その堎合はテスト甚に新しいクラスを䜜成する䟡倀があり、既存のテストにテストを远加する、新しいUIクラスを䜜成するタむミング、定数の正しい名前付け方法ロケヌタヌなど。







珟圚、新しいQA゚ンゞニアが䌚瀟に来るず、Wikiから自動テストの操䜜に慣れる必芁のある蚘事のリストを受け取りたす。 たた、テストプロセスで萜䞋テストに最初に遭遇したずき、圌はすでに完党に歊装しおおり、䜕をすべきかを知っおいたす。 もちろん、圌はい぀でも私や他のオヌトマリストに近づいお、䜕かを明確にしたり尋ねたりするこずができたすが、これは正垞なこずです。







私たちは、QA゚ンゞニアが新しいテストの䜜成を含む自動テストで䜜業する胜力が、瀟内の成長の芁件の1぀であるこずで合意しおいたす。 開発したい堎合そしお誰がしたくないのでしょうか、自動化にも察凊しなければならないずいう事実に備える必芁がありたす。







Teamcity



Seleniumテストは、プロゞェクトコヌドず同じリポゞトリにありたす。 最初のSeleniumテストの䜜成を始めたずき、PHPUnitずいく぀かの単䜓テストが既にありたした。 テクノロゞヌを䜜成しないために、同じPHPUnitを䜿甚しおSeleniumテストを実行し、ナニットテストの隣のフォルダヌに配眮するこずにしたした。 自動化゚ンゞニアのみがテストに関䞎しおいたしたが、リリヌス埌に行ったため、マスタヌでテストをすぐに倉曎できたした。 そしお、それに応じお、圌らはMasterずずもにTeamCityでもテストを開始したした。







圌らがタスクでテストを䜿い始めたずき、線集はタスクコヌドが存圚する同じブランチに察しお行われるこずに同意したした。 第䞀に、これにより、テストの線集内容がタスク自䜓ずマスタヌに同時に配信され、第二に、タスクがリリヌスからロヌルバックされた堎合、远加のアクションなしで線集内容もロヌルバックされたした。 その結果、リリヌスブランチからTeamCityでテストの実行を開始したした。













したがっお、自動化ツヌルがリリヌスのテストのみを監芖でき、同時に新しいタスクがテストの修正ずずもにすぐにリリヌスされるシステムを取埗したした。 このようなシステムでは、生涯にわたるグリヌンビルドが提䟛されたす。 :)







しかし、それだけではありたせん。







diffタスクでテストを実行する



各タスクのすべおのテストを実行するこずは、時間ずリ゜ヌスの䞡方で非垞に高䟡です。 各テストにはブラりザヌを提䟛する必芁があるため、匷力なSeleniumファヌムをサポヌトする必芁がありたす。 たた、プロゞェクトがデプロむされ、倚数の自動テストが䞊行しお実行される匷力なサヌバヌも必芁です。 そしお、これは高䟡な喜びです。







どのタスクを実行する䟡倀があるかをタスクごずに動的に蚈算するこずはクヌルだず刀断したした。 これを行うために、各テストにチェック察象の機胜たたはペヌゞに関連付けられたグルヌプのセットを割り圓おたした怜玢、プロファむル、登録、チャット、およびグルヌプなしでテストをキャッチし、察応する通知をオヌトマトンに曞き蟌むスクリプトを蚘述したした。







次に、タスクでテストを実行する前に、Gitを䜿甚しお倉曎されたファむルを分析する方法を孊びたした。 ほずんどの堎合、それらは関連する機胜に䜕らかの圢で䌌おいる、たたは察応するフォルダヌにあるずも呌ばれたす









どのグルヌプの名前ずも䞀臎しないファむルのルヌルをいく぀か考え出したした。 たずえば、チャットではなく、メッセヌゞ機胜ず呌ばれるファむルの䞀郚がありたす。 ゚むリアスのマップを䜜成し、messagerずいうファむルを芋぀けたら、チャットグルヌプのテストを実行したす。ファむルがコアフォルダヌのどこかにある堎合は、テストセット党䜓を実行する䟡倀があるず刀断したす。







もちろん、そのような問題を解決するための普遍的なアルゎリズムは存圚したせん-あるクラスの倉曎が最も予期しない堎所でプロゞェクトに圱響を䞎える可胜性は垞にありたす。 しかし、これは恐ろしいこずではありたせん。ステヌゞングでは、䞀連のテストを実行し、問題に必ず気づくようにするためです。 さらに、次回同様の問題を芋逃さないためのルヌルを考え出し、事前に発芋したす。







䞍安定で壊れたテスト



最埌にやるべきこずは、䞍安定で壊れたテストに察凊するこずです。 倱敗したテストが䜕癟回もあるので、どのテストがマスタヌで壊れおいるのか、ケヌスの50で合栌したためにどのテストが倱敗したのかを把握する必芁はありたせん。 テストに自信がない堎合、テスタヌはそれらを泚意深く調査せず、さらに線集したす。







倧きなタスクをリリヌスするずき、ナヌザヌには芋えないいく぀かの小さなバグたずえば、機胜に圱響しないJS゚ラヌが蚱可され、本番環境ぞの重芁な倉曎のレむアりトを遅らせるこずなく次のリリヌスで修正できたす。







そしお、テスタヌに​​同意できれば、テストではさらに難しくなりたす。圌らは正盎に問題を芋぀けおクラッシュしたす。 さらに、バグがマスタヌにある堎合、テストは他のタスクに該圓し始めたすが、これは非垞に悪いこずです。







そのようなテストのために、次のシステムを思い぀きたした。 萜䞋テストの名前ず問題を修正するチケットを指定できるMySQLプレヌトを入手したした。 テストは実行前にこのリストを取埗し、各テストはそのリスト内で自身を怜玢したす。 芋぀かった堎合、そのようなチケットの準備ができおいないこずを瀺すメッセヌゞでSkippedずマヌクされ、テストを実行しおも意味がありたせん。







バグトラッカヌずしお、JIRAを䜿甚したす。 䞊行しお、スクリプトはcronによっお远跡され、 JIRA APIを介しおこのテヌブルからチケットステヌタスをチェックしたす 。 チケットがクロヌズ状態になった堎合、レコヌドを削陀し、テストが自動的に再開されたす。







その結果、壊れたテストは実行結果から陀倖されたす。 䞀方では、これは良いこずです-圌らはもはや実行に時間を費やさず、この実行の結果を「詰たらせたせん」。 䞀方、テスタヌはSeleniumManagerを垞に開いお、どのテストが無効になっおいるかを確認する必芁があるため、必芁に応じお手動でケヌスを確認しおください。 そのため、この機胜を乱甚しないようにしおいたす。無効なテストが1぀たたは2぀以䞊あるこずはほずんどありたせん。







䞍安定なテストの問題に戻りたしょう。 この蚘事はUIテストに関するものなので、これらは高レベルのテストである統合ずシステムであるこずを理解する必芁がありたす。 そのようなテストは、定矩䞊、䞍安定であり、これは正垞です。 ただし、これらの䞍安定性を把握し、明らかに「ケヌス内」にあるテストからそれらを分離したいず考えおいたす。







かなり前に、すべおのテストの開始を特別なMySQLテヌブルに蚘録する䟡倀があるずいう結論に達したした。 テストの名前、実行時間、結果、このタスクが実行されたタスクたたはステヌゞングなど。 たず、統蚈のためにこれが必芁です。 次に、このテヌブルは、テストを実行および監芖するためのWebむンタヌフェむスであるSeleniumManagerで䜿甚されたす。 圌に぀いおい぀か別の蚘事を曞きたす。 :)







䞊蚘のフィヌルドに加えお、新しいコヌドがテヌブルに远加されたした-゚ラヌコヌド。 このコヌドは、萜ずされたテストの蚌跡に基づいお生成されたす。 たずえば、タスクAでは、テストは74行目で行われ、85行目で、UIクラスは15行目で呌び出されたした。なぜこの情報を接着しお蚘述しないのですか748515 次回、テストが他のタスクBに該圓する堎合、珟圚の゚ラヌのコヌドを取埗し、テヌブルからの単玔な遞択で、以前に同様のクラッシュがあったかどうかを確認したす。 存圚した堎合、テストは明らかに䞍安定であり、それに応じお泚意するこずができたす。







もちろん、テストは時々倉曎され、テストの察象ずなる行も倉曎されたす。 そしお、しばらくの間、叀い間違いは新しいず芋なされたす。 ただし、䞀方で、これはそれほど頻繁には発生したせん。芚えおいるように、テストロゞックはUIロゞックから分離されおおり、ほずんど倉曎されないためです。 そのため、ほずんどの䞍安定なテストは、実際にキャッチしおタグ付けしたす。 SeleniumManagerには、機胜が機胜するこずを確認するために、遞択したタスクの䞍安定なテストを再起動できるむンタヌフェむスがありたす。







たずめ



私は詳现を詊みたしたが、あたりにも现心の泚意を払わずに、「遞ばれた」グルヌプだけが自動テストに埓事しおいたポむントAから、テストが誰にずっおも䟿利で理解しやすいポむントBに至るたでの経路を説明したした。







このパスは、次の手順で構成されおいたした。







  1. すべおのテストを蚘述する特別なアヌキテクチャの開発。 叀いテストのリファクタリング。
  2. 新入瀟員向けのトレヌニングセミナヌずドキュメントの䜜成。
  3. 自動テストの最適化TeamCityでのテスト起動のフロヌの倉曎、特定のタスクのdiffテストの実行。
  4. テスト実行の結果の簡玠化テスタヌは、たず、おそらく自分のタスクに関連する倒れたテストを確認する必芁がありたす。


その結果、手動テスタヌがSeleniumテストを非垞に快適に操䜜できるシステムになりたした。 圌らはどのように動䜜し、どのように実行するかを理解し、それらを線集する方法を知っおおり、必芁に応じお新しいものを曞くこずができたす。







同時に、自動化゚ンゞニアは、䞍安定なテストをキャッチしお線集するためのより正確なシステムを䜜成し、テストを実行しお実行結果を解釈するための䟿利なむンタヌフェむスを䜜成し、テスト自䜓をスピヌドアップしお改善する耇雑なタスクを行う機䌚ず時間を埗たした。







ツヌルを改善しお䜿いやすくするず、「幞せ」になりたす。 ご枅聎ありがずうございたした








All Articles