O AOSP inclui modelos de teste para módulos de teste que não são Python no lado do host do BaseTest do executor do VTS.
Os desenvolvedores podem usar esses modelos para minimizar o esforço envolvido para integrar esses testes. Nesta seção, você vai aprender a configurar e usar o modelos (localizados na VTS casos de teste/modelo do Google) e fornece exemplos dos modelos mais usados.
Modelo BinaryTest
Use o Teste binário para integrar testes que são executados no dispositivo de destino no VTS. Os testes do lado do alvo incluem:
- Testes baseados em C++ compilados e enviados ao dispositivo
- Testes do Python do lado do destino compilados como binários
- Scripts de shell executáveis em dispositivos.
Esses testes podem ser integrados ao VTS com ou sem o BinaryTest. modelo.
Integrar testes do lado do destino com Modelo BinaryTest
O modelo BinaryTest foi projetado para ajudar os desenvolvedores a integrar facilmente
no lado do alvo. Na maioria dos casos, você pode adicionar algumas linhas simples
configuração em AndroidTest.xml
. Exemplo de configuração de
VtsDeviceTreeEarlyMountTest:
<configuration description="Config for VTS VtsDeviceTreeEarlyMountTest."> ... <test class="com.android.tradefed.testtype.VtsMultiDeviceTest"> <option name="test-module-name" value="VtsDeviceTreeEarlyMountTest"/> <option name="binary-test-source" value="_32bit::DATA/nativetest/dt_early_mount_test/dt_early_mount_test" /> <option name="binary-test-source" value="_64bit::DATA/nativetest64/dt_early_mount_test/dt_early_mount_test" /> <option name="test-timeout" value="5m"/> </test> </configuration>
Nesta configuração:
binary-test-source
ebinary-test-type
estão específicos do modelo.- Especificar o caminho do host relativo da fonte binária de teste ativa o modelo para lidar com preparação, envio de arquivos, execução de testes, análise de resultados e limpeza.
- O modelo contém métodos relacionados à criação de casos de teste para subclasses a substituir.
- O modelo pressupõe um caso de teste por módulo binário de teste, e o binário O nome do arquivo de origem é usado como o nome do caso de teste por padrão.
Opções de configuração
O modelo BinaryTest é compatível com as seguintes opções de configuração:
Nome da opção | Tipo de valor | Descrição |
---|---|---|
Fonte-de-teste-binário | cordas | Caminhos de origem de teste binários relativos ao diretório de casos de teste vts em
host. Exemplo: DATA/nativetest/test |
Diretório-de-trabalho-de-teste-binário | cordas | Diretórios de trabalho (caminho do lado do dispositivo). Exemplo: /data/local/tmp/testing/ |
binary-test-envp | cordas | Variáveis de ambiente para binários. Exemplo: PATH=/new:$PATH |
binary-test-args | cordas | Argumentos ou flags de teste. Exemplo: --gtest_filter=test1 |
binary-test-ld-library-path | cordas | LD_LIBRARY_PATH .Exemplo: /data/local/tmp/lib |
binary-test-disable-framework | booleano | Execute adb stop para desativar o framework do Android antes do teste.
Exemplo: true |
binary-test-stop-native-servers | booleano | Interrompa todos os servidores nativos configurados corretamente durante o teste. Exemplo:
true |
tipo de teste binário | string | Tipo de modelo. Outros tipos de modelo se estendem a partir desse modelo, mas é
não precisa especificar essa opção para este modelo porque você já
binary-test-source especificado. |
Para opções com o tipo de valor strings
, é possível adicionar vários valores
repetindo as opções na configuração. Por exemplo, defina
binary-test-source
duas vezes (conforme mostrado no
exemplo VtsDeviceTreeEarlyMountTest
).
Tags de teste
É possível adicionar tags de teste usando o prefixo strings
nas opções.
e usando ::
como delimitador. As tags de teste são especialmente
útil ao incluir fontes binárias com o mesmo nome, mas com diferentes
bitness ou diretórios pai. Por exemplo, para evitar envio de arquivo ou nome de resultado
entre origens com o mesmo nome, mas de diretórios de origem diferentes,
é possível especificar
tags diferentes para essas origens.
Conforme mostrado no exemplo VtsDeviceTreeEarlyMountTest
com o
duas origens dt_early_mount_test
, as tags de teste são as
Prefixos _32bit::
e _64bit::
ativados
binary-test-source
. Tags que terminam com 32bit
ou
64bit
marca automaticamente os testes como disponíveis para uma quantidade de bits da ABI.
Ou seja, os testes com a tag _32bit
não são executados em uma ABI de 64 bits. Não
especificar uma tag é igual a usar uma tag com uma string vazia.
As opções com as mesmas tags são agrupadas e isoladas de outras tags. Para
exemplo, binary-test-args
com a tag _32bit
é
aplicada somente a binary-test-source
com a mesma tag e executada
em binary-test-working-directory
com a mesma tag. A
A opção binary-test-working-directory
é opcional para testes binários,
que permitem especificar um único diretório de trabalho para uma tag. Quando o
A opção binary-test-working-directory
não é especificada, o padrão é
são usados para cada tag.
O nome da tag é anexado diretamente ao nome do caso de teste no relatório de resultados.
Por exemplo, o caso de teste testcase1
com a tag _32bit
aparece como testcase1_32bit
no relatório de resultados.
Integrar testes do lado do destino sem Modelo BinaryTest
No VTS, o formato de teste padrão são testes Python no lado do host estendidos BaseTest no executor do VTS. Para integrar testes do lado do alvo, primeiro é preciso enviar por push o arquivos de teste no dispositivo, executar os testes usando comandos shell e, em seguida, analisar o usando scripts Python no lado do host.
Enviar binários de teste
Recomendamos enviar arquivos usando o preparador de destino VtsFilePusher
.
Exemplo:
<target_preparer class="com.android.compatibility.common.tradefed.targetprep.VtsFilePusher"> <option name="push" value="DATA/test->/data/local/tmp/test"/> </target_preparer>
O VtsFilePusher
faz o seguinte:
- Verifica a conectividade do dispositivo.
- Determina o caminho absoluto do arquivo de origem.
- Envia os arquivos usando o comando
adb push
. - Exclui os arquivos após a conclusão dos testes.
Como alternativa, é possível enviar arquivos manualmente usando um teste Python no lado do host que segue um procedimento semelhante.
Executar testes
Depois de enviar os arquivos para o dispositivo, execute o teste usando comandos do shell em um script de teste do Python no host. Exemplo:
device = self.android_devices[0] res = device.shell.Execute(["chmod a+x /data/local/tmp/test", "/data/local/tmp/test"]) asserts.AssertFalse(any(res[return_codes]))
Modelo GtestBinaryTest
A GtestBinaryTest modelo hospeda binários de teste do GTest, e cada um deles geralmente contém vários casos de teste. Este modelo estende o modelo BinaryTest substituindo configuração, criação de casos de teste e métodos de análise de resultados, portanto, todos os BinaryTest as configurações são herdadas.
O GtestBinaryTest adiciona a opção gtest-batch-mode
:
Nome da opção | Tipo de valor | Descrição |
---|---|---|
tipo de teste binário | string | Tipo de modelo. Usa o valor gtest . |
modo gtest-batch | booleano | Executar binários do Gtest em modo de lote. Exemplo: true |
Em geral, definir gtest-batch-mode
como true
aumenta o desempenho e diminui um pouco a confiabilidade. Conformidade com a VTS
vários módulos usam o modo em lote para melhorar o desempenho. Para confiabilidade
No entanto, se o modo não for especificado, o padrão será não lote.
Modo sem lote
O modo sem lote faz chamadas individuais ao binário GTest para cada caso de teste. Para exemplo, se o binário do GTest tiver 10 casos de teste (após a filtragem por host) configuração secundária), o binário é chamado 10 vezes no shell do dispositivo cada vez com um filtro de teste diferente. Para cada caso de teste, uma saída de resultado do GTest exclusiva O XML é gerado e analisado pelo modelo.
As vantagens de usar o modo não em lote incluem:
- Isolamento do caso de teste. Falha ou travamento em um caso de teste não afeta outros casos de teste.
- Granularidade. Mais fácil para conseguir perfil/cobertura por caso de teste medição, Systrace, relatório de bugs, logcat etc. Os registros e resultados de teste recuperados imediatamente após a conclusão de cada caso de teste.
As desvantagens de usar o modo não em lote incluem:
- Carregamento redundante: Cada vez que o binário do GTest é chamado, ele carrega bibliotecas relacionadas e executa as configurações iniciais da classe.
- Sobrecarga de comunicação: Após a conclusão de um teste, o host e o dispositivo de destino se comunicam para análise de resultados e próximos comandos (futuros possíveis otimizações).
Modo de lote
No modo em lote do GTest, o binário de teste é chamado apenas uma vez com um teste longo. valor de filtro que contém todos os casos de teste filtrados pela configuração no lado do host (este evita o problema de carregamento redundante no modo não lote). É possível analisar testes resultados para GTest usando output.xml ou a saída do terminal.
Ao usar output.xml (padrão):
Assim como no modo sem lote, o resultado do teste é analisado usando o XML de saída do GTest. . No entanto, como o XML de saída é gerado depois que todos os testes são concluído, se um caso de teste falhou o binário ou o dispositivo, nenhum arquivo XML de resultado foi gerada.
Ao usar a saída do terminal:
Enquanto o GTest está em execução, ele imprime o registro de teste e avança para o terminal. em um formato que possa ser analisado pelo framework quanto ao status, resultados e ou de sistemas operacionais de contêineres.
As vantagens de usar o modo em lote incluem:
- Isolamento do caso de teste. Oferece o mesmo nível de teste isolamento de casos como modo sem lote se o framework reiniciar o binário/dispositivo após uma falha com um filtro de teste reduzido, excluindo testes concluídos e com falha casos de uso diferentes.
- Granularidade. Fornece a mesma granularidade de caso de teste que em um modo que não seja em lote.
As desvantagens de usar o modo de lote incluem:
- Custo de manutenção. Se o formato de geração de registros do GTest mudar, todos os testes apresentarão falhas.
- Confusão. Um caso de teste pode gerar algo semelhante a GTest o formato de progresso, o que pode confundir o formato.
Devido a essas desvantagens, removemos temporariamente a opção de usar saída da linha de comando. Vamos rever essa opção no futuro para melhorar a confiabilidade dessa função.
Modelo HostBinaryTest
O modelo HostBinaryTest inclui executáveis do lado do host que não existem em outros diretórios ou em scripts Python. Esses testes incluem:
- Binários de teste compilados executáveis no host
- Scripts executáveis em shell, Python ou outras linguagens
Um exemplo é o VTS Teste do host da política de SELinux de segurança:
<configuration description="Config for VTS Security SELinux policy host-side test cases"> ... <test class="com.android.tradefed.testtype.VtsMultiDeviceTest"> <option name="test-module-name" value="VtsSecuritySelinuxPolicyHost"/> <option name="binary-test-source" value="out/host/linux-x86/bin/VtsSecuritySelinuxPolicyHostTest" /> <option name="binary-test-type" value="host_binary_test"/> </test> </configuration>
HostBinaryTest não estende o modelo BinaryTest, mas usa similares
configurações de teste. No exemplo acima, o binary-test-source
especifica um caminho relativo do lado do host para o executável de teste, e
O valor da coluna binary-test-type
é host_binary_test
. Semelhante a
BinaryTest, o nome do arquivo binário é usado como o nome do caso de teste
padrão.
Estender modelos
É possível usar modelos diretamente na configuração de teste para incluir testes que não sejam Python ou estendê-los em uma subclasse para lidar com requisitos de teste específicos. Modelos em o repositório VTS tem as seguintes extensões:
Os desenvolvedores são encorajados a estender qualquer modelo existente para quaisquer e requisitos de teste. Estes são alguns motivos comuns para ampliar modelos:
- Procedimentos especiais de configuração de testes, como preparar um dispositivo com comandos
- Gerar diferentes casos e nomes de testes.
- Analisar resultados lendo a saída do comando ou usando outras condições.
Para facilitar a extensão dos modelos existentes, eles contêm métodos especializada para cada funcionalidade. Se você melhorou os designs , recomendamos que você contribua para a base de código VTS.