Поделиться через


Памятка по Xamarin.UITest

Важно!

Прекращение поддержки Центра приложений Visual Studio запланировано на 31 марта 2025 г. Хотя вы можете продолжать использовать Центр приложений Visual Studio, пока он не будет полностью выведен из эксплуатации, существует несколько рекомендуемых вариантов, на которые вы можете рассмотреть возможность миграции.

Узнайте больше о сроках поддержки и альтернативных вариантах.

Этот документ представляет собой памятку, которая содержит некоторые сведения о UITest для краткой справки. Он содержит следующие разделы:

Написание тестов

Этот фрагмент кода является шаблоном TestFixture для тестового класса на одной платформе:

using System;
using NUnit.Framework;
using Xamarin.UITest;
using Xamarin.UITest.Android;
using Xamarin.UITest.Queries;

namespace MyApp.MyUITests
{
    [TestFixture]
    public class Tests
    {
        IApp app;

        [SetUp]
        public void BeforeEachTest()
        {
            // Uncomment the line that's appropriate for the platform:
            // app = ConfigureApp.Android.StartApp();
            // app = ConfigureApp.iOS.StartApp();
        }

        // Test cases here
    }
}

Для решений с Android и iOS приведенный ниже код поможет при написании кроссплатформенных тестов UITests.

using System;
using NUnit.Framework;
using Xamarin.UITest;
using Xamarin.UITest.Queries;

namespace MyApp.MyCrossPlatformUITests
{

    public class AppInitializer
    {
        public static IApp StartApp(Platform platform)
        {
            if(platform == Platform.Android)
            {
                return ConfigureApp.Android.StartApp();
            }
            return ConfigureApp.iOS.StartApp();
        }
    }

    [TestFixture(Platform.Android)]
    [TestFixture(Platform.iOS)]
    public class Tests
    {
        IApp app;
        Platform platform;

        public Tests(Platform platform)
        {
            this.platform = platform;
        }

        [SetUp]
        public void BeforeEachTest()
        {
            app = AppInitializer.StartApp(platform);
        }
    }
}

Решения Xamarin.Forms должны следовать инструкциям, описанным в руководстве Автоматизация тестирования Xamarin.Forms с помощью Xamarin.UITest и Центра приложений.

Инициализация Xamarin.UITest в iOS

Добавьте следующий фрагмент кода в FinishedLaunching метод класса AppDelegate :

#region Code for starting up the Xamarin Test Cloud Agent

// Newer version of Visual Studio for Mac and Visual Studio provide the
// ENABLE_TEST_CLOUD compiler directive to prevent the Calabash DLL from
// being included in the released version of the application.
#if ENABLE_TEST_CLOUD
Xamarin.Calabash.Start();
#endif
#endregion

Xamarin Test Cloud Agent использует общедоступные API Apple, что приводит к отклонению приложений App Store. Компоновщик Xamarin.iOS удалит Xamarin Test Cloud Agent из окончательного IPA, если на него нет явной ссылки в коде. Сборки выпуска не имеют переменной ENABLE_TEST_CLOUD компилятора, которая приводит к удалению Xamarin Test Cloud Agent из пакета приложений. В отладочных сборках определена директива компилятора, препятствующая компоновщику удалить Xamarin Test Cloud Agent.

Определение идентификатора устройства для симулятора iOS

Вы можете определить UUID для симуляторов iOS на компьютере, используя instruments команду , как показано ниже:

