モバむルアプリケヌションの構築に぀いお少し

画像



モバむルアプリケヌションのリリヌスバヌゞョンをビルドするずき、debug = falseを蚭定しおapkファむルを゚クスポヌトするこずになったのを思い出したす。 IDEがパフするのに2分かかり、完了です。 すべおの努力は、眲名蚌明曞のデヌタを指定する必芁性に焊点を合わせたした。 ぀い最近でした。 今では、そのアプリケヌションのアセンブリプロセスが非垞に倧きくなったため、すべおの操䜜を自分で突然実行する必芁があり、すべおを芚えお正しく実行しおも信じられない、1時間はかかりたせん。そしお、おそらく1日埌、セラピストは疲劎のために2週間の病気䌑暇を凊方する必芁がありたす。



だから、モバむルアプリケヌションを構築するプロセス。 特定のモバむルチヌムのCIポヌカヌ、人魚、その他の必須属性を含むに関する投皿を最近流行しおいるからではなく、これが私が埗た玠晎らしい経隓だからです。 Android甚のMail.Ru Mailで䜜業しおいる間、そしおこの可胜性はほずんど存圚しないため、私は別のチヌム、別のプロゞェクト、たたは別の䌚瀟で働きたす。



どのプロセスでも、重芁な決定は、アセンブリ党䜓の構築に基づいおシステムを遞択するこずです。 ビルドはビルドサヌバヌで凊理する必芁がありたす。 これは論理的です。 しかし、どちらを遞択するのですか



質問は曖昧です。誰もが自分の経隓、システムが盎面しおいるタスク、および所有しおいるリ゜ヌスに基づいお1぀たたは別の゜リュヌションを遞択したす。 無料の゜リュヌションが奜きな人は、マネヌゞャヌに幎間N000ドルが必芁だったこずず、それなしではできない理由をマネヌゞャヌに説明する必芁がないためです。 コミュニティの存圚や、これらの決定をすでに掻甚し、結果に満足しおいる膚倧な数のチヌムの経隓に刺激されおいたす。 芖点の数は、この質問をした人の数ず同じ傟向がありたす。 誰かの議論が真実である、たたは誰かの反察が無関係であるず蚀うこずはできたせん。 しかし、そのような問題に盎面した開発者の意芋がどうであれ、垂堎で人気のあるすべおの゜リュヌションは抂しお、セットアップの容易さ、関連システムずの統合、拡匵オプション、およびコミュニティたたはシステム開発者からのサポヌトのみが異なるこずに同意したす。



䞀般に、ビルドサヌバヌの遞択は、個別のholivarのトピックです。 AtlassianのBamboo Build Server゜リュヌションを遞択したずしか蚀えたせん。 䞻な理由はいく぀かありたすが、そのうちの1぀は、プロゞェクトで䜿甚する課題远跡システムずの統合の容易さ、およびコヌドレビュヌシステムずリポゞトリホスティングです。 みんな玠晎らしいです。すべおが䟿利で、すべお手元にあり、最も重芁なのは、提䟛されるほずんどすべおの゜リュヌションずオプションが、チヌムの開発プロセスに完党に適合するこずです。



竹



Bambooは非垞に䞀般的な゜リュヌションであり、䞖界䞭の膚倧な数のチヌムで䜿甚されおいたす。 このCI / CDツヌルの䜜業スキヌムの詳现は公匏ドキュメントWebサむトで芋぀けるこずができたすが、甚語の違いを避けるために、このドキュメントの䞀郚を無料で翻蚳できるようにしたす。



Continuous Integrationサヌバヌのタスクは、プロゞェクトのテスト環境ぞのアセンブル、テスト、デプロむのすべおの䜜業を行うこずです。 CIサヌバヌはリポゞトリず通信し、プロゞェクトの特定のリビゞョンを受け取り、必芁なすべおのアクションを実行し、完成したアセンブリ結果をプロゞェクトチヌムに提䟛したす。







プロゞェクト
  • 1぀以䞊のビルドプランで構成されたす
  • プロゞェクトのすべおのビルド蚈画に関するレポヌトを提䟛したす
  • 他のアプリケヌションJira、Fisheye、Crucible、Stashにリンク
ビルドプラン

