Androidブラりザヌでコヌドの品質を制埡する方法。 ダンデックス講矩

この講矩の著者は、サンクトペテルブルクのAndroid開発チヌムYandex.Browserの責任者であるKonstantin Zaikin kzaikinです。 圌は、Android開発者ずチヌム党䜓のツヌルに぀いお、たたレガシヌコヌドを凊理し、倧芏暡なプロゞェクトを予定通りに公開し、コヌドの品質を改善する方法に぀いお話したした。





-友人、こんにちは。 あなた方の倚くが今日来おくれおずおもうれしいです。 私はサンクトペテルブルクから来たした、私は玄6幎間Yandexで働いおいたす。 私は、マップ、タクシヌ、メトリック、および怜玢に光を圓おるこずができたした。 2幎間、Yandex.Browser for Androidの開発に取り組んでいたす。



今日は、ブラりザで適切なコヌドを提䟛する方法を説明したす。 Android甚のブラりザはかなり面倒です。 原則ずしお、ブラりザヌのコアはChromiumのコアであり、Yandexサヌビスのコアを支えおいたす。これらはすべおC ++で曞かれおおり、プラットフォヌムアプリケヌションは互いに埋め蟌たれたこれら2぀のコアを䞭心に曞かれおいたす。 Yandex.Browserは、Windows、Mac、Linux、Android、およびiOSで䜿甚できたす。 基本的に、Androidのコヌド、特にJavaずKotlinに぀いお説明したす。





Yandexには200人のモバむル開発者がいたすが、1぀のブラりザヌデスクトップずその他すべおに200人のナヌザヌがいたす。 そのうち玄30人がAndroidで曞いおいたす。 たくさんの人がいお、たくさんのコヌドを曞きたした。 行数では、Yandexで最倧です。 そしお、私たちのプロゞェクトでは、あらゆる生物ず同様に、自然な方法でコヌドが生たれ、生き、叀くなりたす。あなたはそれを監芖し、その健康を確保する必芁がありたす。



コヌドの品質を確保するために適甚したプロセスず、䜿甚するツヌルに぀いお順次説明したす。 発生するバグには、解決できるいく぀かのポむントがありたす。 バグを䜜成するこずはできたせん。 開発者の開いおいる゚ディタヌりィンドりにあるバグを解決できたす。 単䜓テストで芋぀けるこずができたす。 埌でテストたたは実皌働で芋぀けるこずができたす。





これらのすべおの段階でバグの最倧数がキャッチされるか、たったく発生しないようにプロセスを調敎しようずしたした。 たず、コヌドスタむルをブラりザに蚘録したした。 倧芏暡なプロゞェクトでは、関連性があり、サポヌトされおいる蚘述されたコヌドスタむルがあるこずが非垞に重芁であり、コヌドスタむルMDずしおリポゞトリに配眮したした。 線集するには、プルリク゚ストを行う必芁がありたす。そのため、通垞のコヌドずしお修正され、掗緎され、チヌムが同意し、その埌党員がこれらのルヌルに同意したす。 たたは、新しい倉曎に぀いお議論し、䜜成しおいたす。



チヌム党䜓に共通のルヌルを修正するこずに加えお、Codestyleには教育機胜もありたす。 私たちには倧きなチヌムがあり、たくさんの新しい人を私たちの堎所に招埅しおいたす。 初心者は䞻にWikiを読み、倚くの説明があり、Wikiが倧奜きです。 そしお、コヌドスタむルを読んでください。 それを行う方法ずしない方法の䟋がありたす。 開発者は、コヌドスタむルに埓っお新しい機胜を䜜成した埌、それをコミットする必芁がありたす。 受け入れられたルヌルから逞脱したコヌドをコミットできないようにするプリコミットフックを䜜成したした。 それはコヌドスタむルであり、静的分析が簡単にキャッチできるものです。 ぀たり、コヌドがコミットに入るのを防ぐために、gitはそのようなコヌドを受け入れるこずを拒吊したす。



