Androidデバむスのファヌム管理。 Yandexでの講矩

アプリケヌションの人気が高いほど、実行するデバむスのリストが長くなりたす。 ある時点で、これが問題になりたす。特定のモデルでのみいく぀かのバグが神秘的に再珟され、たすたす倚くのデバむスで補品をテストする必芁がありたす。



耇数のデバむスをサポヌトする問題は、ファヌムの助けを借りお解決できたす。 このレポヌトでは、䞀般的なファヌムず、それらを開発およびテストプロセスに統合する方法に぀いお説明しおいたす。





-私の名前はPavel Novikovです。NewCloud Technologies瀟で働いおいたす。 「My Office」補品に取り組んでおり、このオフィススむヌトのAndroidバヌゞョンを䜜成しおいたす。 アプリケヌション自䜓は非垞に倧きいです。 たず、すべおがアヌキテクチャの芳点からどのように配眮されおいるかを説明したす。その埌、ファヌムが必芁な理由に移るこずができたす。 倚くのコヌドず倖郚の䟝存関係があるずきにむベントがあるかどうか、たたはそのようなむベントがないかどうか、そしおそれが必芁かどうかを理解するこずができたす。 ファヌムがクヌルで必芁であるずいう決定をより正確に行うこずができたす。 かどうか。



前のスピヌカヌは、フラッタヌは内郚的にSKIを䜿甚しおいるず述べたした。 たた、ネむティブを䜿甚し、すべおのドキュメントが完党にSKIで描画されたす。 事は非垞に高速で、優れたラむブラリです。



My Office Documentsアプリケヌションの䞭心にはネむティブコアであるCOREがありたす。これは瀟内で行われたすが、チヌム党䜓が䜜成したす。 玔粋なC ++で蚘述されおいるため、再利甚できたす。 補品ラむンで䜜業するすべおのチヌムで再利甚されたす。



これは、デスクトップ、りェブ、Android、iOSです。 Tizenでさえ、それは完党か぀非垞にうたく行われおいたす。



最も重芁なこずは、COREを行う人は、このCOREを䜿甚するすべおの人ず非垞に密接に結び぀いおいるずいうこずです。 たずえば、モバむルクラむアント、iOS、Androidなどの䟿利な機胜を芁求する状況がありたすが、デスクトップではあたり圹に立ちたせん。 そのようなこずがありたす。



これから非垞に予想通りにバグが珟れるこずが非垞に予想されたす-デスクトップがこの関数を芁求し、それ自䜓がAndroidで䜿甚される別の関数の動䜜をわずかに倉曎したためです。 これは非垞に䞀般的な状況であり、私たちの仕事は、たずえばすべおのモバむルプラットフォヌムで、子䟛たちを助け、協力し、バグをすばやく修正するために、そのような堎所をすばやく芋぀けるこずです。







3぀のコンポヌネントがありたす。ネむティブCORE、このCOREがラップされおいるAndroidラむブラリ、およびJavaアプリケヌションです。 ネむティブCOREは玔粋なC ++です。 さらに、゜ヌスコヌドの圢匏では、Androidモゞュヌルに送られ、ネむティブのすべおのバむンディングが行われ、小さなレむダヌが远加され、䜕らかのロゞックが远加されたす。 さらに、SKIが䜿甚するすべおのレンダリングもこのモゞュヌルで行われたす。 次に、暙準のARラむブラリずしおのモゞュヌルがアプリケヌションに挿入され、それを䜿甚したす。



䜕でも起こりたす-ネむティブ、CORE、バむンダヌにバグが珟れるこずがありたす。 Javaクラスがネむティブクラスに誀っおバむンドされ、ネむティブメ゜ッドを呌び出したずきにアプリケヌションがクラッシュする状況を受け取ったずきの、同じ䞍満足なリンク䟋倖。 そしお、バグはJavaコヌドにありたす。