蚈画
  • 1぀以䞊のステヌゞで構成されたす
  • すべおのステヌゞが順番に実行され、同じリポゞトリを䜿甚したす
  • プロゞェクトの他のビルドプランに応じお、ビルドを起動するためのルヌルが含たれおいたす
ステヌゞ

ステヌゞ
  • 1぀以䞊の䜜品で構成されおいたす
  • 䞊行しお䜜業を実行したす。フリヌビルド゚ヌゞェントでは、すべおの䜜業が正垞に完了するず完了したず芋なされたす
  • 埌続のアセンブリステヌゞのアヌティファクトを転送したす。
仕事

仕事
  • 1぀以䞊のタスクで構成されたす
  • 内郚のすべおのタスクは同じ゚ヌゞェントで順番に実行されたす
挑戊する

タスク
  • プロゞェクトのリビゞョンのチェックアりト、スクリプトの実行などの個別の操䜜。






倚かれ少なかれ同様の分離は、あらゆるアセンブリシステムで利甚でき、プロセス党䜓の構築に必芁な柔軟性を提䟛したす。 䞀芋、これは過床の耇雑さのようです。 Bambooを䜿い始めたばかりのプロゞェクトでしたが、埐々にすべおが萜ち着き、アセンブリプロセス党䜓のどの郚分をスケヌリングする必芁があるのか​​、孀立したたたにする必芁があるか、そしお提案されたコンセプトの枠組み内でかなり調和のずれた構造が明らかになりたした。



䞀般に、ビルドサヌバヌたたはCIサヌバヌは゜フトりェア開発プロセスの自動化の重芁な郚分であるこずをよく理解する必芁がありたす。 このモゞュヌルに、垂堎にリリヌスするためのアプリケヌションを準備するさたざたな段階ずレベルで実行する必芁があるすべおのタスクず䜜業を割り圓おるず、䞀皮のアプリケヌションリリヌスパむプラむンが埗られたす。 たた、特定のビルドに含たれるタスク、珟圚のリリヌスの段階、新しい機胜を統合する際に発生する問題、修正プログラムの準備の段階などを簡単に刀断できたす。



そのため、チヌムでこれがどのように行われたかの説明にスムヌズにアプロヌチしたした。



タスク



アセンブリプロゞェクトはいく぀かの段階に分かれおおり、珟圚の䞻なタスクを反映しおいたす。





これで、原則ずしお、あなたは物語を終えるこずができたすが、私は、おそらく、重芁性を瀺し、詳现を提䟛したす。



組立



珟圚、1぀のコヌドベヌスで3぀のプロゞェクトを䞀床に開発しおいたす。プロゞェクト1、プロゞェクト2、プロゞェクト3ず呌びたしょう。もちろん、3぀の補品はすべおメヌルクラむアントのカテゎリに属しおいるため、チェスずビデオプレヌダヌの違いほど根本的な違いはありたせん。 ただし、蚭蚈が異なり、機胜に違いがあり、さたざたな方法でサヌバヌず察話したす。 これらすべおが、アセンブリ、テスト、および補品開発の芁件を決定したす。



機胜ブランチのワヌクフロヌ



アセンブリは、バヌゞョン管理システムからのプロゞェクトリビゞョンのチェックアりトから始たりたす。 なぜこれに泚意を向けるのか-結局、誰もがチェックアりトできるのでしょうか 本圓に。 しかし、どのブランチから䟡倀がありたすか



補品で䜜業するために機胜ブランチワヌクフロヌを䜿甚したす。 このアプロヌチに぀いおは、個別に読むこずができたす 。 私にずっおの䞻な利点は、倉曎の分離です。 このアプロヌチでは、各開発者はタスクの䞀郚ずしお少なくずもプロゞェクト党䜓を匕き継いでテストに提䟛でき、QAがアプリを提䟛した堎合、テスト枈みの機胜コヌドは䞀般的なブランチに分類されたす。 このアプロヌチは、䞀連のアクションが定矩されおいるずいう事実により、リリヌスに入る欠陥のリスクを最小限に抑えたす。最初にチェックし、次にプロゞェクトのメむンブランチにマヌゞしたす。



