7

我使用Espresso和UIAutomator編寫我的測試用例。我在測試外部存儲權限時會拒絕其允許的時間。 我有不同的測試用例,它們都需要在測試用例開始時被取消權限。 但是,某些測試用例應該並且確實會授予權限,因此我需要在執行下一個測試時撤銷權限。 我已經搜索過,最近遇到的情況是使用pm管理器執行adb shell命令來撤消權限。但是通過這樣做,我會得到以下錯誤,由於'進程崩潰'導致Instrumentation運行失敗。有什麼方法可以確保在每個測試用例開始時都會取消權限?如果不是,這個問題怎麼解決關於測試權限?提前謝謝你的幫助!每次測試開始時的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.''. 

我也碰到過這兩個帖子:thisthis

+0

我可能是這個錯誤(沒有棒棒糖設備),但棒棒糖有那個ADB命令「撤銷」?這不僅適用於M +嗎? – Ryan

+0

你好,瑞恩,我相信這樣做,錯誤消失之後,我在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

然後,我建議你看看一些叫做「代幣」的東西。我不確定確切的術語,但它是您的應用程序可以給予另一個應用程序以允許它以您的應用程序權限執行的東西。也許你可以設法「限制」這個令牌,並通過一般意圖(由你的應用程序正確處理)將它給予你的一個活動,以拒絕這個許可。然而,我並不確定名稱「標記」,也不知道如何去做,這是我在尋找另一個問題時沒有注意的事情。 – Feuby

2

你不能。授予/撤銷權限由用戶控制。

但是,您可以授予/通過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在測試期間要求授予/撤銷權限,而不是正常使用。在測試過程中,應用程序或工具代碼可以訪問一個shell,它具有與OP已經陳述過的'adb shell'相同的特權,並且是'getInstrumentation()。getUiAutomation()。executeShellCommand()'或類似的。因此,在測試過程中,只有應用程序或工具可以授予和撤銷自己的權限。然而問題在於撤銷,因爲這會導致操作系統在執行測試時強制關閉應用程序,從而導致崩潰 – ahasbini

0

我已經實現了一個利用包裝類,覆蓋和構建變體配置的解決方案。解決方案需要很長時間才能解釋,可以在這裏找到:https://github.com/ahasbini/AndroidTestMockPermissionUtils

它尚未包裝在sdk中,但主要想法是覆蓋ContextWrapper的功能。checkSelfPermission和ActivityCompat.requestPermissions被操縱,並返回模擬結果欺騙應用程序到不同的方案進行測試,如:權限被拒絕,因此應用程序請求它,並以授予許可結束。即使應用程序一直都有權限,但這種情況也會發生,但它的想法是被重寫實現的模擬結果所欺騙。

此外,該實現還有一個名爲PermissionRule的TestRule類,可以在測試類中使用該類來輕鬆模擬所有條件以無縫測試權限。也可以斷言,例如確保應用程序調用requestPermissions()。