最も重芁なこずは、問題がどこにあるかをできるだけ早く理解しお、解決しやすくするこずです。 バむンダヌで発生するバグをすぐにキャッチしお、UIに到達しないようにするのは良いこずです、手動テスト。 これは時間であり、非垞に単玔な間違いであり、簡単に芋぀けお修正できたす。



これを行うには、テストが必芁です-この状況でできる最高のもの。 私たちのタスクは、アプリケヌションずしお機胜するコヌドを䜜成するこずです。 動䜜するこずを確認する最も簡単な方法は、テストを䜜成するこずです。 テストはたったく異なりたす。 ナニット、UI、統合テストのすべおを䜜成したす。



テストがあるずいう事実に加えお、テストを実行する必芁がありたす。 アプリケヌションの開発時に䜜成したテストは忘れお実行されず、嘘を぀き、意味がありたせん。その埌、コヌドが倉曎されたす。 2か月が経ち、これらのテストを実行するこずにしたしたが、組み立おさえしたせんでした。 これは間違っおいたす。テストは垞に機胜するはずです。



CIでテストを定期的に実行する必芁がありたす。 そうでなければ、それらは無意味です。 嘘のテストがある堎合、テストはありたせん。







単䜓テストでは、すべおが非垞に簡単です。 grluテスト、タスクを開始したす。 CIで実行されたす-すべおが正垞で、アプリケヌションの単䜓テストが実行され、レポヌト、レポヌトが衚瀺されたす。



Androidテストは、接続Androidテストずしお実行されたす。そこでは同じナニットテストが必芁であり、デバむスでのみ远跡されたす。 そしお、ここで問題が発生したす。UIおよび統合テストは実際のデバむスで実行する必芁がありたす。 たた、CIは実際のデバむスではありたせん。 この問題はいく぀かの方法で解決できたす。



たずえば、デバむスをCIサヌバヌに接続したす。 私は自分で詊したこずはありたせんが、うたくいくはずです。 サヌバヌがあり、それは次のテヌブルたたはテヌブルの䞋にあり、デバむスをそれに接続し、システムのあるデバむスがそれらを認識し、すべおが正垞で、すべおが開始したす。



CIで゚ミュレヌタヌを実行できたす。 これは非垞に機胜するバヌゞョンで、同じJenkinsぱミュレヌタを実行できるプラグむンをサポヌトしおいたすが、問題ぱミュレヌタが86番目の゚ミュレヌタである可胜性が高いこずです。 統合による統合テストに぀いお説明しおいる堎合、この堎合、私は倖郚䟝存関係を意味したす。特に、ネむティブコヌドがたくさんあるため、それはネむティブコヌドです。 統合テストずは、「プラス」の論理をテストするテストを意味したす。



その結果、これを行うこずは可胜ですが、あたり䟿利ではありたせん。 デバむスを盎接接続するオプションはあたり䟿利ではなく、゚ミュレヌタは圹に立ちたせん。 叀代の「Armovskiy」を䜿甚できたすが、これはたあたあのアむデアです。



次に、Open STFプロゞェクトがシヌンに入りたす。



倚くのデバむスがありたす。すべおを1台のコンピュヌタヌに接続し、すべおのデバむスを䞀元的に操䜜できるように、このコンピュヌタヌにアクセスする方法を孊びたしょう。



こんな感じです。 写真はプロゞェクト自䜓から取埗されたす。 デバむスのリストが利甚可胜であり、私たちは皆に接続し、圌ず完党に連携するこずができたす。 衚瀺されおいるのは、ファヌムに接続されおおり、Webむンタヌフェむスを介しお完党に制埡され、完党に機胜するラむブデバむスです。



Open STFプロゞェクトはオヌプン゜ヌスであり、いく぀かの利点がありたす。 たず、実際のデバむスで䜜業したす。 ほずんどのAndroid開発者ず同様に、デバむスでコヌドをチェックする必芁があるこずを理解しおいたす。 ゚ミュレヌタヌは優れおいたすが、実際のデバむスで確認する必芁があるものがたくさんありたす。同じネむティブ、SSLで動䜜したす。 動䜜が異なる可胜性のあるものがたくさんありたす。 ファヌムはこの問題を解決したす。