これらの分離された倉曎を怜蚌するには、自動テストを実行できるアセンブリが必芁であり、QAチヌムの承認を埗るために手動テストに匕き枡したす。 Bambooは、すぐに必芁な゜リュヌションを提䟛したす。 これはブランチプランず呌ばれ、ビルドでメむンブランチたずえば、alphaが定矩され、指定されたテンプレヌトに埓っお䞀臎するすべおのブランチが機胜ブランチず芋なされるこずにありたす。 ビルドプランのクロヌンが䜜成されたすが、チェックアりトはビルドプランのメむンビルドからではなく、このブランチから行われるずいう違いがありたす。 こんな感じです。







ビルドプランを衚瀺するずきに、メむンブランチず既存のブランチを切り替えお、すべおのロヌカルステヌタスの結果を衚瀺できたす。



分岐蚈画自䜓は、タスクぞのリンクがあるこずを陀いお同じように芋えたす。







このようなフロヌでは、ブランチは䜜成された瞬間から必然的に廃止され始めたす。 メむンブランチずの競合を早期に怜出し、曎新されたコヌドをテストするには、開発䞭にブランチを垞に曎新する必芁がありたす。 Bambooは、プロゞェクトの構築を開始する前に、これを自動的に行う方法を知っおいたす。 競合が発生した堎合、アセンブリはベむク凊理されず、開発者は最初にブランチをアップグレヌドしおから、これらの倉曎をプッシュする必芁がありたす。 その埌、アセンブリの前に競合は発生せず、すべおが通垞どおり続行されたす。



補品フレヌバヌ



いく぀かのバリ゚ヌション、倉曎するリ゜ヌス、コヌド、構成で組み立おる必芁があるプロゞェクトがあるずしたしょう。 これを実装する方法にはいく぀かのオプションがありたす。 私たちは、アセンブリのすべおの条件、すべおの構成、およびその他の説明的な郚分をビルドスクリプトに含める必芁があるずいう事実に導かれたした。 私たちの堎合、 Gradleはこの問題を解決するのに理想的です。 優れたAndroidプラグむンがあり、耇雑なプロゞェクトを構築するための暙準および非暙準パラメヌタヌのほずんどを柔軟に構成できたす。



積極的に䜿甚およびサポヌトするビルドオプションの数を芋おみたしょう。







たず、3぀の䞻芁な補品フレヌバヌ、プロゞェクト1、プロゞェクト2、およびプロゞェクト3がありたす。



補品フレヌバヌは、補品ブランチを衚しおいたす。 ほずんどの堎合、これらは異なるパッケヌゞ、異なる眲名蚌明曞、異なる゜ヌスおよびリ゜ヌスを持぀異なるアプリケヌションです。 アプリケヌションごずに、いく぀かのビルドオプションがありたす。





合蚈



8ビルドタむプ* 3補品フレヌバヌ= 24アプリケヌションバリアント



なぜそんなに 答えようずしたす。 異なる環境で公開されおいる3぀の異なる補品で解決する必芁がある䞀般的なタスクの1぀は、分析を共有するこずです。 たた、これを行う必芁がありたす。そうしないず、アプリケヌションのアルファ版の統蚈情報が、プロダクションに存圚する画像を歪めたす。 クラッシュに関する統蚈を収集するには、 HockeyAppを䜿甚したす 。 その䞭には、異なるアセンブリオプション甚の個別のプロゞェクトがありたす。 これにより、たずえば、Project 1のクラッシュずProject 2のクラッシュ、ベヌタ版のリリヌスバヌゞョンなどを簡単に分離できたす。



プロゞェクトのbuild.gradleでは、この構成は次のずおりです。



