Ler em inglês

Compartilhar via


Executar testes de interface do usuário usando a API REST do App Center

Importante

O Visual Studio App Center está programado para ser desativado em 31 de março de 2025. Embora você possa continuar a usar o Visual Studio App Center até que ele seja totalmente desativado, há várias alternativas recomendadas para as quais você pode considerar migrar.

Saiba mais sobre cronogramas e alternativas de suporte.

Este exemplo mostra como carregar um pacote de aplicativos, testar binários e enfileirar testes de interface do usuário usando nossa API.

Etapas

  1. Use o método create test run POST para receber uma ID de execução de teste, que você usará posteriormente para o Cabeçalho de Resposta.

Solicitação de amostra https://api.appcenter.ms/v0.1/apps/MSKASANI/DroidAppSampleXamarin/test_runsCaptura de tela demonstrando o uso da API

  1. Crie hashes de arquivo para cada arquivo que você deseja carregar no Teste do App Center.

Você pode obter os hashes de arquivo executando o comando shasum. Este utilitário está disponível em máquinas Mac/Linux por padrão. Para Windows, considere instalar o Git Bash e usá-lo.

Exemplo

ankasani@AK--PC MINGW64 ~/source/repos/AppXamarin/sampleapp-xamarin-master/UITest/bin/Debug/testdlls (master)

$ shasum nunit.framework.dll
 a2d0dbc920fb3790d4d625e5c47be042ca32c051 *nunit.framework.dll

$ shasum Xamarin.UITest.dll
c1f7342d05a9d95580a507156207e6f9283a2c8d *Xamarin.UITest.dll

$ shasum UITest.dll
542153902bc889d0d85a83b005854b5ebd9864f1 *UITest.dll

$ shasum com.mobilecenter.sampleappxamarin.apk
3f3677f8db9ba7c07ac77d4f01f912e518a6ca16 *com.mobilecenter.sampleappxamarin.apk
  1. Crie um repositório para arquivos usando POST e o valor de hashes calculado na etapa anterior.

Solicitação de Exemplohttps://api.appcenter.ms/v0.1/apps/MSKASANI/DroidAppSampleXamarin/test_runs/fb0cc373-aa4a-455f-b083-4fc1afa87f2e/hashes/batch

  • file_type - arquivo de aplicativo para apk\ipa e arquivo de teste para assemblies de teste/arquivos relacionados a teste.

  • soma de verificação - valores de hash da etapa 2

  • relative_path - você pode definir o nome do arquivo com a extensão, sem necessidade de especificar o caminho completo.

O corpo JSON tem a seguinte aparência:

[
    {
     "file_type":"app-file", 
     "checksum":"3f3677f8db9ba7c07ac77d4f01f912e518a6ca16",
     "relative_path":"com.mobilecenter.sampleappxamarin.apk"
    }, 
    
    {
     "file_type":"test-file",
     "checksum":"a2d0dbc920fb3790d4d625e5c47be042ca32c051",
     "relative_path":"nunit.framework.dll"
    }, 
    
    {
     "file_type":"test-file",
     "checksum":"c1f7342d05a9d95580a507156207e6f9283a2c8d",
     "relative_path":"Xamarin.UITest.dll"
    }, 
    
    {
     "file_type":"test-file",
     "checksum":"542153902bc889d0d85a83b005854b5ebd9864f1",
     "relative_path":"UITest.dll"
    }
]

Captura de tela demonstrando o upload da API de teste json

A resposta tem essa aparência:

[
    {
     "fileType": "app-file",
     "checksum": "3f3677f8db9ba7c07ac77d4f01f912e518a6ca16",
     "relativePath": "com.mobilecenter.sampleappxamarin.apk",
     
     "uploadStatus":
        {
         "statusCode": 412,
         "location": "https://testcloud.xamarin.com/v0.1/direct_uploads?token=ZXlKMGVYQWlPaUpLVjFRaUxDSmhiR2NpT2lKU1V6STFOaUo5LmV5SjBaWE4w%0AWDNKMWJsOXBaQ0k2SWpjNU5EVmpNbUZtTFRFeFpXTXROR1ptWVMwNU1XSTBM%0AVFExTUdJd09EVTNNbU5sT1NJc0ltVjRjQ0k2TVRVek16Z3dOVFEzTUgwLlJO%0AaTQ3VTNPYTB5YWswMVRVdTV6Q0dfWFhwV25QUWJDdkJaNmVCRWRmOENuQ19U%0AbmdpRGI4MU0yYk1lTlZNY1VCVmRWLXlkRjh4dElLaU1yNFdtQUFhOFdoay02%0AOVVjb29rYkNTYUU2eUlzamowZlZPZVJhR2lFdGpvLWJHTFJLcXNGY0ZTeUdR%0ARTQzQUZ1TFlyTWlCRnowMElpd3ZudjYzZk9wQnRGaXhNa2lNNjhUTWxxVnNa%0AOFl3TFlTeU5KSWFvYVJCM0ZZTUkwajNYOWdVb3VJclVjNnpqcGNkYkxCcWJ0%0AVUpyN0ZFaTdJeWY4UG9rMXZxTzRlUExiaEszTmItTmd0Q2JuckZzS2x6Z3Za%0AaktUWHZZb2oya0FGWXZHaVZ4LVhfNVhUcGdiVnE1Z2dxVEtIdjRaUGFuaGR4%0AdnFvZ2YxRVYwWUJYaG40YUJLM3BnUVBodw%3D%3D%0A"
        }
    },

    {
     "fileType": "test-file",
     "checksum": "a2d0dbc920fb3790d4d625e5c47be042ca32c051",
     "relativePath": "nunit.framework.dll",
     
     "uploadStatus":
        {
         "statusCode": 412,
         "location": "https://testcloud.xamarin.com/v0.1/direct_uploads?token=ZXlKMGVYQWlPaUpLVjFRaUxDSmhiR2NpT2lKU1V6STFOaUo5LmV5SjBaWE4w%0AWDNKMWJsOXBaQ0k2SWpjNU5EVmpNbUZtTFRFeFpXTXROR1ptWVMwNU1XSTBM%0AVFExTUdJd09EVTNNbU5sT1NJc0ltVjRjQ0k2TVRVek16Z3dOVFEzTUgwLlJO%0AaTQ3VTNPYTB5YWswMVRVdTV6Q0dfWFhwV25QUWJDdkJaNmVCRWRmOENuQ19U%0AbmdpRGI4MU0yYk1lTlZNY1VCVmRWLXlkRjh4dElLaU1yNFdtQUFhOFdoay02%0AOVVjb29rYkNTYUU2eUlzamowZlZPZVJhR2lFdGpvLWJHTFJLcXNGY0ZTeUdR%0ARTQzQUZ1TFlyTWlCRnowMElpd3ZudjYzZk9wQnRGaXhNa2lNNjhUTWxxVnNa%0AOFl3TFlTeU5KSWFvYVJCM0ZZTUkwajNYOWdVb3VJclVjNnpqcGNkYkxCcWJ0%0AVUpyN0ZFaTdJeWY4UG9rMXZxTzRlUExiaEszTmItTmd0Q2JuckZzS2x6Z3Za%0AaktUWHZZb2oya0FGWXZHaVZ4LVhfNVhUcGdiVnE1Z2dxVEtIdjRaUGFuaGR4%0AdnFvZ2YxRVYwWUJYaG40YUJLM3BnUVBodw%3D%3D%0A"
        }
    },
 
    {
     "fileType": "test-file",
     "checksum": "c1f7342d05a9d95580a507156207e6f9283a2c8d",
     "relativePath": "Xamarin.UITest.dll",
     
     "uploadStatus":
        {
         "statusCode": 412,
         "location": "https://testcloud.xamarin.com/v0.1/direct_uploads?token=ZXlKMGVYQWlPaUpLVjFRaUxDSmhiR2NpT2lKU1V6STFOaUo5LmV5SjBaWE4w%0AWDNKMWJsOXBaQ0k2SWpjNU5EVmpNbUZtTFRFeFpXTXROR1ptWVMwNU1XSTBM%0AVFExTUdJd09EVTNNbU5sT1NJc0ltVjRjQ0k2TVRVek16Z3dOVFEzTUgwLlJO%0AaTQ3VTNPYTB5YWswMVRVdTV6Q0dfWFhwV25QUWJDdkJaNmVCRWRmOENuQ19U%0AbmdpRGI4MU0yYk1lTlZNY1VCVmRWLXlkRjh4dElLaU1yNFdtQUFhOFdoay02%0AOVVjb29rYkNTYUU2eUlzamowZlZPZVJhR2lFdGpvLWJHTFJLcXNGY0ZTeUdR%0ARTQzQUZ1TFlyTWlCRnowMElpd3ZudjYzZk9wQnRGaXhNa2lNNjhUTWxxVnNa%0AOFl3TFlTeU5KSWFvYVJCM0ZZTUkwajNYOWdVb3VJclVjNnpqcGNkYkxCcWJ0%0AVUpyN0ZFaTdJeWY4UG9rMXZxTzRlUExiaEszTmItTmd0Q2JuckZzS2x6Z3Za%0AaktUWHZZb2oya0FGWXZHaVZ4LVhfNVhUcGdiVnE1Z2dxVEtIdjRaUGFuaGR4%0AdnFvZ2YxRVYwWUJYaG40YUJLM3BnUVBodw%3D%3D%0A"
        }
    },

    {
     "fileType": "test-file",
     "checksum": "542153902bc889d0d85a83b005854b5ebd9864f1",
     "relativePath": "UITest.dll",
     
     "uploadStatus":
        {
         "statusCode": 412,
         "location": "https://testcloud.xamarin.com/v0.1/direct_uploads?token=ZXlKMGVYQWlPaUpLVjFRaUxDSmhiR2NpT2lKU1V6STFOaUo5LmV5SjBaWE4w%0AWDNKMWJsOXBaQ0k2SWpjNU5EVmpNbUZtTFRFeFpXTXROR1ptWVMwNU1XSTBM%0AVFExTUdJd09EVTNNbU5sT1NJc0ltVjRjQ0k2TVRVek16Z3dOVFEzTUgwLlJO%0AaTQ3VTNPYTB5YWswMVRVdTV6Q0dfWFhwV25QUWJDdkJaNmVCRWRmOENuQ19U%0AbmdpRGI4MU0yYk1lTlZNY1VCVmRWLXlkRjh4dElLaU1yNFdtQUFhOFdoay02%0AOVVjb29rYkNTYUU2eUlzamowZlZPZVJhR2lFdGpvLWJHTFJLcXNGY0ZTeUdR%0ARTQzQUZ1TFlyTWlCRnowMElpd3ZudjYzZk9wQnRGaXhNa2lNNjhUTWxxVnNa%0AOFl3TFlTeU5KSWFvYVJCM0ZZTUkwajNYOWdVb3VJclVjNnpqcGNkYkxCcWJ0%0AVUpyN0ZFaTdJeWY4UG9rMXZxTzRlUExiaEszTmItTmd0Q2JuckZzS2x6Z3Za%0AaktUWHZZb2oya0FGWXZHaVZ4LVhfNVhUcGdiVnE1Z2dxVEtIdjRaUGFuaGR4%0AdnFvZ2YxRVYwWUJYaG40YUJLM3BnUVBodw%3D%3D%0A"
        }
    }
]
  1. Agora precisamos fazer o upload dos arquivos reais. No corpo da resposta anterior, identifique o location que contém a URL dos arquivos que você está carregando.

    • Nos cabeçalhos, você precisa passar Content-Type: multipart/form-data
    • No Corpo, você precisa usar o tipo Body_Form com os valores:
      • relative_path e file_type: do Corpo da Resposta anterior
      • file: Caminho para o arquivo real

