Eseguire test dell'interfaccia utente usando l'API REST di App Center
Importante
Visual Studio App Center è pianificato per il ritiro il 31 marzo 2025. Anche se è possibile continuare a usare Visual Studio App Center fino a quando non viene completamente ritirato, esistono diverse alternative consigliate a cui è possibile considerare la migrazione.
Altre informazioni sulle sequenze temporali e sulle alternative di supporto.
Questo esempio illustra come caricare un pacchetto dell'app, testare i file binari e i test dell'interfaccia utente della coda usando l'API.
- Usare il metodo POST di creazione dell'esecuzione del test per ricevere un ID esecuzione test, che verrà usato in un secondo momento per l'intestazione della risposta.
Richiesta di esempio https://api.appcenter.ms/v0.1/apps/MSKASANI/DroidAppSampleXamarin/test_runs
- Creare hash di file per ogni file che si vuole caricare nel test di App Center.
È possibile ottenere gli hash del file eseguendo il comando shasum
. Questa utilità è disponibile nei computer Mac/Linux per impostazione predefinita. Per Windows, è consigliabile installare Git Bash e usarlo.
Esempio
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
- Creare un archivio per i file usando POST e il valore degli hash calcolati nel passaggio precedente.
Richiesta di esempiohttps://api.appcenter.ms/v0.1/apps/MSKASANI/DroidAppSampleXamarin/test_runs/fb0cc373-aa4a-455f-b083-4fc1afa87f2e/hashes/batch
file_type : file app per apk\ipa e file di test per assembly di test/file correlati ai test.
checksum - Valori hash del passaggio 2
relative_path: è possibile definire il nome file con estensione, non è necessario specificare il percorso completo.
Il corpo JSON è simile al seguente:
[
{
"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"
}
]
La risposta ha un aspetto simile al seguente:
[
{
"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"
}
}
]
A questo momento è necessario caricare i file effettivi. Dal corpo della risposta precedente identificare l'oggetto
location
che contiene l'URL dei file caricati.- Nelle intestazioni è necessario passare Content-Type: multipart/form-data
- Nel corpo è necessario usare il tipo Body_Form con i valori:
relative_path
efile_type
: dal corpo della risposta precedentefile
: percorso del file effettivo
Si è sulla strada giusta se si ottiene 201 Created
come risposta come sotto.
(Siamo a metà strada)
Ripetere il passaggio precedente per il resto dei file da caricare.
È ora possibile eseguire il test. Per questo, abbiamo bisogno di un device_slug.
Nota: è prima necessario creare "Set di dispositivi" nell'organizzazione oppure usare l'API REST per creare set di dispositivi.
È quindi possibile usare il metodo GET per ottenere l'elenco dei set di dispositivi.
Richiesta di esempio: https://api.appcenter.ms/v0.1/apps/MSKASANI/DroidAppSampleXamarin/owner/device_sets
Corpo della risposta corrispondente:
{
"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"
}
}
}
}
- A questo punto è possibile usare l'API di avvio dei test per attivare il test. Il corpo della richiesta seguente viene creato per Xamarin.UITest Framework. Se si usano altri framework, fare riferimento alla fine del documento per altri dettagli.
Corpo della richiesta JSON di esempio:
{
"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 della risposta corrispondente:
{
"accepted_devices":["Google Pixel 2 XL (8.1.0)"],
"rejected_devices":[]
}
Se si passa ora alla pagina Test dell'app, verrà visualizzato...
Complimenti. :)
PS: per altri framework di test, se si vuole conoscere l'aspetto del codice JSON (ad esempio, test di Appium)
Eseguire manualmente il comando Test con --debug
l'opzione .
esecuzione test appcenter --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
Al termine del test, è possibile controllare l'output del comando per verificare l'aspetto del corpo della richiesta:
BONUS! In questo modo è possibile usare l'output dell'interfaccia della riga di comando per vedere in che modo i comandi accodare i test usando l'API.