productFlavors { project1 { ... android.buildTypes { alpha { hockeyApp { [appId: 'b45-------1b', note: project.issues, releaseType: '2'] } } beta { hockeyApp { [appId: 'c9d-------86', note: {''}, releaseType: '0'] } } publicBeta { ... } release { ... } } } project2 { ... android.buildTypes { alpha { hockeyApp { [appId: '1ac-------73', note: project.issues, releaseType: '2'] } } ... } } project3 { ... android.buildTypes { alpha { hockeyApp { [appId: 'dcd-------3c', note: project.issues, releaseType: '2'] } } ... } }
      
      





したがっお、アセンブリオプションにさたざたな倀を蚭定できたす。 リ゜ヌスず゜ヌスコヌドに関しおは、1぀の機胜を陀いお、ほが同じ原則がここで䜿甚されたす。異なるオプションのリ゜ヌスをマヌゞするこずが可胜です。 私たちのプロゞェクトには、すべおのアプリケヌションで同じリ゜ヌスがありたす-たずえば、手玙を曞くために画面をマヌクしたす。 そのようなファむルを各リ゜ヌスパッケヌゞにコピヌしお個別に保持する必芁がある堎合、曞き蟌み画面のレむアりトを倉曎する堎合、3぀のファむルを倉曎する必芁がありたす。 幞いなこずに、gradle + androidプラグむンはリ゜ヌスをマヌゞできたす。



これがどのように発生するかに぀いお詳しく説明したす。誰かが同じアプロヌチを䜿甚しお日垞のタスクを解決できる可胜性がありたす。



リ゜ヌスを持぀フォルダヌをいく぀か特定したしたこれらはすべおプロゞェクトのルヌトにありたす。







その結果、各ビルドオプションに぀いお、いく぀かのパッケヌゞをマヌゞしお、アプリケヌションのリ゜ヌスの共通セットを取埗したす。





これが基本です。 より詳现なカスタマむズを行うには、たずえば、特定のリ゜ヌス、テストビルドのコヌドなどを远加したす。 ゜ヌスコヌドを含むクロヌゞャ党䜓は次のようになりたす。



  sourceSets { main { manifest.srcFile 'AndroidManifest.xml' java { srcDir 'src' exclude '**/instrumentTest/**' } resources.srcDirs = ['src'] aidl.srcDirs = ['src'] renderscript.srcDirs = ['src'] res.srcDirs = ['res'] assets.srcDirs = ['assets'] } androidTest { manifest.srcFile 'src/instrumentTest/AndroidManifest.xml' java.srcDir 'src/instrumentTest/Java' } project2 { res.srcDirs = ['res_project2', 'res_project23'] java.srcDirs = ['src_common'] assets.srcDirs=['assets_ project2] manifest.srcFile 'res_ project23/AndroidManifest.xml' } project3 { res.srcDirs = ['res_project3', 'res_ project23] assets.srcDirs=['assets_project3'] java.srcDirs = ['src_project3'] manifest.srcFile 'res_ project23/AndroidManifest.xml' } project1 { res.srcDirs = ['res_project1'] java.srcDirs = ['src_common'] assets.srcDirs=['assets_project1'] manifest.srcFile 'res_project1/AndroidManifest.xml' } testingUi { manifest.srcFile 'ui_testing/AndroidManifest.xml' } }
      
      





小芏暡の堎合はそのたたです。 ビルドプロゞェクトの構成で、目的の.apkを取埗するために正しいタスクを実行する必芁がありたすたずえば、gradle assembleProject1PublicBeta。 圓然のこずながら、このような倚数のアセンブリオプションがある堎合、それらをすべお順番に収集するのではなく、このプロセスを䞊列化するこずにしたした。 合蚈で、アセンブリフェヌズの䞀郚ずしお実行される6぀の䞊行䜜業を受け取りたした。 各䜜品は、補品ごずに3぀の成果物を公開しおいたす。



ここたで読んだ人には質問があるず思いたすプロゞェクトをビルドするたびにベヌタ版を収集しおリリヌスするのはなぜですか 質問は本圓にずおも興味深いです。 私たちはすぐにではなく、長い時間をかけおこの決定に至りたした。 歎史的には、ベヌタビルドずリリヌスビルドは、コヌドが同じリビゞョンたたはコントラクトを䜿甚しお別々にビルドされおいたした。 そしお、このアプロヌチには倚くの問題があり、最も䞍愉快なのは、ベヌタ版の公開を決めた埌にアセンブリのステヌタスを知るこずです。 マヌフィヌの法則によれば、もちろん、ビルドは赀くなりたす。 䜕らかの理由で。 倉曎が倚いほど、アセンブリに悪圱響を䞎える可胜性が高くなりたすが、それに぀いおは䜕もできたせん。 ゚ラヌが発生しおから怜出されるたでの時間間隔のみを短瞮できたす。 たた、理想的なケヌスでは、共通のブランチから切り離しお実行したす。 プロゞェクトを無芖しお、ベヌタ版たたはリリヌス版のみをビルドし、自動化プロセスを芋るず、プロセス自動化を構築するためのアプロヌチ党䜓の䞻芁な品質指暙の1぀、おそらく、できるだけ早く問題を発芋する機䌚、そしお最も重芁なこずずしお、孊ぶ前にこれらの倉曎がどのように䞀般的なブランチに入ったか。



確認する



もちろん、モバむルアプリケヌションでの自動品質管理は、昚幎の傟向です。 私の経隓では、倚くの人にずっお、これは非珟実的なものです。 誰もがこれに぀いお話しおいるが、ほずんど誰も芋たこずがない。 私たちは2幎間プロゞェクト内でこのようなタスクに取り組んできたしたが、この間、開発者が察凊しなければならない埮劙な点のほずんどをかなり明確に理解しおきたした。 これらの問題ず解決策はすべお、モバむルアプリケヌションにずっおはかなり新しく䞍安定なセグメントですが、りェブは長い間このようになっおおり、十分な数の暙準化された解決策がありたす。



ほずんどの人が最初に持っおいる質問は、䜕を自動化するかです。 開発者が答えたすコヌドをテストし、マネヌゞャヌは機胜をテストする必芁があるずすぐに䞻匵し始めたす。 私はテストが䞡方であるず信じおいたす。



䞀般に、アプリケヌションに぀いお説明するず、すべおのチェックはいく぀かのカテゎリに分類されたす。





静的解析



静的アナラむザヌずしお、既補の゜リュヌションを䜿甚したす。 Androidの堎合、これはLintであり、最近ではAndroid固有のコヌド、マヌクアップリ゜ヌス、グラフィックスなどの品質を監芖できる非垞に効果的なツヌルになりたした。 ずりわけ、プロゞェクト内の契玄に固有の独自のチェックを远加できたす。 これらの契玄の1぀は、レむアりト関連のパラメヌタヌをスタむルに含めないこずです。 たずえば、プロパティlayout_margin \ layout_alignParentTopたたはそのようなもの。 構文の芳点からは、これらのプロパティをスタむルに入れるこずを犁止する人はいたせんが、この堎合、スタむル自䜓はUIコンポヌネントのビゞュアルコンポヌネントを決定するために䜿甚されず、マヌクアップファむルに曞き蟌むこずができない倀を栌玍するために䜿甚されたす。 ぀たり、スタむルは属性コンテナずしお䜿甚されたす。 第䞀に、LayoutParamsはただマヌクアップに関連し、第二に、これらの属性が曞き蟌たれおいるタグのコントロヌルではなく、その芪に関連しおいるため、これらは分離されるべき異なるものであるず刀断したした圌が暪たわっおいたす。



それを芋るず、コヌドを曞くためのガむド、マヌクアップリ゜ヌスがある、倚かれ少なかれ成功しおいるプロゞェクトには、このアプリケヌションに兞型的なタスクを解決するためのテンプレヌトがあり、そのようなものがたくさんありたす。 それらはコヌドレビュヌの段階で远跡され、文曞化され、営業日の初めに毎回思い出されたす。たたは、これらの願いに慣れたら、将来、誰もがそれを実珟できるず期埅できたす。 圌らが蚀うように、信じる人は祝犏されたすが、退屈な仕事をすぐに終わらせるために急いで、私自身はそれを忘れず、䜕も芋逃さないこずを知っお、私は個人的にはるかに快適に働きたす。 そのようなチェックを圢匏化し、䟿利なレポヌトを䜿甚しおアセンブリプロセスに远加する必芁があり、新しいタスクを実行する心配はありたせん。突然、すべおのチェックをスキップしたコヌドが芋぀かりたす。



小切手を曞くのは簡単で、楜しくさえありたす。 静的チェックを远加するプロセスでは、他の問題を静的に特定する方法に関する倚くのアむデアがすぐに珟れたす。 ガむドず公匏ドキュメントはLintに圹立ちたす。 Android Studioでルヌルを盎接開発できたす。



tools.android.com/tips/lint-custom-rules

tools.android.com/tips/lint/writing-a-lint-check



Javaコヌドの堎合、長い間発明された静的アナラむザヌもありたす。 すべおをリストするのではなく、FindBugsを䜿甚しおいるこずを䌝えたす。 ツヌルを遞択したずき、䟿利な圢匏、チェックするための十分な量のルヌル、および独自のルヌルを远加する機胜を取埗したかったのです。 珟時点では、閉じたカヌ゜ルの確認、アプリケヌションコンテキストでAccountManagerむンスタンスが垞に取埗されるこずの確認、むベントクラステンプレヌトの䜿甚時に呌び出される必芁があるonEventCompleteメ゜ッドの呌び出しなどの必芁な確認を蚘述したした。 内郚チヌムの配眮を決定する独自のルヌルを远加し、䞍泚意による䞀般的なミスを防ぐこずは、コヌドのレビュヌずテストの時間を短瞮し、そのような゚ラヌが少なくずも将来的にアプリケヌションの実皌働バヌゞョンに入らないようにする玠晎らしいプラクティスです。 小切手を曞くためのガむドずしお、 FindBugs、パヌト2カスタム怜出噚の蚘述を䜿甚したした。 独自のプラグむンを䜜成し、怜出噚を远加し、怜蚌プロセスでこれを䜿甚する方法を明確に瀺しおいたす。 レポヌトは、フォヌマットされたHTMLドキュメントたたはXMLレポヌトの圢匏で提䟛されたす。XMLレポヌトの圢匏では、簡朔に、堎合によっおは、゚ラヌが芋぀かったクラス/メ゜ッド、゚ラヌコヌド、文字列などが蚘述されたす。 これは通垞、自分でクリヌンアップしなかった堎所を理解するのに十分です:-)。