Você está no caminho certo se receber 201 Created a resposta abaixo.

Captura de tela da API criando a execução do teste

(Estamos na metade do caminho)

  1. Repita a etapa anterior para o restante dos arquivos que deseja enviar.

  2. Estamos prontos para executar o teste agora. Para isso, precisamos de um device_slug.

Observação: você deve primeiro criar "Conjuntos de dispositivos" em sua organização ou pode usar a API REST para criar conjuntos de dispositivos.

Em seguida, você pode usar o método GET para obter a lista de conjuntos de dispositivos.

Exemplo de solicitação:https://api.appcenter.ms/v0.1/apps/MSKASANI/DroidAppSampleXamarin/owner/device_sets

Captura de tela da chamada de API para listar conjuntos de dispositivos

Corpo da resposta correspondente:

{
     "id": "00917fb6-f30f-4d36-bd53-f900a94efe9f",
     "name": "UI Test",
     "slug": "ui-test",
     "osVersionCount": 1,
     "manufacturerCount": 1,

    "owner":
    {
        "type": "organization",
        "id": "5dd75115-3832-4f10-9cfe-5ac8cc8a51a5",
        "displayName": "MSKASANI",
        "name": "MSKASANI"
    },
 
    "deviceConfigurations":
    {
        {
            "id": "717cfc38-4817-41fc-8a8e-06beef4f73b2",
            "image":
            {
                "thumb": "https://testcloud-prod-system-files.s3-eu-west-1.amazonaws.com/system_files/0dee6ee7-6839-4e4e-ad0b-333e3952f75c?response-cache-control=max-age%3D157788000&AWSAccessKeyId=AKIAI4UZT4FCOF2OTJYQ&Signature=r9EEm/x0YAA4NhRJ%2BhVSQwGtBbI%3D&Expires=1691079085"
            },

            "os": "8.1.0",
            "osName": "Android 8.1.0",
            "model":
            {
                "name": "Google Pixel 2 XL", 
                "manufacturer": "Google", 
                "releaseDate": "October 2017", 
                "formFactor": "phone"
            }
        }
    }
}
  1. Agora estamos prontos para usar a API de início de teste para acionar o teste! O corpo da solicitação abaixo é criado para o Xamarin.UITest Framework. Se você estiver usando outros frameworks, consulte o final do documento para obter mais detalhes!