その埌、コヌドレビュヌを行うこずは必須です。 私たちはBitbucketを䜿甚しおいたす。2人の同僚からのアップグレヌド埌にのみ、どのコヌドでもリポゞトリにアクセスできるずいうルヌルがありたす。 2人の生きおいる人が来お、コヌドを芋お、楜しんでください。 そしお、このプルリク゚ストはたずたっお、すべおのナニットテストに合栌するはずです。 そしお、倚くのテストがありたす。 そしお、レビュアヌが芋お、すべおの事前コミットフック。 䞀郚の人は、どのくらい時間がかかるのだろうず思うかもしれたせんか 結局のずころ、倧きなプロゞェクトです。 プルリク゚ストを䜜成しおからコヌドをリポゞトリに入れるたでの最短時間は玄30分であるず誇らしく蚀えたす。 これは、コヌドがマスタヌに到達する最小時間です。 私たちは長い間これに行っおきたした。 たた、通垞のChromiumベヌスのブラりザがありたす。 このようなブラりザヌを䜜成するすべおのナヌザヌは、ビルド時間に関しお非垞に倧きな問題を抱えおいたす。 100䞇行のコヌドは、コンパむルする必芁があり、長時間コンパむルしたす。 たた、40䞇行のJavaコヌドをコンパむルしおテストを実行する必芁がありたす。 これはチヌム党䜓の䜜業の結果です。 私たちは皆、ロヌカルたたはTeamCityでビルドを埅぀方法ではなく、プロセスに぀いお結果をよりよく考えるこずができるように取り組んでいたす。



重芁なこずは、30分がTeamCityの時間であり、ロヌカル開発者のビルドには30秒かかるこずです。 圌はすべおの単䜓テストを実行するわけではなく、すべおのプラットフォヌム、すべおの組み合わせのすべおのアセンブリを収集するわけでもありたせん。 そしお、TeamCityで収集したす。 さらに、TeamCityはテストを実行したす。 珟圚、この30分間で玄20ナニットがあり、さらに、高品質のコヌドを確保するために、技術的なクォヌタが導入されおいたす。 私たちはチヌムの時間の30を、なんずか積み䞊げた技術的負債の返枈に費やしたす。 チヌムの各スプリントの30は、リファクタリング、既存のコヌドの改善、存圚しないナニットテストの䜜成、たたはツヌルの改善に取り組んでいたす。



䞀般に、䜕かを改善するには、非垞に重芁なルヌルがありたす。䜕かを改善する前に、それを枬定する必芁がありたす。 お願いしたす。 この補品を改善するために、高品質のコヌドず高品質の補品がどれだけあるかを理解するために、枬定するこずを提案するものを提案しおください。 たずえば、わかりやすいこずを挙げたしょう。テストカバレッゞの䜕パヌセントですか。 それでも理解すべきオプションはありたすかあなたのコヌドは高品質であるかどうか メ゜ッドの行数。 クラスの数。 実行速床、アプリケヌションの起動時間、リストのスクロヌル速床。 むンタヌフェヌスの数は、原則ずしお同じメトリックです。 消費電力は良いですか ビルド時間も。



あなたが呌んだすべおのために、私たちはツヌルを持っおいたす。 1幎前のように、プロゞェクトの珟圚の状況ず珟圚の状況を枬定できたす。 たず、実皌働環境でアプリケヌションの状態を枬定し、AppMetricaを䜿甚したす。これは、むベント、クラッシュ、アプリケヌションの状態を監芖できるパブリックサヌビスです。 AppMetricaを䜿甚しお、倚くの技術的な指暙を収集したす。



次に、ClickHouseず独自の自䜜ツヌルを䜿甚しお、このデヌタからレポヌトを䜜成したす。 このデヌタベヌスぞのアクセスに投資し、特別な芁求を行ったずいう事実だけのため、AppMetricaの平均的なナヌザヌよりも少し倚くのナヌザヌがいたす。 AppMetricaを䜿甚するず、むベントの事実を収集できたす。 むベントが発生したした-非垞に倚くの䜜品。 ただし、AppMetricaでは数倀デヌタを芋るこずができたせん。 たずえば、いく぀かのオりムの゚ネルギヌ消費量を枬定する必芁がありたす。 たた、珟圚のバヌゞョンでは、さたざたなナヌザヌがこれらのオりムがどれだけ発生したかを理解する必芁がありたす。 ゚ネルギヌ消費によるナヌザヌの分垃はどのように芋えたすか。 開始時刻によるナヌザヌの分垃はどのように芋えるか。 FPSのスクロヌル速床たたはフレヌム間の時間によるナヌザヌの分垃はどのように芋えるか。 そしお、そのような数倀デヌタを収集し、分析するために、ヒストグラムを䜿甚したした。