すごいですね。 膚倧なルヌルずよくある間違いが既に甚意されおいたす。それを補う機䌚がありたす。勇気を芋぀けお䜿い始めるだけです。



プロゞェクトでSNAPSHOTバヌゞョンのラむブラリを䜿甚しおいるこずに気づいたずき。 明らかに、これは、䜿甚するラむブラリにこれらの倉曎が加えられたずきに、タスクのブランチでのみ蚱可されたす。 コヌドがメむンブランチに泚がれた埌、プロゞェクトにはスナップショットが衚瀺されないはずです。 この堎合、理由は非垞に散発的であり、これらの゚ラヌのほずんどを特城づけおいたす。 タスクがテストされ、このバヌゞョンが完了のすべおの定矩に達したず刀断された埌、開発者はラむブラリをメむンブランチにマヌゞし、このラむブラリの新しいバヌゞョンを決定し、メむンプロゞェクトのバヌゞョンを倉曎するのを忘れたので非垞に満足しおいたした。 問題は、LintもFindBugsもビルドスクリプトをテストできないこずです。 さらに、これらのチェックがbuild.gradle自䜓に远加された堎合でも、それがどこで有効で、どこで有効でないかを知る必芁がありたす。 明らかに、これはブランチでは蚱可されおいたす。ブランチではラむブラリが倉曎されおいたすが、䞀般的なブランチに入った埌は受け入れられたせん。 これが、git pre-receiveフックを䜿甚しお、リポゞトリレベルでプロゞェクトで䜕が起こっおいるかを远跡する方法です。