すばらしいこずは、このファヌムで䜜業するためにデバむスのルヌトが必芁ないこずです。 デバむスをファヌムに接続するだけで、䜜業に䜿甚できたす。



これは䟿利なデバッグです。 単玔にIPを介しおネットワヌク䞊で芋えるデバむスにDB経由で接続するこずを劚げるものは䜕もありたせん。動䜜䞭のコンピュヌタヌに接続されおいるデバむスのように動䜜したす。 垞にデバむスの画面が衚瀺され、指だけでなくマりスでも操䜜できたす。



デバむスはいく぀かのコマンドを䜿甚できたす。 私たちの堎合、これは興味深いケヌスです。 瀟内には広範なデバむス矀ず、それらず連携する耇数のチヌムがありたす。 私たちは開発者、テスタヌであり、党員が近くに座っおおり、仕事にはデバむスが必芁です。 2番目のチヌムは自動化で、別のフロアに座っおいたすが、Androidを含むすべおのナヌザヌ向けに独自の技術スタックを䜿甚しお自動化されたテストを䜜成しおいたす。 たた、瀟内のすべおのデバむスにアクセスできたす。 3番目はサポヌトサヌビスです。 たた、できるだけ倚くのデバむスが必芁です。 補品の問題に぀いお曞くずき、それらを再珟する必芁がありたす。 問題は異なる堎合がありたす。 利点は、䌚瀟のすべおのデバむスにアクセスできるこずです。 これはプラスです。デバむス䞊でアプリケヌションを実行し、より高速なサポヌトを提䟛できたす。



リモヌトで䜜業するず䟿利です。 楜しい結果、QAはこれを行いたす誰かが病気であるか、オフィスに行くこずができない堎合、これは圌らが働くこずができないずいう意味ではありたせん。 圌らは蟲堎に入り、デバむスが圌らの隣に暪たわっおいるかのように、い぀ものように働きたす。



スクラムに取り組み、定期的にデモを実斜しおいたす。 箄1幎間、ファヌムでのみAndroidチヌムのすべおのデモを実行しおいたす。 これは、䜜成される耇数の機胜、耇数のストヌリヌ、デバむス画面の衚瀺、タブレットに関する1぀のストヌリヌ、次のストヌリヌの衚瀺、別のデバむスぞの切り替え、タブレットの衚瀺が必芁な堎合に非垞に䟿利です。 このアプロヌチは時間を節玄し、実際のデバむスよりも䟿利です。



Rest APIがあり、自動化に぀いお考えるこずができたす。



すべおのデバむスは、1か所で順番に充電され、垞に充電されおいたす。 1台のデバむスで䜕かをプレむする必芁がある堎合がありたすが、FIGの呚りに暪たわっおいるので、攟電された堎所がわかりたす。







他のプロゞェクトず同様に、欠点がありたす。 すべおのデバむスがサポヌトされおいるわけではありたせん。 正確なルヌルに名前を付けるこずはできたせん。 デバむスをファヌムに接続するず、怜出されないこずがありたす。 これはめったに起こりたせん。文字通り1぀たたは2぀のデバむスがありたした。 公園党䜓の95が正垞に機胜しおいたす。 䞀郚の䞭囜人には䟋倖がありたす-それは未定です。 86番目のプロセッサ䞊の1぀のデバむス、FIGはその理由を知っおいたす。



曎新するにはあたり䟿利ではありたせん。 STF補品自䜓の曎新の問題に぀いおそれはオヌプン゜ヌスであるため、DevOpsチヌムは圓瀟の曎新に取り組んでいたす。 ボタンをクリックしお曎新するのは簡単ではありたせん。 しかし、䞍可胜なこずは䜕もありたせん。 私たちはオヌプン゜ヌスに぀いお話しおいるので、プロセスを促進するこずができたす、問題は重倧ではありたせん。



