TeamCityからのAndroidビルド用のDIYインストーラー


聴衆


QAエンジニア、モバイルアプリケーションのテスター、自動化。


問題


Android用アプリケーションのテスト中(だけでなく、このプラットフォームのみに焦点を合わせます)、テストした製品の多くのアセンブリをインストールする必要があります。 このプロセスには時間と労力がかかり、バグの発見に費やす方が効率的です。


この記事では、既存のソリューションを調べ、Pythonで独自のソリューションを作成して比較します。


ターンキーソリューション


おそらく、現時点でこの問題に対する最も一般的なソリューションは、ベータ版インストーラーを含むCrashlyticsサービスによって提供されています。


Crashlytics Betaを使用した典型的なアプリケーションのインストールプロセスを考えてみましょう。



したがって、Crashlytics Betaを使用して1つのアプリケーションビルドをインストールして実行するには、合計で少なくとも9つのアクションを実行する必要があります。 これらの指標に焦点を当て、同様の問題を解決するために必要なアクションが少ないインストーラーの作成を試みます。


カスタムソリューション


Pythonをプログラミング言語として選択します。Pythonがタスクに適しており、QAエンジニアの間でも非常に人気があるためです。
Androidと対話するには、標準のAndroid SDKの一部であるadbを使用します。
ファイルをダウンロードするには-Wget。
この場合、アセンブリはTeamCityで実行されます。


次に、コードの記述に移りましょう。


まず、 サブプロセスモジュールをプロジェクトにインポートします。wgetおよびadbコマンドを実行する必要があります。


import subprocess 

Wgetに必要な設定を追加します。


 settings = {'user': '—user=__teamcity', 'password': '—password=__teamcity', 'way': '____'} 

ビルド番号でアプリケーションをインストールするので、このパラメーターを要求するようスクリプトに教えます。


 number = input(' № : ') 

テストと戦闘の2つのアセンブリを一度にインストールする必要があるとしましょう。 TeamCityからダウンロードします。 これを行うには、サービスページを開き、アーティファクトでアセンブリを見つけることにより、ファイルへのフルパスを見つけます。 事前アセンブリURLは次のようになります。


 https://teamcity.mysite.com/repository/app/_/_/myapp-_-_.apk 

アドレスには、ビルド番号の代わりにidが表示されます(例:/ 1234:id /)。 ここでは、IDではなくアセンブリ番号を示します。


特定のアセンブリをダウンロードするための関数を作成します。


 def download(type_b): url = 'http://teamcity.mysite.com/repository/app/{0}/{1}/myapp-{0}-{1}.apk'.format(number, type_b) #    — ,  ,    —   , #     —  subprocess.check_output(['wget', '-N', '--cache=off', '--progress=bar', settings['user'], settings['password'], '-P', settings['way'], url]) 

アプリケーションをインストールして実行する関数を作成します。 まず、以前にインストールしたアセンブリを削除します。 少なくとも1つのアプリケーションがデバイス上にない場合、スクリプトがエラーで終了することを忘れないでください。 これを避けるため、エラーは無視します。


この架空の例では、2つのパッケージがあります。



開始アクティビティ:



パッケージ名とアクティビティ名は異なります。


 def install(type_b): try: #   ,  package name subprocess.check_output(['adb', 'uninstall', 'com.myapp.{0}'.format(type_b)]) except: #     —  . pass finally: #    subprocess.check_output(['adb', 'install', '{0}/myapp-{1}-{2}.apk'.format(settings['way'], number, type_b)]) #   ,  activity name subprocess.check_output(['adb', 'shell', 'am', 'start', 'com.myapp.{0}/com.myapp.StartActivity'.format(type_b)]) print('(^_^)  ({0}-{1})   .'.format(number, type_b)) 

必要なすべての機能が記述されています。 これで適用できます。
さらに、指定したアセンブリがTeamCityにない場合のハンドラーを追加します。


 while True: try: #  ,     download('prod') #  ,     download('test') except Exception: #    —     number = input('¯\_(ツ)_/¯   .\n  №: ') else: print(' …') #      install('prod') #      install('test') #    —       print('! (_8(|)\n') break 

スクリプトの準備ができました。 たとえば、installer.pyという名前で保存します
エイリアスを追加します、例: alias inst = 'python〜/ scripts / installer.py'


確認する


したがって、Crashlytics Betaを使用して1つのアセンブリをインストールするには、9つのアクションを実行する必要があります。 比較のために、スクリプトでこのインジケーターを測定します。



結果


ベータ(1ビルド)-9アクション(古いビルドの削除を除く)。
スクリプト(必要な数のアセンブリ)-2アクション。


カスタムソリューションの追加のボーナスは、スケーリング(複数の製品のインストールを多数のデバイスに追加するなど)であり、自動テストのタスクにも簡単に適応できることです。


ソース




Source: https://habr.com/ru/post/J426149/


All Articles