Durante i test VTS, i comandi shell vengono utilizzati per eseguire un file binario di test lato target, per ottenere/impostare proprietà, variabili di ambiente e informazioni di sistema e per avviare/arrestare il framework Android. Puoi eseguire comandi della shell del dispositivo VTS utilizzando il comando adb shell
o il driver della shell VTS in esecuzione sul dispositivo (opzione consigliata).
Utilizzare la shell ADB
I test che richiedono l'arresto della porta USB o il riavvio del dispositivo durante il test devono utilizzare la shell ADB perché il driver della shell VTS non è disponibile senza una connessione USB permanente. Puoi richiamare la shell ADB dall'oggetto
AndroidDevice
nello script di test Python. Esempi:
- Recupera un oggetto dispositivo Android:
self.device = self.android_devices[0]
- Esegui un singolo comando shell:
result = self.device.adb.shell(‘ls')
Utilizzare il driver della shell VTS
Il driver della shell VTS è un agente binario che viene eseguito sul dispositivo ed esegue comandi della shell. Per impostazione predefinita, VTS utilizza il driver della shell se è in esecuzione sul dispositivo perché questo metodo ha una latenza inferiore rispetto all'utilizzo del comando adb
shell
.
Il framework VTS supporta i test su più dispositivi in cui ogni dispositivo Android è rappresentato come oggetto AndroidDevice nel runner di base. Per impostazione predefinita, il framework VTS spinge i binari dell'agente VTS e del driver della shell VTS su ogni dispositivo Android e stabilisce connessioni TCP con gli agenti VTS su questi dispositivi.
Per eseguire un comando shell, lo script Python lato host esegue una chiamata di funzione all'oggetto ShellMirror all'interno dell'oggetto AndroidDevice. L'oggetto ShellMirror impacchetta i testi dei comandi della shell in un messaggio protobuf e lo invia (tramite il canale TCP) all'agente VTS sul dispositivo Android. L'agente in esecuzione sul dispositivo inoltra il comando shell al driver della shell VTS tramite il socket Unix.
Quando il driver della shell VTS riceve un comando della shell, lo esegue tramite nohup sulla shell del dispositivo per evitare blocchi. Stdout, stderr e il codice di ritorno vengono quindi recuperati da nohup
e inviati nuovamente all'agente VTS. Infine, l'agente risponde all'host inserendo i risultati del comando in un messaggio protobuf
.
Vantaggi
I vantaggi dell'utilizzo del driver della shell VTS anziché di adb
shell
includono:
- Affidabilità. Il driver della shell VTS utilizza
nohup
per eseguire i comandi con l'impostazione predefinita. Poiché i test VTS sono principalmente test di HAL e kernel di livello inferiore,nohup
garantisce che i comandi shell non si blocchino durante l'esecuzione. - Prestazioni. Sebbene il comando
adb shell
memorizzi nella cache alcuni risultati (ad esempio l'elenco dei file in una directory), ha un overhead di connessione durante l'esecuzione di attività come l'esecuzione di un file binario di test. Il driver della shell VTS mantiene una connessione attiva durante il test, quindi l'unico overhead è la comunicazione USB. Nei nostri test, l'utilizzo del driver della shell VTS per eseguire un comando con 100 chiamate a un file binario gtest vuoto è circa il 20% più veloce rispetto all'utilizzo diadb shell
; la differenza effettiva è maggiore poiché la comunicazione della shell VTS prevede un'ampia registrazione. - Gestione dello stato. Il driver della shell VTS gestisce una sessione del terminale per ogni nome del terminale (il nome predefinito del terminale è default). Le variabili di ambiente impostate in una sessione del terminale sono disponibili solo per i comandi successivi nella stessa sessione.
- Allungabile. Le comunicazioni dei comandi della shell tra il framework VTS e il driver del dispositivo sono racchiuse in protobuf per consentire in futuro la compressione, il controllo remoto, la crittografia e così via. Sono disponibili anche altre possibilità per migliorare le prestazioni, inclusa l'analisi dei risultati lato dispositivo quando il sovraccarico della comunicazione diventa maggiore dell'analisi della stringa del risultato.
Svantaggi
Gli svantaggi dell'utilizzo del driver della shell VTS anziché adb
shell
includono:
- Binari aggiuntivi. I file dell'agente VTS devono essere inviati al dispositivo e ripuliti dopo l'esecuzione del test.
- Richiede una connessione attiva. Se la connessione TCP tra
host e agente viene persa durante il test (a causa di disconnessione USB, spegnimento della porta,
arresto anomalo del dispositivo e così via) intenzionalmente o involontariamente, un comando shell
non può essere trasmesso all'agente VTS. Anche con il passaggio automatico a
adb shell
, il risultato e lo stato del comando prima della disconnessione sarebbero sconosciuti.
Esempi
Esempi di utilizzo dei comandi shell in uno script di test Python lato host VTS:
- Recupera un oggetto dispositivo Android:
self.device = self.android_devices[0]
- Ottieni un oggetto shell per il dispositivo selezionato:
self.shell = self.device.shell
- Esegui un singolo comando shell:
results = self.shell.Execute(‘ls')
- Esegui un elenco di comandi shell:
results = self.shell.Execute([‘cd /data/local/tmp', ‘ls'])
Oggetto del risultato del comando
L'oggetto restituito dall'esecuzione del comando shell è un dizionario contenente le chiavi stdouts
, stderrs
e return_codes
.
Indipendentemente dal fatto che il comando shell sia fornito come singola stringa o come elenco di stringhe di comando, ogni valore del dizionario dei risultati è sempre un elenco.
Per verificare il codice di ritorno di un elenco di comandi, lo script di test deve controllare gli indici. Esempio:
asserts.assertFalse(any(results[‘return_codes']), ‘some command failed.')
In alternativa, lo script può controllare ogni indice di comando singolarmente. Esempio:
asserts.assertEqual(results[‘return_codes'][0], 0, ‘first command failed')
asserts.assertEqual(results[‘return_codes'][1], 0, ‘second command failed')