diff options
author | Jason Smith <jason.smith@xamarin.com> | 2016-03-22 13:02:25 -0700 |
---|---|---|
committer | Jason Smith <jason.smith@xamarin.com> | 2016-03-22 16:13:41 -0700 |
commit | 17fdde66d94155fc62a034fa6658995bef6fd6e5 (patch) | |
tree | b5e5073a2a7b15cdbe826faa5c763e270a505729 /Xamarin.Forms.Android.UITests | |
download | xamarin-forms-17fdde66d94155fc62a034fa6658995bef6fd6e5.tar.gz xamarin-forms-17fdde66d94155fc62a034fa6658995bef6fd6e5.tar.bz2 xamarin-forms-17fdde66d94155fc62a034fa6658995bef6fd6e5.zip |
Initial import
Diffstat (limited to 'Xamarin.Forms.Android.UITests')
-rw-r--r-- | Xamarin.Forms.Android.UITests/BaseTestFixture.cs | 108 | ||||
-rw-r--r-- | Xamarin.Forms.Android.UITests/Makefile | 15 | ||||
-rw-r--r-- | Xamarin.Forms.Android.UITests/PlatformHelpers.cs | 132 | ||||
-rw-r--r-- | Xamarin.Forms.Android.UITests/PlatformQueries.cs | 111 | ||||
-rw-r--r-- | Xamarin.Forms.Android.UITests/Properties/AssemblyInfo.cs | 36 | ||||
-rw-r--r-- | Xamarin.Forms.Android.UITests/Xamarin.Forms.Android.UITests.csproj | 85 | ||||
-rw-r--r-- | Xamarin.Forms.Android.UITests/packages.config | 5 | ||||
-rw-r--r-- | Xamarin.Forms.Android.UITests/testcloudupload.bat | 1 |
8 files changed, 493 insertions, 0 deletions
diff --git a/Xamarin.Forms.Android.UITests/BaseTestFixture.cs b/Xamarin.Forms.Android.UITests/BaseTestFixture.cs new file mode 100644 index 00000000..6e38f356 --- /dev/null +++ b/Xamarin.Forms.Android.UITests/BaseTestFixture.cs @@ -0,0 +1,108 @@ +using System; +using Xamarin.UITest; +using Xamarin.UITest.Android; +using Xamarin.UITest.Queries; +using NUnit.Framework; +using System.Threading; + +namespace Xamarin.Forms.UITests +{ + public class BaseTestFixture + { + string idiomEnvVar; + string IPEnvVar; + + public AndroidApp App { get; private set; } + public Device Device { get; set; } + + public BaseTestFixture () + { + idiomEnvVar = Environment.GetEnvironmentVariable ("DEVICE_IDIOM"); + IPEnvVar = Environment.GetEnvironmentVariable ("DEVICE_IP"); + + Console.WriteLine (string.Format ("****** Connecting to {0} with IP: {1} ********", idiomEnvVar, IPEnvVar)); + + Device = SetupDevice (idiomEnvVar, IPEnvVar); + } + + [SetUp] + public void Setup () + { + + if (string.IsNullOrEmpty (idiomEnvVar) && + string.IsNullOrEmpty (IPEnvVar)) { + // Use IDE Configuration + App = ConfigureApp + .Android + .Debug () + .ApkFile ("../../../Xamarin.Forms.ControlGallery.Android/bin/Debug/AndroidControlGallery.AndroidControlGallery-Signed.apk") + .StartApp (); + } else { + // Use CI Configuration + App = ConfigureApp + .Android + .DeviceIp (Device.IP) + .ApkFile ("../../../Xamarin.Forms.ControlGallery.Android/bin/Debug/AndroidControlGallery.AndroidControlGallery-Signed.apk") + .StartApp (); + } + + FixtureSetup (); + } + + protected virtual void FixtureSetup () + { + App.SetOrientationPortrait (); + App.Screenshot ("Begin test"); + } + + Device SetupDevice (string idiomEnvVar, string IPEnvVar) + { + Device device; + + if (idiomEnvVar == "PHONE") { + + // default phone + device = new Device (DeviceType.Phone, "10.0.1.161"); + + if (!string.IsNullOrEmpty (IPEnvVar)) + device.IP = IPEnvVar; + + } else if (idiomEnvVar == "TABLET") { + + // default tablet + device = new Device (DeviceType.Tablet, "10.0.1.42"); + + if (!string.IsNullOrEmpty (IPEnvVar)) + device.IP = IPEnvVar; + + } else { + + // default phone + device = new Device (DeviceType.Phone, "10.0.1.161"); + + } + + return device; + } + + } + + public static class PlatformStrings + { + public static string Button = "Button"; + public static string Cell = "xamarin.forms.platform.android.ViewCellRenderer_ViewCellContainer"; + public static string HomePageTitle = "Android Controls"; + public static string Label = "TextView"; + public static string Entry = "EditText"; + public static string Placeholder = "hint"; + public static string Text = "text"; + } + + public static class PlatformValues + { + public static int BoxViewScreenNumber = 4; + public static int KeyboardDismissY = 500; + public static int OffsetForScrollView = -5; + } +} + diff --git a/Xamarin.Forms.Android.UITests/Makefile b/Xamarin.Forms.Android.UITests/Makefile new file mode 100644 index 00000000..87c3be60 --- /dev/null +++ b/Xamarin.Forms.Android.UITests/Makefile @@ -0,0 +1,15 @@ +console: + calabash-android console ../Xamarin.Forms.ControlGallery.Android/bin/Debug/AndroidControlGallery.AndroidControlGallery-Signed.apk + +testcloud: + mono xut-console.exe submit --assembly-dir ../Xamarin.Forms.Android.UITests/bin/debug ../Xamarin.Forms.ControlGallery.Android/bin/Release/AndroidControlGallery.AndroidControlGallery-Signed.apk 1a02b2e1ee5a2895e47da095cc895a49 7a47b813 + +run-phone-android: + DEVICE_IDIOM=PHONE DEVICE_ID=9adaaf78 DEVICE_IP=192.168.1.144 mono ../packages/NUnit.Runners.2.6.3/tools/nunit-console-x86.exe -result=galaxy-results.xml bin/Debug/Xamarin.Forms.Android.UITests.dll + +run-parallel-android: + DEVICE_IDIOM=TABLET mono ../packages/NUnit.Runners.2.6.3/tools/nunit-console-x86.exe -result=nexus-results.xml bin/Debug/Xamarin.Forms.Android.UITests.dll --include "CITest" & + DEVICE_IDIOM=PHONE mono ../packages/NUnit.Runners.2.6.3/tools/nunit-console-x86.exe -result=galaxy-results.xml bin/Debug/Xamarin.Forms.Android.UITests.dll --include "CITest" + +clean: + rm -rf screenshot_* test_servers/ .irb-history nexus-results.xml galaxy-results.xml diff --git a/Xamarin.Forms.Android.UITests/PlatformHelpers.cs b/Xamarin.Forms.Android.UITests/PlatformHelpers.cs new file mode 100644 index 00000000..6021f2a2 --- /dev/null +++ b/Xamarin.Forms.Android.UITests/PlatformHelpers.cs @@ -0,0 +1,132 @@ +using System; +using Xamarin.UITest; +using Xamarin.UITest.Android; +using Xamarin.UITest.Queries; +using NUnit.Framework; +using System.Threading; + +namespace Xamarin.Forms.UITests +{ + + public static class PlatformHelpers + { + + public static string GetTextForQuery (this IApp app, Func<AppQuery, AppQuery> query) + { + AppResult[] elements = app.Query (query); + if (elements.Length > 1) { + // Test cloud doesn't support Assert.Fail + Assert.False (true, "Query returned more than one result"); + } + return elements [0].Text; + } + + public static bool ScrollDownForElement (this IApp app, Func<AppQuery, AppQuery> query, int scrollNumberLimit) + { + // Check if element exists before scrolling + if (app.Query (query).Length > 0) + return true; + + int scrollNumber = 0; + while (app.Query (query).Length == 0) { + app.ScrollDown (); + scrollNumber++; + if (scrollNumber > scrollNumberLimit) + return false; + } + + return true; + } + + public static bool ScrollUpForElement (this IApp app, Func<AppQuery, AppQuery> query, int scrollNumberLimit) + { + int scrollNumber = 0; + while (app.Query (query).Length == 0) { + app.ScrollUp (); + scrollNumber++; + if (scrollNumber > scrollNumberLimit) + return false; + } + + return true; + } + + public static bool DragFromToForElement (this AndroidApp app, int scrollNumberLimit, Func<AppQuery, AppQuery> query, float xStart, float yStart, float xEnd, float yEnd) + { + int numberOfScrolls = 0; + // Element exists + if (app.Query (query).Length > 0) + return true; + + while (app.Query (query).Length == 0) { + DragFromTo (app, xStart, yStart, xEnd, yEnd); + if (numberOfScrolls > scrollNumberLimit) { + return false; + } + numberOfScrolls++; + } + // Element found + return true; + } + + public static void SwipeBackNavigation (this AndroidApp app) + { + // Do nothing on Android + } + + public static void DragFromTo (this AndroidApp app, float xStart, float yStart, float xEnd, float yEnd, Speed speed = Speed.Fast) + { + // No effect on Android + app.DragCoordinates (xStart, yStart, xEnd, yEnd); + } + + public static void KeyboardIsPresent (this AndroidApp app) + { + // TODO : Add keyboard detection +// Thread.Sleep (1000); +// +// AppRect screenSize = app.MainScreenBounds (); +// AppRect contentBounds = app.Query (q => q.Raw ("*").Id ("content"))[0].Rect; +// +// bool keyboardIsShown = false; +// if ((screenSize.Height - contentBounds.Height) > (screenSize.Height / 4)) { +// // Determine if keyboard is showing by seeing if content size is shrunk by over 1/4 of screens size +// keyboardIsShown = true; +// } +// +// Assert.IsTrue (keyboardIsShown, "Keyboard should be shown"); + Assert.Inconclusive ("Keyboard should be shown"); + } + + public static void KeyboardIsDismissed (this AndroidApp app) + { + // TODO : Add keyboard detection +// AppRect screenSize = app.MainScreenBounds (); +// AppRect contentBounds = app.Query (q => q.Raw ("*").Id ("content"))[0].Rect; +// +// bool keyboardIsShown = false; +// if ((screenSize.Height - contentBounds.Height) > (screenSize.Height / 4)) { +// // Determine if keyboard is showing by seeing if content size is shrunk by over 1/4 of screens size +// keyboardIsShown = true; +// } +// +// Assert.IsFalse (keyboardIsShown, "Keyboard should be dismissed"); + Assert.Inconclusive ("Keyboard should be dismissed"); + } + + public static int IndexForElementWithText (this AndroidApp app, Func<AppQuery, AppQuery> query, string text) + { + var elements = app.Query (query); + int index = 0; + for (int i = 0; i < elements.Length; i++) { + string labelText = elements[i].Text; + if (labelText == (text)) { + index = i; + break; + } + index++; + } + return index == elements.Length ? -1 : index; + } + } +} diff --git a/Xamarin.Forms.Android.UITests/PlatformQueries.cs b/Xamarin.Forms.Android.UITests/PlatformQueries.cs new file mode 100644 index 00000000..0b826949 --- /dev/null +++ b/Xamarin.Forms.Android.UITests/PlatformQueries.cs @@ -0,0 +1,111 @@ +using System; +using Xamarin.UITest; +using Xamarin.UITest.Android; +using Xamarin.UITest.Queries; +using NUnit.Framework; +using System.Threading; + +namespace Xamarin.Forms.UITests +{ + public class iOSUiTestType + { + public iOSUiTestType () + { + + } + } + + public static class PlatformQueries + { + public static Func<AppQuery, AppQuery> AbsoluteGalleryBackground = q => q.Raw ("xamarin.forms.platform.android.BoxRenderer parent xamarin.forms.platform.android.RendererFactory_DefaultRenderer index:0"); + public static Func<AppQuery, AppQuery> ActivityIndicators = q => q.Raw ("ProgressBar"); + public static Func<AppQuery, AppQuery> Back = q => q.Id ("up"); + public static Func<AppQuery, AppQuery> BoxRendererQuery = q => q.Raw ("xamarin.forms.platform.android.BoxRenderer"); + public static Func<AppQuery, AppQuery> Cells = q => q.Raw ("xamarin.forms.platform.android.ViewCellRenderer_ViewCellContainer"); + public static Func<AppQuery, AppQuery> DismissPickerCustom = q => q.Marked ("OK"); + public static Func<AppQuery, AppQuery> DismissPickerNormal = q => q.Marked ("Done"); + public static Func<AppQuery, AppQuery> Entrys = q => q.Raw ("EntryEditText"); + public static Func<AppQuery, AppQuery> EntryCells = q => q.Raw ("EntryCellEditText"); + public static Func<AppQuery, AppQuery> Editors = q => q.Raw ("EditorEditText"); + public static Func<AppQuery, AppQuery> Frames = q => q.Raw ("FrameRenderer"); + public static Func<AppQuery, AppQuery> Images = q => q.Raw ("xamarin.forms.platform.android.ImageRenderer"); + public static Func<AppQuery, AppQuery> ImageView = q => q.Raw("ImageView"); + public static Func<AppQuery, AppQuery> LabelRenderers = q => q.Raw ("LabelRenderer"); + public static Func<AppQuery, AppQuery> List = q => q.Raw ("ListView"); + public static Func<AppQuery, AppQuery> Labels = q => q.Raw ("TextView"); + public static Func<AppQuery, AppQuery> Map = q => q.Raw ("MapView"); + public static Func<AppQuery, AppQuery> NumberPicker = q => q.Raw ("NumberPicker"); + public static Func<AppQuery, AppQuery> ProgressBar = q => q.Raw ("ProgressBar"); + public static Func<AppQuery, AppQuery> Tables = q => q.Raw ("ListView"); + public static Func<AppQuery, AppQuery> SearchBars = q => q.Raw ("SearchView"); + public static Func<AppQuery, AppQuery> Sliders = q => q.Raw ("SeekBar"); + public static Func<AppQuery, AppQuery> SpanningThreeRows = q => q.Marked ("Spanning 3 rows"); + public static Func<AppQuery, AppQuery> Steppers = q => q.Raw ("button marked:'+'"); + public static Func<AppQuery, AppQuery> Switch = q => q.Raw("Switch"); + public static Func<AppQuery, AppQuery> ThreeXThreeGridCell = q => q.Marked ("a block 3x3"); + + public static Func<AppQuery, AppQuery> EntryWithPlaceholder (string text) { + return q => q.Raw (string.Format ("EntryEditText hint:'{0}'", text)); + } + public static Func<AppQuery, AppQuery> EntryCellWithPlaceholder (string text) { + return q => q.Raw (string.Format ("EntryCellEditText hint:'{0}'", text)); + } + + public static Func<AppQuery, AppQuery> EntryWithText (string text) { + return q => q.Raw (string.Format ("EntryEditText text:'{0}'", text)); + } + + public static Func<AppQuery, AppQuery> EntryCellWithText (string text) { + return q => q.Raw (string.Format ("EntryCellEditText text:'{0}'", text)); + } + + public static Func<AppQuery, AppQuery> EditorsWithText (string text) { + return q => q.Raw (string.Format ("EditorEditText text:'{0}'", text)); + } + + public static Func<AppQuery, AppQuery> EntryWithIndex (int index) { + return q => q.Raw (string.Format ("EntryEditText index:{0}", index)); + } + + public static Func<AppQuery, AppQuery> SearchBarWithIndex (int index) { + return q => q.Raw (string.Format ("SearchView index:{0}", index)); + } + + public static Func<AppQuery, AppQuery> LabelWithIndex (int index) { + return q => q.Raw (string.Format ("TextView index:{0}", index)); + } + + public static Func<AppQuery, AppQuery> LabelWithText (string text) { + return q => q.Raw (string.Format ("TextView text:'{0}'", text)); + } + + public static Func<AppQuery, AppQuery> LabelWithId (string id) { + return q => q.Raw (string.Format ("TextView id:'{0}'", id)); + } + + public static Func<AppQuery, AppQuery> PickerEntryWithIndex (int index) { + return q => q.Raw (string.Format ("EditText index:{0}", index)); + } + + public static Func<AppQuery, AppQuery> PickerEntryWithPlaceholder (string placeholder) { + return q => q.Raw (string.Format ("EditText hint:'{0}'", placeholder)); + } + + public static Func<AppQuery, AppQuery> PickerEntryWithText (string text) { + return q => q.Raw (string.Format ("EditText text:'{0}'", text)); + } + + public static Func<AppQuery, AppQuery> SwitchWithIndex (int index) { + return q => q.Raw (string.Format ("Switch index:{0}", index)); + } + + public static Func<AppQuery, AppQuery> StepperWithIndex (int index) { + return q => q.Raw (string.Format ("button marked:'+' index:{0}", index)); + } + + public static AppResult DetailPage (this AndroidApp app) + { + return app.Query (q => q.Raw ("*"))[0]; + } + } +} diff --git a/Xamarin.Forms.Android.UITests/Properties/AssemblyInfo.cs b/Xamarin.Forms.Android.UITests/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..99b6aa63 --- /dev/null +++ b/Xamarin.Forms.Android.UITests/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Xamarin.Forms.Android.UITest")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Xamarin.Forms.Android.UITest")] +[assembly: AssemblyCopyright("Copyright © 2014")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("fd80e73b-7225-40ce-b38d-350c5487a0df")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Xamarin.Forms.Android.UITests/Xamarin.Forms.Android.UITests.csproj b/Xamarin.Forms.Android.UITests/Xamarin.Forms.Android.UITests.csproj new file mode 100644 index 00000000..5c1b991b --- /dev/null +++ b/Xamarin.Forms.Android.UITests/Xamarin.Forms.Android.UITests.csproj @@ -0,0 +1,85 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> + <PropertyGroup> + <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> + <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> + <ProjectGuid>{D290FCBE-3196-452B-B84C-B62BF9B54F2A}</ProjectGuid> + <OutputType>Library</OutputType> + <AppDesignerFolder>Properties</AppDesignerFolder> + <RootNamespace>Xamarin.Forms.Android.UITest</RootNamespace> + <AssemblyName>Xamarin.Forms.Android.UITests</AssemblyName> + <TargetFrameworkVersion>v4.5</TargetFrameworkVersion> + <FileAlignment>512</FileAlignment> + <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir> + <RestorePackages>true</RestorePackages> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> + <DebugSymbols>true</DebugSymbols> + <DebugType>full</DebugType> + <Optimize>false</Optimize> + <OutputPath>bin\Debug\</OutputPath> + <DefineConstants>DEBUG;TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> + <DebugType>pdbonly</DebugType> + <Optimize>true</Optimize> + <OutputPath>bin\Release\</OutputPath> + <DefineConstants>TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <ItemGroup> + <Reference Include="nunit.framework"> + <HintPath>..\packages\NUnit.2.6.3\lib\nunit.framework.dll</HintPath> + </Reference> + <Reference Include="System" /> + <Reference Include="System.Core" /> + <Reference Include="System.Xml.Linq" /> + <Reference Include="System.Data.DataSetExtensions" /> + <Reference Include="Microsoft.CSharp" /> + <Reference Include="System.Data" /> + <Reference Include="System.Xml" /> + <Reference Include="Xamarin.UITest"> + <HintPath>..\packages\Xamarin.UITest.0.4.1\lib\Xamarin.UITest.dll</HintPath> + </Reference> + </ItemGroup> + <ItemGroup> + <Compile Include="Properties\AssemblyInfo.cs" /> + <Compile Include="BaseTestFixture.cs" /> + <Compile Include="..\Xamarin.Forms.iOS.UITests\TestHelpers.cs"> + <Link>TestHelpers.cs</Link> + </Compile> + <Compile Include="PlatformQueries.cs" /> + <Compile Include="PlatformHelpers.cs" /> + </ItemGroup> + <ItemGroup> + <None Include="packages.config" /> + <Compile Include="..\Xamarin.Forms.iOS.UITests\Device.cs"> + <Link>Device.cs</Link> + </Compile> + </ItemGroup> + <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> + <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" /> + <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> + <PropertyGroup> + <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText> + </PropertyGroup> + <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" /> + </Target> + <!-- To modify your build process, add your task inside one of the targets below and uncomment it. + Other similar extension points exist, see Microsoft.Common.targets. + <Target Name="BeforeBuild"> + </Target> + <Target Name="AfterBuild"> + </Target> + --> + <ItemGroup> + <ProjectReference Include="..\Xamarin.Forms.Core\Xamarin.Forms.Core.csproj"> + <Project>{57b8b73d-c3b5-4c42-869e-7b2f17d354ac}</Project> + <Name>Xamarin.Forms.Core</Name> + </ProjectReference> + </ItemGroup> +</Project>
\ No newline at end of file diff --git a/Xamarin.Forms.Android.UITests/packages.config b/Xamarin.Forms.Android.UITests/packages.config new file mode 100644 index 00000000..cd848561 --- /dev/null +++ b/Xamarin.Forms.Android.UITests/packages.config @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<packages> + <package id="NUnit" version="2.6.3" targetFramework="net45" /> + <package id="Xamarin.UITest" version="0.4.1" targetFramework="net45" /> +</packages>
\ No newline at end of file diff --git a/Xamarin.Forms.Android.UITests/testcloudupload.bat b/Xamarin.Forms.Android.UITests/testcloudupload.bat new file mode 100644 index 00000000..1afa4cff --- /dev/null +++ b/Xamarin.Forms.Android.UITests/testcloudupload.bat @@ -0,0 +1 @@ +xut-console.exe submit --assembly-dir ..\Xamarin.Forms.Android.UITests\bin\debug ..\Xamarin.Forms.ControlGallery.Android\bin\Release\AndroidControlGallery.AndroidControlGallery-Signed.apk 1a02b2e1ee5a2895e47da095cc895a49 6bbba6ec |