7

私はエスプレッソとUIAutomatorを使用してテストケースを作成しています。拒否されたときと許可されているときに、外部のストレージのアクセス許可をテストしています。 私は、テストケースの開始時にすべてが取り消される許可を必要とする異なるテストケースを持っています。 しかし、いくつかのテストケースでは許可が得られるはずです。その結果、次のテストが実行されるときに許可を取り消す必要があります。 私が検索したのは、PMマネージャを使用してadbシェルコマンドを実行して権限を取り消すことです。しかし、そうすることによって、私は次のエラーを取得します。 'process crash'のためにInstrumentation runが失敗しました。すべてのテストケースの始めに権限が取り消されるようにする方法はありますか?そうでない場合は、テストアクセス権に関してこの問題をどのように解決できますか?ご協力いただきありがとうございます。Androidは各テストの開始時に権限を取り消します

これは私が現在、(動作しない)各テストケースの前に許可を取り消すために持っているコードスニペットです:上記のコードスニペットとの許可を取り消すしようとしたとき

@Before 
public void setUp() { 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     getInstrumentation().getUiAutomation().executeShellCommand(
       "pm revoke " + getTargetContext().getPackageName() 
         + " android.permission.WRITE_EXTERNAL_STORAGE"); 
    } 
} 

はエラーメッセージを対応:

Test failed to run to completion. Reason: 'Instrumentation run failed due to 'Process crashed.''. 

私はまた、これら2つの投稿:thisthisを見に来ました。

+0

これは間違っているかもしれませんが(ロリポップデバイスはありません)、ロリポップには「取り消し」というadbコマンドがありますか?それはM +だけで利用できるのではないのですか? – Ryan

+0

こんにちはRyan、私は信じていますが、if文の中でコマンドをラップした後にエラーが消えてしまいます。そして私がテストしているエミュレータはAndroid 6.0です。 –

+0

許可管理を模擬する方法はありませんか? –

答えて

2

私は、実行時にユーザにプロンプ​​トを表示せずにこれを行う方法についてはわかりません。しかし、あなたはテスト目的のためのタイトルであることを述べました。したがって、私はあなたにお勧めできるオプションをいくつか持っています。

a)テストは許可なしで行う必要がある場合は、デバイスの設定を使用して手動で取り消すだけです。

b)許可を求めて確認し、許可を拒否することができます。私は、あなたがカメラの許可を確認して尋ねるために使用するいくつかのコードを与えます。あなただけの許可名を変更する必要があると思います、多分条件はチェックする:

public static boolean checkCameraPermission(MainActivity thisActivity) { 
    return ContextCompat.checkSelfPermission(thisActivity, 
      Manifest.permission.CAMERA) 
      == PackageManager.PERMISSION_GRANTED; 
} 

public static void checkAndAskCameraPermission(final MainActivity thisActivity) { 

    if (!checkCameraPermission(thisActivity)) { 
     //No right is granted 
     // Should we show an explanation? 
     if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, 
       Manifest.permission.CAMERA)) { 

      //Open a dialog explaining why you are asking permission then when when positive button is triggered, call this line 
      ActivityCompat.requestPermissions(thisActivity, 
          new String[]{Manifest.permission.CAMERA}, 
          CHECK_FOR_CAMERA_PERMISSION); 

     } else { 
      // No explanation needed, we can request the permission. 
      ActivityCompat.requestPermissions(thisActivity, 
        new String[]{Manifest.permission.CAMERA}, 
        CHECK_FOR_CAMERA_PERMISSION); 
     } 
    } 
} 

私は)あなたにBについてのいくつかのより多くのリンクを与えることができる(許可を依頼する方法)あなたはとても必要な場合は(それをコメント)。しかし、私はこの答えがあなたに興味があるかどうか分からないので、私はこのオプションを文書化する時間を費やさないでしょう。

しかし、誰かが実行時にプロンプ​​トを表示せずに直接実行する方法を説明できるかもしれませんが、少なくともこの情報を提供することは面白いかもしれませんが。

+0

あなたのご協力ありがとうございますFeuby!しかし、問題は許可を求めることではありません。問題は、いくつかのテストケースが許可されてしまうということです。また、次のテストケースでは、権限を拒否するアクションを実行する必要があるケースをテストする必要があります。これは、すでに許可されているため実行できません。また、a)に関しては、テストケースの実行順序を修正し、設定で手動でパーミッションを手動でリセットすることはできますが、テストクラスを連続して実行すると、手動でパーミッションをリセットする必要はありません。再度、あなたの助けをありがとう! –

+0

それから、私はあなたに「トークン」というものを見てみることをお勧めします。私は正確な用語についてはわかりませんが、あなたのアプリケーションが他のアプリケーションに与えることができ、あなたのアプリケーションの正しい適用権限で実行できるようにするものです。おそらく、この許可を拒否するために、このトークンを "制限"して一般的な意図(アプリケーションによって適切に処理されます)を介してあなたの活動の1つに与えることができます。しかし、私は本当に "トークン"の名前やそれを行う方法については、私は別の問題を捜していたときに注意を払っていない何かの本当のか分からない。 – Feuby

2

できません。許可/取り消し権限はユーザーコントロール下にあります。

しかし、あなたが付与/ ADB経由で許可を取り消すことができますし、プログラムのadbコマンドをトリガすることができますが、これは組み合わせて動作するかどうか私はわかりません?...

adb shell pm grant [app.package] [permission] 
adb shell pm grant com.app.package.path android.permission.READ_CONTACTS 

look here

あなたは、テスト目的のためにあなたの許可をブール値にマップするかもしれませんか?

+0

あなたの提案をlongilongに感謝します。あなたが言及した提案は、私が質問で述べたように使用しているものです。ただし、エラーメッセージが生成されるため、動作しません。私は目的を敗北させるように各実行する前に手動で変更を加えることなく、テストクラスを実行できるソリューションを探しています。とにかく助けてくれてありがとう! –

+0

この回答は間違っています。OPはテスト中に許可/取り消し権限を求めていますが、通常の使用ではありません。テスト中、アプリケーションまたは計測コードは、OPが既に述べた 'adb shell'と同じ正確な特権を持つシェルにアクセスすることができ、' getInstrumentation()。getUiAutomation()。executeShellCommand() 'または同様のものです。したがって、テスト中は、アプリまたは計測器だけが許可を取り消し、許可を取り消すことができます。しかし、この問題は、OSがテストを実行している間に強制的にアプリケーションを強制的にクラッシュさせるため、取り消しに存在します – ahasbini

0

私は、ラッパークラスを活用し、バリアントの設定をオーバーライドしてビルドするソリューションを実装しました。解決策は説明するのにかなり時間がかかり、ここに見つけられます:https://github.com/ahasbini/AndroidTestMockPermissionUtils

まだパッケージ化されていませんが、主な考え方はContextWrapperの機能をオーバーライドすることです。checkSelfPermissionとActivityCompat.requestPermissionsを操作して模擬した結果を返し、許可が拒否され、アプリケーションがそれを要求し、許可された許可で終了するように、さまざまなシナリオにアプリをトリックします。このシナリオは、アプリがすべての権限を持っていても、オーバーライドされた実装からの嘲笑された結果によってそれがだまされたということでも発生します。

さらに、実装にはPermissionRuleクラスと呼ばれるTestRuleがあります。これはテストクラスですべての条件を簡単にシミュレートしてアクセス権をシームレスにテストできます。また、アプリケーションがrequestPermissions()などを呼び出したことを保証するようなアサーションも可能です。

関連する問題