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アクション。







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







ソース






All Articles