$ xcrun xctrace list devices
Known Devices:
bushmaster [5A4B28A1-392A-59FB-81C5-137E881D61E9]
Resizable iPad (8.1 Simulator) [B3BF8A06-2938-4B74-BF87-16C223F8690C]
Resizable iPhone (8.1 Simulator) [E712409B-CFCC-409A-8162-627B6254EB3C]
iPad 2 (7.1 Simulator) [E8572F8F-227B-4DB0-8C92-590DC770360D]
iPad 2 (8.1 Simulator) [1F425263-3F96-4DAB-B843-0D041C3C71EA]
iPad Air (7.1 Simulator) [2863AFF6-D9FC-45E8-8385-E2A548F19002]
iPad Air (8.1 Simulator) [BBCF5CF2-20A4-4C47-9FA5-EBFF7311B071]
iPad Retina (7.1 Simulator) [B7CBB024-E1D3-4B24-8C20-3E9F7B54CF61]
iPad Retina (8.1 Simulator) [3E21ECD3-397A-4251-AEB6-2ADCF29AEE89]
iPhone 4s (7.1 Simulator) [D36354DD-D6A3-4E08-A25B-276620D844B8]
iPhone 4s (8.1 Simulator) [5C8FE602-8BA7-494D-A113-66C8B9AB3CB7]
iPhone 5 (7.1 Simulator) [C696E83D-F9FE-4DBC-8C67-FA0FC533246E]
iPhone 5 (8.1 Simulator) [9A8A5D92-A7D9-4A3C-81AA-97A9924F7D09]
iPhone 5s (7.1 Simulator) [6CDF5B5C-A315-4A8C-9D38-29437FE59C6D]
iPhone 5s (8.1 Simulator) [3F1C286F-3D5D-47B2-92B8-66B673BD0236]
iPhone 6 (8.1 Simulator) [995FF713-9DE4-460B-800E-F5A20FD93AA7]
iPhone 6 Plus (8.1 Simulator) [AB1C20F6-BFFC-4C80-879C-F19A7E3F0B5C]

Запуск экземпляра симулятора iOS

UiTests можно запускать в определенной версии и симуляторе iOS с помощью идентификатора устройства.

const string simId = "3F1C286F-3D5D-47B2-92B8-66B673BD0236"; //iPhone 5s (8.1 Simulator)
app = ConfigureApp.iOS.DeviceIdentifier(simId).StartApp();

Сброс значения по умолчанию для симулятора iOS

Этот фрагмент кода можно использовать для остановки данного симулятора iOS и сброса его до заводских значений по умолчанию:

static void ResetSimulator(string deviceId)
{
    var shutdownCmdLine = string.Format("simctl shutdown {0}", deviceId);
    var shutdownProcess = Process.Start("xcrun", shutdownCmdLine);
    shutdownProcess.WaitForExit();

    var eraseCmdLine = string.Format("simctl erase {0}", deviceId);
    var eraseProcess = Process.Start("xcrun", eraseCmdLine);
    eraseProcess.WaitForExit();
}

Фрагменты кода

В этом разделе содержатся фрагменты кода, которые могут быть полезны для написания тестов UITests.

Запрос элементов на основе значения свойства

//Finds all elements that have a "hint" property with a value of "Search"
app.Query(e => e.All().Property("hint", "Search"));

Локальное включение снимков экрана

app = ConfigureApp.Android
    .EnableLocalScreenshots()
    .StartApp();

Приведенный выше пример кода помещает снимки экрана в каталог, где находится тестовая сборка, именуя образ screenshot-X-png.

Вызов метода в элементе AppResult или пользовательского интерфейса

С помощью метода можно выполнять собственные методы в базовых представлениях AppQuery.Invoke . Вызываемый метод должен соответствовать имени собственного метода, а не имени метода C#. Например, чтобы вызвать метод в setGravity Android TextView, выполните следующие действия:

app.Query(e => e.Id("userName").Invoke("setGravity", 1)); //center text

Использует Invoke метод Java TextView.setGravity , а не свойство C# TextView.Gravity .

Обработка разрешений Android

ConfigureApp.Android.Debug().ApkFile(apkpath).StartApp()

Если вы устанавливаете с помощью .ApkFile(apkpath) , а не PreferIdeSettings(), приложению предоставляются разрешения "все", которые удаляют всплывающие окна разрешений. В методе .ApkFile(apkpath)apkpath должен указывать на скомпилированный APK-файл.