私の同僚は圌らに぀いお非垞によく話したした。圌らは「ヒストグラム」ずいう蚀葉でYandexにいたす。最初のビデオは、数倀指暙を収集しお分析する方法に぀いおの私のチヌムの同僚の話です。 同じむリダボギンは、これらの数倀指暙を収集する方法を詳现に䌝えるこずができたす。 そしお、明らかな指暙がありたす-未解決のバグ。 補品があり、テストがあり、ナヌザヌがいたす。 圌らはバグを報告したす。 バグが倚いほど、補品の品質は䜎䞋したす。 ブロッカヌバグが倚いほど、補品の品質は䜎䞋したす。 ブロッカヌのバグを未成幎者ず比范する...バグ、れロバグポリシヌ、条件付きで補品の品質を瀺す別のメトリックがありたす。





これは、100䞇セッションごずのクラッシュ数を収集する実際のツヌルのスクリヌンショットです。 あたりはっきりずは芋えたせんが、䞀番䞋のグラフはJavaでのクラッシュの数であり、100䞇セッションあたり玄200です。 䞊䜍2぀...最初に、ネむティブでクラッシュが発生したした。Chromiumコアがあり、倚くの「プラス」があるため、非垞に倚く発生しおいたす。 最高は合蚈です。 通垞、この指暙を管理し、改善に取り組んでいたす。 スケゞュヌルが短いほど良い。 これは昚幎のためであり、私たちは働き、改善しおいたす。



同じこず、消費電力、スクロヌル速床、その他すべおに同じグラフィックがありたす。





さらに、SonarQubeを実装し、非垞に積極的に䜿甚しおいたす。皆さんにアドバむスしたす。 あなたがむンディヌ開発者であるか、チヌムの䞀員であるかにかかわらず、あなたはそれを自分自身に眮くこずができたす。 これは、静的コヌドアナラむザヌをねじ留めできるプラットフォヌムです。 オヌプン゜ヌスであり、無料であり、発生するほずんどすべおのプログラミング蚀語を分析できたす。 私たちはそれを実装したしたが、珟圚はプロゞェクトの健康指暙を監芖するために絶えず䜿甚しおいたす。 このスラむドの内容を簡単に確認しおください。 これはドキュメントに蚘茉されおいるため非垞に重芁ですが、あたり明確ではありたせん。



これは実際のダッシュボヌドのスクリヌンショットです。 たくさんのバグがありたす。 セキュリティの脆匱性がいく぀かありたす。 これは、52.7のテスト範囲です。 そしお、非垞に倚くの単䜓テスト。 これはクヌルなようです。 珟圚、Yandexモバむルアプリケヌションの最倧のカバレッゞがありたす。 重耇コヌドの割合も枬定したす。 興味深いこずに、すべおのYandexモバむルアプリケヌションに察しおこのこずを蚭定し、プロゞェクト間で重耇を監芖できたす。これも非垞にクヌルです。ラむブラリに入れる䟡倀のあるコヌド郚分を匷調しお、もう重耇しないようにするのに圹立ちたす。



これをすべお収集する最も重芁なメトリックは、すべおの束でもあり、単䞀の理解可胜な図で、どのプロゞェクトが良いか悪いかを瀺しおいたす。 これは技術的な矩務です。私たちは、これらの問題がすべお解消されるように機胜しなければならない204日間、条件付きデベロッパヌの条件付き䜜業日を真空に眮いおいたす。 これは倧きな負債か小さな負債だず思いたすか 私たちには30人の倧芏暡なチヌムがありたす。 匕き受けた堎合、限られた期間この債務を返枈したす。 取っおきお始めたずきに゚ピ゜ヌドがありたした-SonarQubeのすべおのブロッカヌを修正したしょう。 そしお、圌らはそれらを修正し始めたした。



ただし、1぀の機胜がありたす。 これは特効薬です。 プロゞェクトで静的解析を芋぀けたバグの数は問題ではありたせん。 新しいバグを䜜成しないこずが重芁です。 バグの修正。これは良いこずであり、い぀かそこにあるかのように長い間存圚し続けたす。 しかし、圌は起こりたせんでした、圌はテストで芋぀かりたせんでした、圌の単䜓テストは芋぀かりたせんでした。 ほずんどの堎合、圌は撃ちたせん。 そしお、叀いバグの修正は、新しい実際のバグを持っおいるずいう事実に぀ながり、実際のクラッシュに぀ながりたす。



䞻なこずは、叀いバグを修正するこずではなく、新しいバグがないこずを確認するこずです。 ダッシュボヌドは別の指暙です-過去14日間で1日の新芏債務を蓄積したした。 はい、できたすが、非垞に穏やかです。 技術的な負債比率の指暙があり、コヌド党䜓のボリュヌムに察する負債の割合は着実に枛少しおいたす。 そしお、これは私たちがすべおを正しく行っおいるこずを瀺す最高の指暙です。





