Durante o teste VTS, comandos shell são usados para executar um binário de teste do lado do destino, para obter/definir propriedades, variáveis de ambiente e informações do sistema, e para iniciar/parar a estrutura Android. Você pode executar comandos shell do dispositivo VTS usando o comando adb shell
ou o driver shell VTS em execução no dispositivo (recomendado).
Usar shell ADB
Os testes que exigem o desligamento da porta USB ou a reinicialização do dispositivo durante o teste devem usar o shell ADB, pois o driver do shell VTS não está disponível sem uma conexão USB persistente. Você pode invocar o shell ADB do objeto AndroidDevice
no script de teste Python. Exemplos:
- Obtenha um objeto de dispositivo Android:
self.device = self.android_devices[0]
- Emita um único comando shell:
result = self.device.adb.shell(‘ls')
Use o driver shell VTS
O driver shell VTS é um agente binário que é executado no dispositivo e executa comandos shell. Por padrão, o VTS usa o driver shell se o driver estiver sendo executado no dispositivo porque esse método tem menos latência do que usar o comando adb shell
.
A estrutura VTS oferece suporte a testes de vários dispositivos, onde cada dispositivo Android é representado como um objeto AndroidDevice no executor base. Por padrão, a estrutura VTS envia binários do agente VTS e do driver shell 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 faz uma chamada de função para o objeto ShellMirror dentro do objeto AndroidDevice. O objeto ShellMirror empacota os textos do comando shell em uma mensagem protobuf e a envia (por meio do canal TCP) para o agente VTS no dispositivo Android. O agente em execução no dispositivo encaminha o comando shell para o driver shell VTS por meio do soquete Unix.
Quando o driver shell VTS recebe um comando shell, ele executa o comando via nohup no shell do dispositivo para evitar congelamento. Stdout, stderr e código de retorno são então recuperados do nohup
e enviados de volta ao agente VTS. Finalmente, o agente responde ao host agrupando os resultados do comando em uma mensagem protobuf
.
Vantagens
As vantagens de usar o driver shell VTS em vez do adb shell
incluem:
- Confiabilidade. O driver shell VTS usa
nohup
para executar comandos na configuração padrão. Como os testes VTS são em sua maioria testes HAL e de kernel de nível inferior,nohup
garante que os comandos shell não travem durante a execução. - Desempenho . Embora o comando
adb shell
armazene em cache alguns resultados (como listar arquivos em um diretório), ele tem uma sobrecarga de conexão ao executar tarefas como executar um binário de teste. O driver shell VTS mantém uma conexão ativa durante todo o teste, portanto a única sobrecarga é a comunicação USB. Em nossos testes, usar o driver shell VTS para executar um comando com 100 chamadas para um binário gtest vazio é cerca de 20% mais rápido do que usaradb shell
; a diferença real é maior, pois a comunicação do shell VTS possui registro extensivo. - Manutenção do Estado . O driver shell VTS mantém uma sessão de terminal para cada nome de terminal (o nome do terminal padrão é default ). As variáveis de ambiente definidas em uma sessão de terminal estão disponíveis apenas para comandos subsequentes na mesma sessão.
- Extensível . As comunicações de comando Shell entre a estrutura VTS e o driver de dispositivo são agrupadas em protobuf para permitir possível compactação, comunicação remota, criptografia, etc. Outras possibilidades para melhorar o desempenho também estão disponíveis, 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 cadeia de resultados.
Desvantagens
As desvantagens de usar o driver shell VTS em vez do adb shell
incluem:
- Binários adicionais . Os arquivos do agente VTS devem ser enviados para o dispositivo e limpos após a execução do teste.
- Requer conexão ativa . Se a conexão TCP entre o host e o agente for perdida durante o teste (devido à desconexão do USB, desligamento da porta, falha do dispositivo, etc.), intencionalmente ou não, um comando shell não poderá 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 seriam desconhecidos.
Exemplos
Exemplos de uso de comandos shell em um script de teste Python do lado do host VTS:
- Obtenha um objeto de dispositivo Android:
self.device = self.android_devices[0]
- Obtenha 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 shell:
results = self.shell.Execute([‘cd /data/local/tmp', ‘ls'])
Objeto de resultado de comando
O objeto de retorno da execução do comando shell é um dicionário contendo 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 resultados é 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.')
Alternativamente, 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')