Android Espresso, Wake up Gerät vor Test. Wie benutzt man ein benutzerdefiniertes Manifest für Test?

Ich habe Tests mit Androids neue Espresso-Framework geschrieben und finde, dass es gut funktioniert. Eine ärgerliche Sache (nicht besonders für Espresso) ist, dass ich sicherstellen muss, dass mein Bildschirm wach und freigeschaltet ist für die Tests zu laufen. Ich fand einen Workaround (durch verschiedene Quellen) aber ich bin mir nicht sicher, ob der beste Weg, es zu integrieren.

Also das ist was ich tat, in meiner "Home" -Aktivität habe ich den folgenden Code:

Home.Klasse:

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /************ Put this in a conditional for a test version ***********/ KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); KeyguardManager.KeyguardLock keyguardLock = km.newKeyguardLock("TAG"); keyguardLock.disableKeyguard(); getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); } 

Außerdem müssen Sie die folgenden Berechtigungen hinzufügen:

 <uses-permission android:name="android.permission.DISABLE_KEYGUARD"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> 

Also, nachdem ich dies getan habe, weckst du jetzt mein Telefon, um zu laufen, also muss ich nicht bewachen und sicherstellen, dass der Bildschirm nicht abschaltet, bevor die Tests beginnen.

Ich würde lieber nicht die Berechtigungen aber in meiner App offensichtlich. Ich weiß mit gradle es ist möglich, verschiedene "aromen" zu machen, die ihr eigenes android manifest haben, das in das Hauptmanifest übergehen wird. Ich dachte daran, das zu benutzen, aber ich würde lieber nicht einen Geschmack hinzufügen, nur aus diesem Grund, da dies bereits mit dem Test-Build-Typ läuft. Es sieht aus wie aus der Android-Castle-Dokumentation, dass man kein AndroidManifest für das InstrumentTest-Verzeichnis erstellen kann, da es automatisch generiert wird.

Allerdings habe ich mich gefragt, ob es einen anderen Weg, es zu tun, ohne eine Variante zu machen und dann spezifiziert, dass die Tests diese Variante laufen sollte. Auch bin ich mir nicht sicher über die genaue Syntax von all dem und dachte, es wäre schön, nur um diese Informationen auf der Website für andere zu haben, wie es scheint, über verstreut zu sein.

Schließlich, wenn jemand weiß, von einem besseren Weg der Lösung der Frage des Aufwachens des Telefons für die Tests würde ich gerne hören, wie ich bin nicht ein großer Fan von dieser Art, die ich versuche.

  • Überprüfen Sie, ob onStop von Benutzerinteraktion aufgerufen wird, oder Bildschirmdimmen
  • Wie macht man Android-Gerät immer im Wake-Modus?
  • Android Bluetooth & WakeLock Beziehung
  • Android - Wake Lock nicht richtig zu erwerben, App muss im Standby-Modus laufen
  • Android: Vordergrund Service vs. WakeLock
  • WakeLock finalisiert, während noch Fehler gehalten, obwohl ich es freigeben
  • Alarmmanager's Wake Lock beim Starten eines Service
  • Android: Wake & Unlock Telefon
  • 7 Solutions collect form web for “Android Espresso, Wake up Gerät vor Test. Wie benutzt man ein benutzerdefiniertes Manifest für Test?”

    Ich habe wirklich eine wirklich einfache Möglichkeit, dies zu behandeln. Entfernen Sie die Keyguard und Wakelock Berechtigungen aus dem Hauptmanifest und legen Sie sie in src / debug / AndroidManifest.xml wie folgt:

    Src / debug / AndroidManifest.xml

     <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" > <uses-permission android:name="android.permission.DISABLE_KEYGUARD"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> </manifest> 

    Wenn die App für Debug gebaut wird, werden die oben genannten Berechtigungen in das Hauptmanifest verschmelzen. Standardmäßig verwendet das Build-System den Debug-Build für Instrument-Tests, so dass das gut funktioniert.

    Dann in meinem onCreate habe ich den Code in der Frage erwähnt:

     @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (BuildConfig.DEBUG) { KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); KeyguardManager.KeyguardLock keyguardLock = km.newKeyguardLock("TAG"); keyguardLock.disableKeyguard(); getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); } ... } 

    Jetzt kann mein Handy Tests ausführen, ohne dass ich sie zuerst mit der Hand aufwache und ich musste nicht die oben genannten Berechtigungen zur Release-Version meiner App hinzufügen.

    Jetzt, wo KeyguardLock abgelehnt ist, kannst du einfach:

      if (BuildConfig.DEBUG) { getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); } 

    Der einfachste Ansatz ist, den Befehl adb wie unten zu verwenden, wenn Sie die Tests aus der CI-Umgebung zum Beispiel ausführen:

     adb -s $DEVICE_ID shell input keyevent 82 

    Dadurch wird Ihr Gerät-Bildschirm entsperrt.

    Ich habe die Datei src / debug / AndroidManifest.xml erstellt, wie Matt vorgeschlagen und dem folgenden Code zur TestCase hinzugefügt hat:

      @Override public void setUp() throws Exception { super.setUp(); // Espresso will not launch our activity for us, we must launch it via getActivity(). Activity activity = getActivity(); KeyguardManager km = (KeyguardManager) activity.getSystemService(Context.KEYGUARD_SERVICE); KeyguardManager.KeyguardLock keyguardLock = km.newKeyguardLock("TAG"); keyguardLock.disableKeyguard(); activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); } 

    Zum Testen des Gerätes setzen UiDevice auf NONE in Einstellungen-> Sicherheit Dann benutze die Instanz von UiDevice und rufe die Methode wakeUp()

    Diese Methode simuliert das Drücken der Power-Taste, wenn der Bildschirm ausgeschaltet ist, sonst tut es nichts, wenn der Bildschirm bereits eingeschaltet ist. Wenn der Bildschirm ausgeschaltet war und es gerade eingeschaltet wurde, wird diese Methode eine 500ms Verzögerung einfügen, um dem Gerät die Zeit zu wecken und die Eingabe zu übernehmen.

    Ein weiterer bester Weg zum Aufwachen des Gerätes vor dem Test. setUp einfach ActivityLifecycleCallback in deiner setUp Methode hinzu.

     public class Moduletest extends ActivityInstrumentationTestCase2<Your Activity>{ protected void setUp(){ super.setUp(); ActivityLifecycleMonitorRegistry.getInstance().addLifecycleCallback(new ActivityLifecycleCallback() { @Override public void onActivityLifecycleChanged(Activity activity, Stage stage) { if (stage == Stage.PRE_ON_CREATE) { activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } } }); } } 

    Ich habe es so gemacht: Zuerst mache zwei Regeln, eine für die Aktivität und eine für UI Thread:

     @Rule public ActivityTestRule<Your Activity> mActivityRule = new ActivityTestRule<>(Your Activity.class, true, true); @Rule public UiThreadTestRule uiThreadTestRule = new UiThreadTestRule(); 

    Und dann in meiner ersten Testmethode machte dies:

      @Test @LargeTest public void CreateAndSaveTaskEntity() throws Throwable { uiThreadTestRule.runOnUiThread(new Runnable() { @Override public void run() { Your Activity activity = mActivityRule.getActivity(); activity.getWindow() .addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); } }); //begin test cases ... } 

    Natürlich müssen Sie in AndroidManifest.xml die Berechtigungen hinzufügen:

     <uses-permission android:name="android.permission.DISABLE_KEYGUARD"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.