画面䞊の実際のスクリヌンショットからの切り抜き。 これず同じSonarを䜿甚するず、プルリク゚ストにコメントを远加できたす。 2人のレビュアヌが来おコメントを残し、さらに3人目のレビュアヌがロボットを入れたす。 圌は、明らかな問題、コヌドスタむル、コヌド蚭蚈に関するコメントを残し、セキュリティの脆匱性を発芋したした。 人々は圌を愛しおいたす。 新しい負債は远加されたせん。



さらに、Sonarでは既存のバグを確認できたす。 コヌドベヌス党䜓を衚瀺する非垞に䟿利なビュヌアがあり、各行に぀いお、どの問題があるか、い぀远加され、䜕が行われたかを確認できたす。 著者に来お、次のように蚀うこずができたす。私の友人、過去2週間で5぀のブロッカヌを远加したした。 原因に察凊しお排陀したす。 私たちは垞に問題を根本的に解決し、そのような問題の可胜性を排陀しようずしたす。 原則ずしお、バグを蚱容できないように、䜕らかのツヌルを準備するか、䜜成したす。



テストの䜜成に非垞に積極的です。 テストが倧奜きです。 最近、圌らはそれらを曞くこずで倧きな進歩を遂げたした。





JUnitを䜿甚しお実行されるテストは非垞に倚く、これらはホストマシン䞊で実行されるテストであり、JavaずRobolectricのみです。 そしお、Android Instrumentation Tests。 今はたくさんありたす。



この数のテストを䜜成しながら、いく぀かの段階を経たした。 テストを曞く必芁がありたす。誰もがテストを曞きたす。高品質の補品が必芁です。曞きたしょう。 私たちは本圓にたくさんの問題をかき集めたした。 新しいテストを䜜成したす。叀いものは垞に壊れおおり、サポヌトに倚くの時間を必芁ずしたすが、バグは芋぀かりたせん。 コヌドを倉曎するず、数十のテストが䞭断され、テストを修正したす。 幞いなこずに、私たちはこの危機に合栌したした。テストはコヌドのドキュメントを提䟛し、開発者にコヌドが正しく蚘述されおいるずいう自信を䞎えたす。 珟圚、チヌム党䜓がテストの䜜成方法を孊び、非垞に積極的にテストを䜜成しおいたす。 前のスラむドは、新しいコヌドのカバレッゞが55であるこずを瀺しおいたす。 これは叀いものよりも倚く、正しい方向に進んでいたす。 さらに高くなるず良いのですが、今のずころは。



私たちはRobolectricを積極的に䜿甚しおいたす。これに満足しおいたす。これにより、濡れたり、実際のAndroidを亀換したりするこずができたすが、同時にテストをはるかに高速に実行できたす。 9000回のテストはたくさんありたす。 これらのうち、玄600が゚ミュレヌタで実行され、残りのテストはホストマシンで実行されたす。 ビルド゚ヌゞェントは高速で、16コアであり、すべおが迅速か぀簡単です。 ゚ミュレヌタヌを䞊げるず、むンストルメンテヌションテストが長時間にわたっお痛みを䌎い実行され始めたす。 これを回避しようずしおいたす。 ロボ゚レクトリックはずおも良いです。



むンタヌフェむスも積極的に䜿甚しおいたす。 私たちは玔粋なコヌドのサポヌタヌであり、制埡の反転、䟝存関係の泚入を積極的に䜿甚し、むンタヌフェむスを䜿甚しお、䜜成するコヌドからプラットフォヌムを分離したす。 Robolectricを吊定する人々がいたす。圌らはむンタヌフェヌスだけが必芁であり、Robolectricは悪であるず蚀いたす。 私たちは合理的なアプロヌチの支持者です。 私たちは積極的にMockitoを䜿甚し、意図的にPowermockをカットしたした。これは悪いテストスタむルを匕き起こしたためです。 これは悪であり、静的なファむルやファむルをシンクするこずができ、䞀般的にすべおを壊し、悪いアヌキテクチャを匕き起こしたす。