倚くのチヌムが、バヌゞョン管理システムのレベルでプロゞェクトに適したルヌルを蚭定するのに時間を費やす必芁がないず考えおいるこずを知っおいたす。「愚か者はいたせん。誰もリポゞトリのすべおのブランチを削陀したせん」理由は、䟋えば、時間䞍足によるものです。 私たちにずっお、これは合栌段階です。もう少し時間をかける方が良いずいう決定に至りたしたが、補品の安党性ず品質には自信を持っおいたす。 これらの目的のために、事前受信フックは非垞にうたく機胜したす。倉曎が䞀般的なブランチに远加されおいるこずを確認し、この䞀般的なブランチのHEADに䞍芁なコヌドが含たれおいないこずを確認できたす。 最良の堎合、このようなチェックの存圚を誰も知るこずはありたせんが、実践が瀺すように、ランダムな゚ラヌは故意に突き刺すこずを可胜にするのに十分です。 Pre-receiveフックは、開発者が喜んで配眮したすべおの修正枈みTODOおよびFIXMEをチェックするのに最適ですが、修正するのを忘れおいたす。 たた、倚くの詳现を必芁ずする非垞に耇雑なバグがブランチで芋぀かったため、開発者が関心のあるすべおの機胜に新しいThrowableの出力を远加するこずで、兞型的なロギングの問題に完党に察凊したす。 私たちにずっお、ミスを远跡する胜力は、同じレヌキを再び螏たないこずを理解するために自動的に重芁です。 誰もが間違いを犯したす。それはあなたがその埌どのような結論を出すかだけが重芁です。 私たちの結論は、修正に加えお、これらの゚ラヌが匕き続きコミットされないようにするための努力が必芁であるずいうこずです。



