Durante il test VTS, i comandi della shell vengono utilizzati per eseguire un test lato destinazione
binario, per ottenere/impostare proprietà, variabili di ambiente e informazioni di sistema,
e avviare/interrompere il framework Android. Puoi eseguire la shell del dispositivo VTS
utilizzando il comando adb shell
o il driver della shell VTS
in esecuzione sul dispositivo (consigliato).
Usa shell ADB
Test che richiedono l'arresto della porta USB o il riavvio del dispositivo durante
i test devono utilizzare la shell ADB poiché il driver shell VTS non è disponibile senza
connessione USB permanente. Puoi richiamare la shell ADB dalla
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 shell VTS
Il driver shell VTS è un programma binario dell'agente che viene eseguito sul dispositivo
shell. Per impostazione predefinita, VTS utilizza il driver shell se questo è in esecuzione
sul dispositivo perché questo metodo ha meno latenza rispetto all'uso del comando adb
shell
.
Il framework VTS supporta i test multi-dispositivo in cui ogni dispositivo Android è rappresentato come un oggetto AndroidDevice in Base Runner. Per impostazione predefinita, il framework esegue il push dei file binari del driver della shell VTS e dell'agente VTS su ogni dispositivo Android e stabilisce le connessioni TCP con gli agenti VTS su questi dispositivi.
Per eseguire un comando shell, lo script Python lato host crea una funzione all'oggetto ShellMirror all'interno dell'oggetto AndroidDevice. Lo ShellMirror pacchettizza i testi dei comandi shell in un protobuf un messaggio e lo invia (tramite il canale TCP) all'agente VTS su Android dispositivo. L'agente in esecuzione sul dispositivo inoltra quindi il comando della shell alla shell VTS tramite il socket Unix.
Quando il driver della shell VTS riceve un comando, lo esegue
tramite nohup su
il rivestimento esterno del dispositivo per evitare che si blocchi. I codici Stdout, stderr e Return
recuperato da nohup
e rispedito all'agente VTS. Infine, l'agente
risponde all'host aggregando i risultati del comando in una
protobuf
messaggio.
Vantaggi
I vantaggi dell'utilizzo del driver shell VTS anziché adb
shell
includono:
- Affidabilità. Il driver shell VTS utilizza
nohup
per eseguire comandi in base all'impostazione predefinita. Poiché i test VTS principalmente test HAL e del kernel di livello inferiore,nohup
garantisce che non si bloccano durante l'esecuzione. - Prestazioni. Mentre il comando
adb shell
memorizza nella cache alcuni risultati (ad esempio elenca i file di una directory) ha una connessione overhead quando si eseguono attività come l'esecuzione di un programma binario di test. Driver shell VTS mantiene una connessione attiva per tutta la durata del test in modo che l'unico overhead sia costituito da USB comunicazione. Nei nostri test, abbiamo usato il driver shell VTS per eseguire un comando 100 chiamate a un file binario gtest vuoto sono circa il 20% più veloci rispetto all'utilizzoadb shell
; la differenza effettiva è maggiore poiché la shell VTS la comunicazione ha una registrazione estesa. - Conservazione dello stato. Il driver shell VTS mantiene un terminale sessione per ciascun nome terminale (il nome predefinito è predefinita). Le variabili di ambiente impostate in una sessione del terminale sono disponibili solo per i comandi successivi nella stessa sessione.
- Allungabile. Comunicazioni del comando shell tra VTS e il driver del dispositivo sono aggregati in protobuf per consentire compressione, comunicazione remota, crittografia e così via. Altre possibilità per sono disponibili anche funzionalità per migliorare il rendimento, tra cui l'analisi dei risultati lato dispositivo quando l'overhead di comunicazione diventa superiore all'analisi della stringa di risultati.
Svantaggi
Gli svantaggi dell'utilizzo del driver shell VTS invece di adb
shell
includono:
- File binari aggiuntivi. I file dell'agente VTS devono essere inviati dispositivo e i dati sono ripuliti dopo l'esecuzione del test.
- Richiede una connessione attiva. Se la connessione TCP tra
l'host e l'agente vengono persi durante il test (a causa della disconnessione USB, dell'arresto della porta
arresto anomalo del dispositivo e così via), intenzionalmente o meno, un comando shell
non possono essere trasmessi all'agente VTS. Anche con il passaggio automatico
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]
- Recupera 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 risultato del comando
L'oggetto restituito dall'esecuzione del comando shell è un dizionario contenente
chiavi stdouts
, stderrs
e return_codes
.
A prescindere 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 restituito 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 singolarmente ogni indice dei comandi. Esempio:
asserts.assertEqual(results[‘return_codes'][0], 0, ‘first command failed')
asserts.assertEqual(results[‘return_codes'][1], 0, ‘second command failed')