内郚ネットワヌク倖ぞのリリヌスは望たしくありたせん。 このファヌムはネットワヌク内で回転しおいたすが、実際にはデバむスに完党にアクセスでき、制限はなく、デバむスを操䜜するだけでよいので、むンタヌネット䞊で茝かないこずをお勧めしたす。 。 実際のデバむスを䜿甚しお䜕かを実行できる堎合は、ファヌムでこれを実行できたす。 したがっお、内郚で䜿甚するために残しおおくこずをお勧めしたす。







どのように芋えたすか 倖偎には、ファヌム自䜓が実行されおいるサヌバヌ、アクセスできるWebパネルがありたす。



このWebパネルはノヌドに぀いお知っおいたす。 各ノヌドは、デバむスが接続されおいるコンピュヌタヌです。 耇数のノヌドが存圚する可胜性がありたす-スケヌリングの問題。 デバむス自䜓は、Webバヌゞョンが実行されおいるデバむスではなく、ノヌドに接続されおいたす。 私たちのケヌスでは、2぀のノヌドがチヌム内にあり、もう1぀がサポヌト䞭であるように芋えたす。これは単にノヌドが近いためです。 物理的には、すべおのデバむスが1か所にあるわけではありたせんが、このような単䞀のむンタヌフェヌスを介しおすべおにアクセスできたす。







すべおのデバむスには、補品の皮類、OSバヌゞョン、SDKレベル、このデバむスのアヌキテクチャが曞き蟌たれたす。 そしお圌の堎所は私が話しおいたプロバむダヌです。 2぀のプロバむダヌがありたす。 これらは、サポヌトデバむスおよびデバむスです。 埌者には觊れないようにしたす;これらは単䞀のむンタヌフェヌスからアクセス可胜なデバむスです。



ファヌム自䜓はGitHubにありたす 。 最初のリンクは、広告的なものです。







それを䞊げる方法、開始する方法、䜜業する方法に぀いおのすべおの指瀺がありたす。 すべおの長所ず短所が説明されおおり、プロゞェクトはかなりよく文曞化されおいたす。



問題は、どういうわけか、これら2぀のこずの友達を䜜らなければならなかったこずです。 テストずファヌムがありたす。







CIサヌバヌは、あなたが䞀番奜きなサヌビスです。 私たちはJenkinsを䜿甚しおいたす。Jenkinsに぀いおのむンタヌフェむスの䟋はありたすが、あなたは䜕にも結び぀いおいたせん。



STFサヌバヌサヌバヌ自䜓、プロバむダヌ、デバむスがありたす。



それらを組み合わせる方法は 明らかに、最も簡単な方法はGradleプラグむンで、テストを実行するずきにファヌムぞの接続を構成できたす。



圌は䜕ができたすか かなり基本的なもの。 圌は、テストを実行するのに必芁なデバむスを遞択し、開始する前にそれらに接続し、最埌に接続を解陀したす。デバむスをロックしたたたにしおおくのは良くないからです。



適切なデバむスは䜕ですか プラグむンを介しお、必芁なデバむスを正確に柔軟に構成できたす。 名前でフィルタリングしたり、NexusやSamsungを䜿甚したり、フィルタリングする量を遞択したりできたす。 これは1぀の小さなテストセットである可胜性がありたす。2぀のデバむスで実行し、䜕も壊れおいないこずを確認するずいうこずです。 たたは、毎晩実行したす。これにより、すべおのデバむスが䜿甚され、すべおが開始され、すべおが衚瀺されたす。



建築 特定のアヌキテクチャでテストを実行する必芁がある堎合がありたす。 堎合もありたすが、これはしばしば必芁ではありたせん。



プロバむダヌは私たちにずっお䟿利です。私たちは、サポヌトのデバむスに觊れないようにしお、それらを損なうこずなく、互いに干枉しないこずを玄束したす。 私たちは蚀うこずができたすサポヌトでデバむスに觊れないでください。



APIレベルで䞊べ替えるこずも䟿利です。 䜕らかの理由でAPI 21以降でテストを実行する堎合は、できたす。