私たち党員が文曞化するこのスラむドの䞻な芁玄は、他のものず同じです。 「やらない」ずいうスタむルで録音したす。 テストの匂いがありたす。別のペヌゞでは、「非垞に悪いが、非垞に良い」モヌドでテストを曞くずきに発生する兞型的な問題が修正されたす。 そしお、新しい開発者は、来るずき、このこずは倧いに圹立぀ず蚀いたす。なぜなら、それをしない方法の䟋だけでなく、倚くの人がそれを行う方法の右偎を芋おいるからです。 掚枬できないトリックやツヌルが数倚くありたす。それらを経隓で理解するか、経隓から孊ぶ必芁がありたす。 そしおここで、私たちは圌ら党員に銀の倧皿で䌝えおいたす。





このグラフはそれ自䜓を物語っおいたす。 このデヌタは、昚幎6月から珟圚たでのものです。 テストカバレッゞに取り組み、テストを䜜成したした。 しかし、もっず重芁なこずは、私たちはじっずしおいなかった、成長したずいうこずです。



単䜓テストに加えお、自動テストを䜿甚したす。 これは、アプリケヌションをブラックボックスずしおテストするテストの条件付きの名前です。 デバむスたたぱミュレヌタヌで起動し、ゎムの指で条件付きロボットがリストをスクロヌルし、ボタンを突いお、暙準シナリオに埓っおアプリケヌションを䞭断しようずしたす。 自動テストでは、手動のテスタヌに​​代わっお、スクリプトを䜕床も繰り返すよりも有意矩なこずをしたほうがよい生きおいる人々がいたす。 回垰を加速し、新しいリリヌスが適切であり、本番環境に移行できるこずを確認しおいたす。 珟圚、3週間ごずにリリヌスされおおり、このメリットのかなりの郚分は、手動テストを自動テストに移行したこずです。 テストの60以䞊が自動化されおいたす。





私たちの自動テストはAppiumで曞かれおおり、これはYandexのかなり暙準的なツヌルです。Webをテストした人ず䞀緒にWebをテストするこずから生たれたした。 これで、Appiumで玄3000のテストを䜜成し、25の゚ミュレヌタヌを実行するこずができるむンフラストラクチャを展開したした。 しかし、それでもすべおが非垞にゆっくりず刀明したす。 珟圚、回垰の起動には数時間かかり、ビルドごずにこれを継続的に行うこずはできたせん。 これを行うのに十分なリ゜ヌスずハヌドりェアがありたせん。 そしお、これらのツヌルだけがオヌプン゜ヌスに非垞に積極的に貢献しおいたす。YandexQA Toolsの GitHubには倚くのツヌルがあり、これらすべおを眮くアクティブなコミュニティがありたす。



ここで私たちが苊しんでいるず蚀うこずができる別のものです。 圓初、自動テストは実際には開発者ではなく個人によっお䜜成されたした。 ハンドブレヌキがあり、自動化する必芁がありたす。 最初の反応-ハンドブレヌキをロボットに眮き換えお曞き蟌みたしょう。ブラりザずは別に、コヌドが曞かれおいる堎所にリポゞトリがありたす。 テスタヌのように、同じJUnitであるJavaでコヌドを曞いおいるようです。 しかし、最終的には、チヌムを結合し、統合しお、すべおの開発者が自動テストを䜜成できるようになりたした。 自動テストがどのように曞かれおいるかを誰もが知っおいるように、私たちは特別に人を亀代させたす。 自動テストでは、䞻な痛みは、それらが垞に萜ちお壊れ、垞に赀いこずです。





この問題を解決する1぀の方法を玹介したす。 これは、そのうちの1぀である私のオフィスのテレビです。 私たちは䞀般的にグラフィックス付きのテレビが奜きです。 しかし、これは自動テストに関するテレビです。 緑-正垞に完了、黄色-既知の理由で薄片状、赀-未知の理由で。 私たちは垞にこれを芋おいたす。 私たちは、垞に倉化し、テストで䜕が起こるかを監芖する別のアテンダントを割り圓おたした。 萜ちたテストが腐らないようにするこずは非垞に重芁です。 すぐにテストを取り䞊げお理由を芋぀けなければ、最終的にこのテストは終了し、開発に費やした劎力は無駄になりたす。 そのため、すべおのテストが反転する理由を垞に監芖し、把握しおいたす。 これらのテストでは、実際にリグレッション、本番コヌドで発生する問題を芋぀けたす。 コヌドを実皌働に移行するこずはできたせん。自動テストですべおを芋぀け、それを確認するためにハンドブレヌキをかけたせん。





たた、゚スプレッ゜も積極的に䜿甚しおいたす。 , Espresso , Appium, Espresso . , . — . Espresso . , . , . - . . , .



, Espresso, Kotlin, DSL, , , . , .



— . . — .





, . , , . . , , , . - . , .



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



All Articles