単䜓テスト



ここでは、抂しお、すべおが圓たり前です。 クラスによっおは、クラスが意図したずおりに機胜するこずを確認するためのチェックが蚘述されおおり、同時にクラスのクラむアントに䜿甚方法の䟋を瀺しおいたす。 珟時点では、単䜓テストは実際のデバむスで実行されたすが、必芁に応じお実際の接続は確立されたせん。 ずころで、接続を確立する必芁性に぀いお開発者が特定のモゞュヌルをテストする方法を考えるずき、ほずんどの堎合、たず、珟圚の環境からテストを分離するためにクラスの䟝存関係を眮き換える方法を考えたす。 ネットワヌク接続の堎合、これは困難なタスクのように思えるかもしれたせん。ネットワヌクの盞互䜜甚は単䞀のメ゜ッド呌び出しに眮き換えられないため、濡れるにはロゞックの局が必芁です。 しばらくの間、アプリケヌションコヌドでフックを䜿甚しおサヌバヌの応答を眮き換え、それを䜿甚しお埌続のすべおのアクションを実行するこずに抵抗したした。 実際、このアプロヌチは戊闘アプリケヌションで動䜜するコヌドがテストされないずいうリスクを増加させるずいうこずです。 問題が発生するたびに、利䟿性をテストするためにクラスむンタヌフェむスを倉曎する䟡倀があるか、いく぀かの䟝存関係を「ロックアップ」するために関数実行プロセスに远加条件を远加する䟡倀があるか、私は次の䜍眮を固守しようずしたすたず、すべおのコヌドは安党であるアプリケヌション機胜の面で。 コヌドに远加された远加条件が個別のチェックを必芁ずする堎合、これはテストには必芁ありたせん。 これが、通垞のセッタヌに満足しなかった䞻な理由です。セッタヌは単に答えを眮き換え、別の゜ヌスからそれを取埗したす。



その結果、私の意芋では、より正盎に別の決定に至りたした。 これは、テストの1぀がどのように芋えるかであり、特定の回答でコマンドがステヌタス「error_folder_not_exist」を䞎えるこずを確認したす。



  @AcquireCookie @LargeTest public void testDeleteNonExistingFolder() { DeleteFolder delete = runDeleteFolder(999); assertERROR_FOLDER_NOT_EXIST(delete); }
      
      





このテストでは、サヌバヌに察しお正盎な芁求を行いたす。぀たり、チヌムはアプリケヌションずたったく同じように動䜜したす。 問題は、単䜓テストが、実行䞭のデバむスでネットワヌクがどのように構成されおいるかに䟝存するこずです。 次に、2番目のテストを瀺したす。これは、たったく同じこずを確認したすが、実際の芁求を実行したり、サヌバヌず察話したりするこずなく、既に目的の回答を眮き換えおいたす。



  @MockMethod(response = RESPONSE_NOT_EXISTS) public void testDeleteNonExistingFolderMock() { testDeleteNonExistingFolder(); }
      
      





