Durante o teste VTS, os comandos do shell são usados para executar um teste no lado do alvo.
para receber/definir propriedades, variáveis de ambiente e informações do sistema,
e para iniciar/parar o framework do Android. É possível executar o shell do dispositivo VTS
usando o comando adb shell
ou o driver de shell do VTS
em execução no dispositivo (recomendado).
Usar o shell do adb
Testes que exigem o desligamento da porta USB ou a reinicialização do dispositivo durante
testes devem usar o shell do ADB, pois o driver do shell do VTS não está disponível sem uma
conexão USB permanente. É possível invocar o shell ADB pelo
Objeto AndroidDevice
no script de teste do Python. Exemplos:
- Receba um objeto de dispositivo Android:
self.device = self.android_devices[0]
- Emita um único comando shell:
result = self.device.adb.shell(‘ls')
Usar o driver do shell do VTS
O driver do shell do VTS é um binário de agente que é executado no dispositivo
do shell do Cloud Shell. Por padrão, o VTS usa o driver shell se o driver estiver em execução
no dispositivo, porque esse método tem menos latência do que usar o comando adb
shell
.
O framework VTS oferece suporte a testes multidispositivo em que cada dispositivo Android é representado como um objeto AndroidDevice no executor base. Por padrão, o VTS o framework envia binários do agente VTS e do driver de shell do VTS para cada dispositivo Android e estabelece conexões TCP com os agentes VTS nesses dispositivos.
Para executar um comando shell, o script Python do lado do host cria uma função chamada para o objeto ShellMirror dentro do objeto AndroidDevice. ShellMirror empacota os textos do comando shell em um protobuf e a envia (pelo canal TCP) para o agente VTS no Android dispositivo. O agente em execução no dispositivo encaminha o comando shell para o shell do VTS por um soquete Unix.
Quando o driver do shell do VTS recebe um comando do shell, ele executa o comando
via nohup em
shell do dispositivo para evitar travamentos. Stdout, stderr e o código de retorno são
recuperado de nohup
e enviado de volta ao agente VTS. Por fim, o agente
responde ao host encapsulando os resultados do comando
protobuf
mensagem.
Vantagens
As vantagens de usar o driver de shell do VTS em vez de adb
shell
incluem:
- Confiabilidade. O driver do shell do VTS usa
nohup
para executar comandos na configuração padrão. Como os testes VTS são principalmente testes de kernel e HAL de nível inferior, onohup
garante que o shell não travam durante a execução. - Desempenho. Enquanto o comando
adb shell
armazena em cache alguns resultados (como listar arquivos em um diretório) de que há uma conexão ao realizar tarefas como a execução de um binário de teste. Driver de shell do VTS mantém uma conexão ativa durante todo o teste, de modo que a única sobrecarga é de USB. comunicação. Em nossos testes, usar o driver de shell do VTS para executar um comando com As chamadas 100 para um binário gtest vazio são cerca de 20% mais rápidas do que usaradb shell
a diferença real é maior, já que o shell do VTS em nuvem tem registros extensivos. - Manutenção do estado. O driver do shell do VTS mantém um sessão para cada nome de terminal (o nome padrão do terminal é default). As variáveis de ambiente definidas em uma sessão do terminal são disponíveis apenas para comandos subsequentes na mesma sessão.
- Extensível. Comunicação de comando do shell entre o VTS e o driver do dispositivo são unidos em protobuf para permitir possíveis compactação, comunicação remota, criptografia etc. no futuro. Outras possibilidades para melhorar o desempenho, incluindo a análise de resultados no lado do dispositivo quando a sobrecarga de comunicação se torna maior do que a análise da string resultante.
Desvantagens
As desvantagens de usar o driver de shell do VTS em vez de adb
shell
incluem:
- Binários adicionais. Os arquivos do agente VTS precisam ser enviados no dispositivo e limpos após a execução do teste.
- Requer conexão ativa. Se a conexão TCP entre
host e agente são perdidos durante o teste (devido à desconexão do USB, encerramento da porta
falha do dispositivo etc.) intencionalmente ou não, um comando shell
não pode ser transmitido ao agente VTS. Mesmo com a mudança automática para
adb shell
, o resultado e o estado do comando antes da desconexão é desconhecido.
Exemplos
Exemplos de como usar comandos do shell em um script de teste Python no lado do host do VTS:
- Receba um objeto de dispositivo Android:
self.device = self.android_devices[0]
- Receba um objeto shell para o dispositivo selecionado:
self.shell = self.device.shell
- Emita um único comando shell:
results = self.shell.Execute(‘ls')
- Emita uma lista de comandos do shell:
results = self.shell.Execute([‘cd /data/local/tmp', ‘ls'])
Objeto de resultado do comando
O objeto de retorno da execução do comando shell é um dicionário que contém as
chaves stdouts
, stderrs
e return_codes
.
Independentemente de o comando shell ser fornecido como uma única string ou uma lista
de strings de comando, cada valor do dicionário de resultado é sempre uma lista.
Para verificar o código de retorno de uma lista de comandos, o script de teste deve verificar os índices. Exemplo:
asserts.assertFalse(any(results[‘return_codes']), ‘some command failed.')
Como alternativa, o script pode verificar cada índice de comando individualmente. Exemplo:
asserts.assertEqual(results[‘return_codes'][0], 0, ‘first command failed')
asserts.assertEqual(results[‘return_codes'][1], 0, ‘second command failed')