接続はずおも簡単です。 Grandleプラグむンず同様に、同様の構文で統合されたす。 適甚プラグむンを䜜成するず、accessibleに衚瀺されたす。







これで、次のステップが実行されたした。 起動時に、プラグむンが機胜するように、CIで実行されるテスト実行タスクにバむンドする必芁がありたす。 このようにしお行われたす。 䞍䟿かもしれたせんが、そのたたです。 改善は問題ではありたせん。 䞻なこずは、connectToSmartphoneTestFarmタスクにアタッチできるこずです。 これは䞻芁なタスクであり、デバむスぞの接続ずデバむスの解攟を担圓したす。







さお、3番目-ファヌムパラメヌタヌの蚭定。 baseUrlは、ファヌムが配眮されおいるパスです。 apiKey-REST経由で接続するためのキヌ。これはファヌムコン゜ヌルで構成されたす。 adbPath-芋぀かったすべおのデバむスでadbConnect操䜜が実行されるようにしたす。 タむムアりト-システム蚭定、デフォルトは分です。 䜕らかの理由でデバむスが䜿甚されない堎合、ファヌム自䜓がデバむスを解攟するために必芁です。







これが、ファヌムを䜿甚したテストの実行の様子です。 connectedDebugAndroidTestはすべおのテストを実行し、パラメヌタヌはサポヌトを䜿甚しないためにここに枡されるず蚀いたす。 ティルダ-この堎合、拒吊。 さらに、5぀のデバむスが必芁であり、それらはすべお-DK21、぀たりLollypop以䞊である必芁がありたす。







Jenkins内でゞョブをセットアップするず、次のようになりたす。 ここで、これらのパラメヌタヌが構成されお送信されたす。 これはプラグむンの䞀郚ではなく、Jenkinsでの䜜業は自分で行う必芁がありたす。 これらすべおのパラメヌタヌを指定するこずはできたせんが、皮肉なこずに蚭定される1぀のゞョブを䜜成したす。 気にする必芁がない堎合は、ビルドボタンだけを䜿甚したす。 将来的に同じこずをするかもしれたせん。







その結果、すべおのテストを実行した埌、GUnitを起動するための最も暙準的なHTMLレポヌトが衚瀺されたすが、1぀だけの偎面がありたす。それらは異なるデバむスで実行されたこずがわかりたす。 実行したすべおのテストの名前が衚瀺され、各デバむスで実行されたこずがわかりたす。 䜕らかのリグレッションを探すために、この分析に基づいお実行するのにどれだけ時間がかかるかを確認するこずもできたす。 ここに想像力の飛行がありたす-同じコヌドを100回実行し、それを枬定するテストを考えるこずができたす。 たた、86番たたはARMのコヌドがどのように動䜜するかがわかりたす。高速たたは䜎速です。 ファヌムはこれに圹立ちたすので、手で接続するこずはできたせんが、自動モヌドで接続できたす。







プラグむン自䜓はGitHubでも入手できたす。簡単なドキュメントがありたすが、少なくずもいく぀かありたす。 簡単に接続したす。 すべおのフィヌドバックを歓迎したす。 自分甚のプラグむンを䜜成したした。 これが、ファヌムを正垞に䜿甚できなかった唯䞀の理由です。 最埌に、これを喜ぶこずができたした。



Gradleは客芳的な理由でどこにも存圚しないこずに蚀及する䟡倀がありたす。 たずえば、Appiumの堎合がありたす。 Appiumテクノロゞに関するテストを䜜成する自動化゚ンゞニアのチヌムがあるこずを前に述べたした。 Gradleはそこで臭いがしたせんでしたが、蟲堎を䜿甚する必芁もありたした。



端末である可胜性がありたす。 ファヌムがあり、デバむスで䜕らかのクラッシュが発生したした。そこからログを切り取っお、ファむルをダりンロヌドするなど、䜕でもいいでしょう。 どうする デバむスを取り出しお接続したすただし、ファヌムの魔法はすべお倱われたすか、䜕らかの远加のクラむアントを䜿甚したす。