Exemplo de corpo da solicitação JSON:

{
   "test_framework":"ui_test",
   "device_selection":"MSKASANI/ui-test",
   "locale":"en_US",
   "test_series":"apimain",
 
   "test_parameters":
        {
         "tests":
            {
    
             "method":
                {
                 "UITest.dll":
                    [
                     "UITest.Tests(Android).AppLaunches",
                     "UITest.Tests(iOS).AppLaunches"
                    ]
                },
             
             "fixture":
                {
                 "UITest.dll":
                    [
                     "UITest.Tests(Android)",
                     "UITest.Tests(iOS)"
                    ]
                }
            }
        }
}

Corpo da resposta correspondente:

{
    "accepted_devices":["Google Pixel 2 XL (8.1.0)"],
    "rejected_devices":[]
}

Captura de tela da chamada de API para listar dispositivos

Se você for agora para a página Teste do seu aplicativo, verá...

Captura de tela do teste em andamento

Parabéns! :)

PS: Para outros frameworks de teste, se você quiser saber como é o JSON (por exemplo, teste Appium)

Execute o comando Test manualmente com --debug switch.

appcenter test run appium --app "MSKASANI/Appium" --devices "MSKASANI/my" --app-path C:\VSAC\AllTest\AppCenter-Test-Samples-main\Appium\Android\swiftnote.apk --test-series "main" --locale "en_US" --build-dir C:\VSAC\AllTest\AppCenter-Test-Samples-main\Appium\Android\Mavenex\target\upload --debug

Depois que o teste for concluído, você poderá verificar a saída do Comando para ver a aparência do Corpo da Solicitação:

Captura de tela da saída do terminal API

BÔNUS! Dessa forma, você pode usar a saída CLI para ver como nossos comandos enfileiram os testes usando nossa API!