So verwalten Sie Berechtigungen für die Laufzeit android marshmallow-espresso-tests
Ich bin mit espresso zum testen aber manchmal versuche ich ein Bild bilden externen Speicher und mit marshmallow, ich brauche eine Laufzeit Berechtigung, sonst gibt es eine Exception abstürzt und der test schlägt fehl.
androidTestCompile 'com.android.support.test:runner:0.4'
androidTestCompile 'com.android.support.test:rules:0.4'
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.1'
androidTestCompile 'com.android.support.test.espresso:espresso-intents:2.2.1'
androidTestCompile('com.android.support.test.espresso:espresso-contrib:2.2.1') {
//this library uses the newest app compat v22 but the espresso contrib still v21.
//you have to specifically exclude the older versions of the contrib library or
//there will be some conflicts
exclude group: 'com.android.support', module: 'appcompat'
exclude group: 'com.android.support', module: 'support-v4'
exclude module: 'recyclerview-v7'
}
androidTestCompile 'junit:junit:4.12'
androidTestCompile 'com.squareup.retrofit:retrofit-mock:1.9.0'
androidTestCompile 'com.squareup.assertj:assertj-android:1.1.0'
androidTestCompile 'com.squareup.spoon:spoon-client:1.2.0'
wie Schaffe ich das richtig?
soll ich schreiben test für Berechtigungen für die Laufzeit oder es gibt einen Weg, um es zu deaktivieren zum testen?
soll ich Berechtigungen erteilen, bevor die tests ausgeführt werden, wie Sie hier sagt? https://www.youtube.com/watch?list=PLWz5rJ2EKKc-lJo_RGGXL2Psr8vVCTWjM&v=C8lUdPVSzDk
- Möglich, Duplikat der Android Marshmallow: Test der Berechtigungen mit Espresso?
- in diesem Fall, die Frage sollte sein, das Duplikat, das ist eine ältere
- völlig einverstanden, aber es scheint, dass die andere hat mehr Engagement von der Gemeinde. Die Antworten sind wirklich konstruktiv. Darüber hinaus ist die akzeptierte Antwort auf diese Frage nicht, das Problem zu beheben... also, für mich ist das nicht Begriffe von "wer kam zuerst", sondern "welche Fragen und Antworten sind nützlich für die Gemeinschaft".
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie erstellen, die ein Android-gradle-task zu erteilen:
- Und dies ist der Befehl zum ausführen der Aufgabe:
gradle grantDebugPermissions
UPDATE! Jetzt können Sie Regel aus dem Android-Testing-Support-Bibliothek
Ist es mehr angemessen, die Verwendung als benutzerdefinierte Regeln.
Veraltete Antwort:
Können Sie fügen Sie test-Regel zur Wiederverwendung von code und fügen Sie mehr Flexibilität:
Danach können Sie diese Regel verwenden, die in den test-Klassen:
Beachten Sie:
ausgeführt nach, dass
executeShellCommand
imallowPermissions
erfordert synchronisation (Lesen der zurückgegebenen file-Deskriptor/stream bis zum Ende). Sonst kann der test starten, bevor Sie die Berechtigungen haben, die tatsächlich angewendet wurden. Und im Allgemeinen sind die Dateideskriptoren, die zurückgegebenexecuteShellCommand
sollte geschlossen werden.revokePermissions()
sollte in einemfinally
block um sicher zu sein.Können Sie die grant-und revoke-Berechtigungen verwenden:
Verwendung von Java instrumentation tests rufe diese Methode von Google-Beispiele:
https://github.com/googlesamples/android-testing/blob/ed62c450e43f859333b3113d44dd59f75971b529/ui/espresso/IntentsBasicSample/app/src/androidTest/java/com/example/android/testing/espresso/BasicSample/DialerActivityTest.java#L94
Können Sie GrantPermissionRule. Diese Regel gewähren alle angeforderten Berechtigungen für die Laufzeit für alle test-Methoden, test-Klasse.
spoon { grantAllPermissions = true }
damit alle standardmäßigKönnen Sie erreichen dies leicht durch die Gewährung Erlaubnis, bevor Sie den test starten. Zum Beispiel, wenn Sie sollen, verwenden Sie die Kamera während des Testlaufs können Sie die Erlaubnis erteilen, die wie folgt
Es ist GrantPermissionRule in Android-Testing-Support-Bibliothek, dass Sie in Ihren tests verwenden können, um die Erteilung einer Genehmigung vor Beginn eines jeden tests.
In der multi-Geschmack-setup, was auch immer Ihre Instrumentierung Aufgabe ist es, sagen wir mal
connectedYourFlavorDebugAndroidTest
können Sie die gewünschten Berechtigungen zu gewähren, bevor die tests ausgeführt werden auf alle angeschlossenen Geräte:gradlew grantYourFlavorDebugPermissions -Ppermissions=android.permission.ACCESS_FINE_LOCATION,android.permission.ACCESS_COARSE_LOCATION
Sehen sfjava Auszug unten kopieren in
build.gradle
zu generierengrantYourFlavorDebugPermissions
AufgabeNur ein paar kleinere UPDATEs für die oben genannten snippet ( Requisiten, um riwnodennyk ) -- die sehr gut funktioniert für mich, wenn Gebäude gegen SDK-24 und mit tools version 24.0.0:
Wenn Sie mit der neuesten " com.android.Unterstützung.test.espresso:espresso-Kern:3.0.1 " Bibliothek für espresso-diese kann getan werden, in eine einzige Zeile code. Alles, was Sie tun müssen ist, fügen Sie einfach eine Regel in der Test-Klasse und halten das hinzufügen der Berechtigungen müssen Sie als Parameter der Funktion zu erteilen Funktion. Siehe unten:
https://developer.android.com/reference/android/support/test/rule/GrantPermissionRule.html
Ich habe implementiert eine Lösung, die nutzt wrapper-Klassen, überschreiben und Aufbau der Variantenkonfiguration. Die Lösung ist ziemlich lange zu erklären, und findet sich hier: https://github.com/ahasbini/AndroidTestMockPermissionUtils. Es braucht keine Skript Hinzugefügt werden in das build-system oder ausgeführt, bevor die tests durchgeführt werden.
Es ist noch nicht verpackt in ein sdk, aber die Haupt Idee ist das überschreiben der Funktionen
ContextWrapper.checkSelfPermission()
undActivityCompat.requestPermissions()
manipuliert zu werden und zurück verspottet Ergebnisse trickst die app in den verschiedenen Szenarien getestet werden wie: wurde die Erlaubnis verweigert, damit die app angefordert und endete mit Berechtigung erteilt. Dieses Szenario kann auftreten, selbst wenn die app hatte die Erlaubnis, alle zusammen aber die Idee ist, dass es wurde betrogen, indem die verspotteten, die Ergebnisse aus der vorrangigen Umsetzung.Darüber hinaus die Umsetzung hat ein
TestRule
genanntPermissionRule
Klasse, die verwendet werden können, in den test-Klassen, um einfach simulieren, alle Bedingungen zu testen, die Berechtigungen nahtlos. Auch Aussagen gemacht werden können, wie die Sicherstellung der app aufgerufen hatrequestPermissions()
zum Beispiel.