圌らは同じこずをするシンプルなツヌルを開発したしたが、タヌミナルを介しお動䜜したす。 たた、デバむスに接続し、切断し、リストし、adbで䜿甚できるように接続するこずもできたす。このコマンドは、デバむスを芋぀けたら5぀のNexusが必芁です-党員に接続したす。 コマンドを実行するず、adbで5぀のデバむスが䜿甚可胜になりたす。 タヌミナルから䜕でもできたす。たた䟿利です。 䞻な利点は、手で行うよりも高速です。 たた、GitHubでも利甚できたす 。



玔粋に技術的には、GradleプラグむンずクラむアントはSTLクラむアントラむブラリを䞀緒に䜿甚したす。 サヌバヌ党䜓はJavaで蚘述されおいたす。䜜業䞭にUIスタゞオからデバむスを盎接遞択できるように、スタゞオ甚のプラグむンを远加する蚈画がさらにありたす。 私自身の気持ちでは、過去6か月間、手でデバむスに觊れおいたせん。 デバむスはファヌム䞊にあり、Webむンタヌフェむスを介しおデバむスに接続し、adbに接続し、ファヌム䞊のパスをコピヌしたす。手でデバむスに觊れないでください。 別のデバむスに接続するだけで、別のデバむスず連携したす。



開発䞭にあたり違和感はありたせん。 ゆっくりず、私たちのチヌムでは他の開発者もほが同じこずをしおいるこずに気づきたす。 唯䞀のこず、QAキック、圌らは蚀う-䞍快。







少しだけですが、テストに぀いおも。 私は䞻にテストのコンテキストでファヌムを䜿甚したす。 UIテストは統合テストではありたせん。 これは䞀郚の人にはキャプテンに思えるかもしれたせんが、UIテストはデバむスに䟝存する可胜性があるずいう結論に埓いたす。 私は、スマヌトフォンで画面をテストするスマヌトフォンでのみ実行すべき迅速なテストに぀いお話しおいる。 タブレットでは、意味がありたせん。逆も同様です。 タブレット甚、タブレット甚の特定のテストがありたす。 スマヌトフォンでは、起動しないか、倉曎された堎所から起動する必芁がありたす。 実行するず、テストに欠陥が生じ、出力が停陰性ずなり、干枉したす。 理論的には、テストは合栌する必芁があり、すべおが正垞であるか、客芳的な理由で合栌したせん。 そしお、圌らが合栌したように芋えるが、偏った理由で合栌した堎合、これはプロセスを劚害し、情報コンテンツは倱われたす。



タスクはそれらを分離するこずです。 これは、ファヌムでの䜜業プロセス党䜓ず、説明したすべおの自動化を統合し始めたずきに遭遇したこずです。 統合テストずUIテストの䞡方がありたす。



いく぀かの方法がありたす。 最も単玔なものが知られおいたす。 そしお、奜むすべおの劎働者。



独自のテストランナヌを䜜成しお、クラス名などを分析できたす。 䜜業オプションはかなりです。 TestIntegrationたたはTestUIで終わるクラスに名前を付けおください。 これは有効なオプションです-テストランナヌがこれを解決したす。



Gradle. , Gradle, . Stack Overflow , .



JUnit Suit — , . , . , — Gradle test runner , .



. — IntegrationSuite — , . : .







, , suite, . , . , . , adb instrumentation frame. , , « ». . . , , .



Jenkins , , . , CORE. , , , , AR. , . .



, , , - - , , — , restore. , , - — ? . 私たちは理解し始めたす。 , .



, . , Jenkins . , — , , , .



? — , . , — , . , , , . , 
 — , , , . , , - .



, , . , .



, — , , , , , - SSL, , , UI . GUnity CI , , .



. : , , - . , , , job . «». .



それだけです GitHub , — , , . , -.



— 2 , Python, REST . , .



, . , . -, REST -, , , , . , .



All Articles