11

Ho configurato calabash-android perfettamente funzionante con uno scenario predefinito (utilizzando cucumber per eseguire i test o calabash-android console per accedere alla modalità REPL).Calabash-android: allegare all'app in esecuzione

Tuttavia, in alcuni scenari, risulta essere molto utile essere in grado di collegarsi a un'app già in esecuzione. Ad esempio, avviare un'applicazione in modalità di debug e avviare i test per poter impostare i punti di interruzione e verificare perché determinate funzionalità non funzionano come previsto nei miei scenari.

Quando si tratta di Calabash su iOS, questa operazione è molto semplice: non è necessaria alcuna preparazione aggiuntiva in quanto l'app inizia con un server di prova incluso e posso allegare la calabash in qualsiasi momento. Tuttavia, Calabash Android sembra forzare l'uscita dell'app ogni volta che cerco di avviare la calabash con l'app in esecuzione.

C'è un modo per aggirarlo?

EDIT Sembra che le risposte qui sotto non ha aiutato molto, ma spero ancora qualcuno (devs Calabash, dove sei?) Si imbattervi in ​​questo un giorno. Ho passato un po 'di tempo alla scoperta del problema stesso, e questo è ciò che il problema specifico è:

  1. avviare l'applicazione in modalità di debug (usando Xamarin, per esempio)
  2. Inizio calabash-android console PATH_TO_APK
  3. Prova l'emissione di tutti i comandi (ad esempio query("*")) - non riesce con un messaggio KeepAliveDisconnected
  4. Provare a eseguire start_test_server_in_background - l'applicazione viene ucciso e sessione di debug è terminato

Scavando più a fondo nei dettagli, ho scoperto che in realtà start_test_server_in_background corre shell am instrument con sh.calaba.instrumentationbackend.CalabashInstrumentationTestRunner essendo strumentazione di back-end e un mucchio di altre bandiere che descrivono quali app per strumento, quello che porta da utilizzare ecc

Così Detto questo, il seguente sarebbe di aiuto molto: è possibile che lo strumento shell am sia collegato a un'applicazione in esecuzione?

+0

Calabash deve avviare l'app tramite il comando instrumentation, in modo che il proprio server sia in esecuzione con privilegi che consentono di interrogare e controllare l'app. http://stackoverflow.com/questions/10942049/is-it-possible-to-enter-debug-mode-for-android-when-running-junit-test suggerisce che potresti aggiungere "debug true" alla strumentazione di Calabash comando, quindi utilizza il pulsante "collega al processo in esecuzione" (sul lato dell'icona di debug in Android Studio) Assicurati che il file manifest dell'app sia impostato come debugabile. –

+0

[setup test env usando calabash e cetriolo] (http://www.singhajit.com/cucumber-and-calabash-for-android-app-testing) –

risposta

0

Grande questione, e la risposta è semplice:

No

Almeno non su Android (non posso attestare a iOS). Perché? Calabash deve stabilire i ganci sull'app su cui si desidera eseguire prima di poter eseguire qualsiasi test sull'app. Ciò è dovuto a una serie di motivi relativi allo stack Android.

Il primo motivo è la sicurezza. Android blocca le app nella fase di installazione in base alle autorizzazioni impostate per tale app. A causa di questo design, Calabash (o qualsiasi altro script che interferisce con l'app) non sarà in grado di eseguire nel bel mezzo di un processo di app. Come hai scoperto, puoi ancora eseguire i test di Calabash insieme all'avvio dell'applicazione, poiché Android convaliderà Calabash a tale scopo.

Il secondo motivo è architettura. Android è progettato come livelli di processi e viste. Quello che stai cercando di fare probabilmente interferirà con più di un processo su una varietà di livelli.

Il meglio che puoi fare è avviare Calabash per un'applicazione senza reinstallarla, ma è il massimo che Android ti consenta di fare.

Infine, mi scuso se questa risposta non approfondisce i dettagli molto tecnici, queste sono state le risposte date a me durante un particolare Hackathon mentre lottavo con un problema simile.

+0

Sembra ragionevole, ma come funziona il debug dei test unitari? In effetti, usano lo stesso strumento di gestione delle strumentazioni di Calabash, ma possiamo sicuramente eseguire il debug dell'applicazione durante i test unitari. qualche idea? – Anton

0

Calabash-Android arresta qualsiasi server di test e l'app in prova, quando si avvia un nuovo server sulla stessa porta.

Se si desidera collegare una console a un test in esecuzione, è sufficiente aprire una console (bundle exec calabash console ..) ed emettere i propri gesti e query, senza avviare l'applicazione utilizzando start_test_server_in_background. Un modello comune è quello di utilizzare la leva gemma, con il metodo binding.pry per mettere in pausa il test e avviare una console.

Si noti che lo scheletro di cetriolo Calabash-Android generato eseguirà automaticamente shutdown_test_server quando uno scenario di cetriolo fallisce o termina. È possibile rimuovere quella chiamata e collegare una console.

+0

Come ho già detto, va bene su iOS, ma su Android non sembra funzionare - si prega di notare che mi piacerebbe ATTACCARE a un'app che è già in esecuzione come voglio eseguire il debug dell'applicazione, non i test. E poiché l'app è stata avviata da qualcun altro, TestInstrumentation non viene avviato e pertanto la console non può connettersi all'app. – Anton

+0

OK, come ha detto @bernlim, Calabash-Android attualmente non supporta il collegamento a un'app che non è stata avviata dal framework Calabash. Qual è l'usecase e cosa stai cercando di risolvere? – Tobias

+0

Semplice semplice infatti: voglio eseguire il debug dei test. Ad esempio, noto uno scenario che non funziona e voglio eseguire il debug dell'applicazione durante l'esecuzione dello scenario: questo sembra essere un risparmio di tempo in quanto alcuni scenari potrebbero essere piuttosto complessi e includere dati di seed preconfigurati sul server, il che significa riprodurre il problema manualmente è un po 'doloroso – Anton

2

L'ho appena eseguito con successo. Non c'era molto da esso - ho solo una pausa dei test Calabash al punto di guasto con una 'Dopo' gancio che fa una pausa di Ruby (in realtà, utilizza IRB, ma questo è incidentale):

After do |scenario| 
    if scenario.failed? && scenario.source_tag_names.include?('@wip') && PLATFORM == ANDROID 
    require 'irb' 
    require 'irb/completion' 
    ARGV.clear 
    IRB.start 
    end 
end 

poi Fired Up Android Studio, facendo clic sul pulsante "Collega il debugger al processo Android" a destra della normale icona di debug nella barra degli strumenti, fai clic sul popup "Impossibile connettersi ad adb" per dire di riprovare (senza uccidere/riavviare adb me stesso), cliccato sul processo che mi ha offerto, e ... collegato felicemente. Ho impostato con successo un breakpoint e l'ho colpito, ed eseguito query ("*") nella console sia prima che dopo.

Non ho dovuto modificare il comando dello strumento Calabash per aggiungere "debug true" o altro.

L'unica cosa che è andata storta era che Android Studio estraeva il server adb quando l'ho chiuso, ma penso che sia un bug noto^H^H^Hfeature.

Probabilmente se si crea un passaggio "E Cucumber attende un passaggio di tasti" in attesa che si colpisca la tastiera del computer host, quindi è possibile collegare Android Studio al processo del telefono e impostare i punti di interruzione prima di riprendere. Ovviamente però - i punti di interruzione stanno andando a rovinare qualsiasi tempistica nella sceneggiatura.

Problemi correlati