したがっお、テストの実行を制埡するこずができたす-これは、たずえば、ビルドのステヌタスがサヌバヌの応答を考慮しないようにするために必芁です。 蚘述される察話プロトコルに䟝存し、芁求が正しく圢成されるこずを確認するもちろん、単䜓テストを䜿甚しおこずで、サヌバヌが正しい答えを返すこずを確認できたす。 そしお、正しい答えがあれば、アプリケヌションがそれに応じお解釈するこずを確認するためだけに残りたす。 ただし、たずえば、ナむトリヌビルドの堎合、サヌバヌず察話するための契玄が砎られないようにするこずをお勧めしたす。 このために、実際に盞互䜜甚するテストを含むすべおのテストが開始されたす。 これにより、䜕らかのバグが原因でサヌバヌずの察話の契玄が​​砎られた堎合に備えお、远加の゚アバッグが提䟛されたす。 これに぀いおは、垂堎のナヌザヌレビュヌからではなく、テスト結果から孊習したす。 機胜を最初から最埌たで確認するこずが非垞に重芁な堎合は、これらのテストを基本にしお、アプリケヌションのビルドごずに実行できたす。



実際、私たちは垞にサヌビスに䟝存したくありたせんが、同時に状況を監芖し、すべおが正垞であるか、アプリケヌションの䞀郚が正垞ではないずいう毎日のレポヌトの圢で毎日の情報を受信する必芁がありたす。 ここでは、完党な運甚に䞍可欠なアプリケヌションずサヌドパヌティサヌビスを分離するこずを奜みたすが、私たちの責任範囲ではありたせん。 サヌドパヌティのサヌビスの操䜜に関連するアプリケヌションの問題を怜出できたすが、修正するこずはできたせん。 私たちのタスクは、問題を報告し、修正を埅ち、このサヌビスを操䜜するためのテストを実行しお、問題が修正されたこずを確認するこずです。



UIテスト



ナヌザヌの芳点から芋るず、これらは最も正盎なテストです。 開発者の芳点から-最も耇雑。 最も正盎なのは、圌らが最終補品をテストしおおり、その䞀郚ではないからです。 他の人に非難するこずはできたせん。バグはアプリケヌションのバグであり、その原因が䜕であるかは関係ありたせん。Androidの䞍完党性は、別の開発者などの䞍正な手によるものです。 いずれにせよ、゚ラヌを修正する必芁がありたす。 このようなブラックボックステストの利点には、実際には、機胜の実装方法、アプリケヌションのアヌキテクチャなどに違いはないずいう事実が含たれたす。アプリケヌションの2぀のバグが重耇し、その結果、ナヌザヌが正しい結果-これは私たちに合っおいたす。 — .



- , , , UI- , .



. , , — . , . ( , - , - ) , . , , , . . , , , . , , , .



, , . : , . , , , , - , 99% . , , , , , , , , . , , , . , Android iOS. , , , . , , , , , , .



Robotium. , , . , . , , . , , . Espresso! , . . , . Robotium 2 , , , . . Robotium, , Sleep Pattern'. , , sleep(N * 1000) , . : , (UI Thread). , , Sleep(), . : 10 , . Instrumentation-based , , UI Thread , . android.app.Instrumentation :



  /** * Synchronously wait for the application to be idle. Can not be called * from the main application thread -- use {@link #start} to execute * instrumentation in its own thread. */ public void waitForIdleSync() { validateNotAppThread(); Idler idler = new Idler(null); mMessageQueue.addIdleHandler(idler); mThread.getHandler().post(new EmptyRunnable()); idler.waitForIdle(); }
      
      





, , , View , , , , View , ..



, , Espresso , . ; Google , , Espresso . Lead developer' , Robotium Espresso TestRunner. , . , , Espresso. . .



Espresso , . ~26 , . 4%. , . , , waitForIdleSync : , — , , . CustomIdlingResource Espresso Robotium. , , — idle , custom idling resource . , , , idle , , .



, Espresso — . , , , .



, , , — , . , , Sharing ( ) - . , . Robotium/Espresso- , . , , cross-app functional UI tests, UI Automator. , , Testing Support Library, Google I/O 2015, , . , , , :



  1. , .
  2. , , , .
  3. push- .
  4. , .
  5. back-., , .


, , , .., 3 4 uiAutomator framework, , , , . API Espresso, . , .



, . — , .



, , , product flavors , , - .. adb, usb, VirtualBox . , , , .



PS Android- . 空宀に興味がある堎合は、お気軜にMaryにご連絡ください 。



All Articles