다음을 통해 공유


Xamarin.UITest 치트 시트

중요

Visual Studio App Center는 2025년 3월 31일에 사용 중지될 예정입니다. Visual Studio App Center가 완전히 사용 중지될 때까지 계속 사용할 수 있지만 마이그레이션을 고려할 수 있는 몇 가지 권장 대안이 있습니다.

지원 타임라인 및 대안에 대해 자세히 알아보세요.

이 문서는 빠른 참조를 위해 일부 UITest 정보를 압축하는 치트 시트로, 다음 topics 포함합니다.

테스트 작성

이 코드 조각은 단일 플랫폼의 테스트 클래스에 대한 상용구 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와 관련된 솔루션의 경우 다음 코드는 플랫폼 간 UITest를 작성하는 데 도움이 됩니다.

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.UITest 및 App Center를 사용하여 Xamarin.Forms 테스트 자동화 가이드에 설명된 지침을 따라야 합니다.

iOS에서 Xamarin.UITest 초기화

AppDelegate 클래스의 메서드에 FinishedLaunching 다음 코드 조각을 추가합니다.

#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 테스트 클라우드 에이전트는 공용이 아닌 Apple API를 사용하므로 App Store 앱을 거부합니다. Xamarin.iOS 링커는 코드에서 명시적으로 참조하지 않는 경우 최종 IPA에서 Xamarin 테스트 클라우드 에이전트를 제거합니다. 릴리스 빌드에는 컴파일러 변수가 ENABLE_TEST_CLOUD 없으므로 Xamarin 테스트 클라우드 에이전트가 앱 번들에서 제거됩니다. 디버그 빌드에는 컴파일러 지시문이 정의되어 링커가 Xamarin 테스트 클라우드 에이전트를 제거하지 못하도록 합니다.

iOS 시뮬레이터에 대한 디바이스 ID 확인

컴퓨터에서 iOS 시뮬레이터의 UUID를 확인할 수 있습니다. 아래와 같이 명령을 사용합니다 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 시뮬레이터 인스턴스 시작

디바이스 ID를 사용하여 특정 iOS 버전 및 시뮬레이터에서 UITests를 실행할 수 있습니다.

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();
}

코드 조각

이 섹션에서는 UITest를 작성하는 데 도움이 될 수 있는 몇 가지 코드 조각을 제공합니다.

속성 값을 기반으로 요소 쿼리

//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 또는 UI 요소에서 메서드 호출

메서드를 사용하여 기본 뷰 AppQuery.Invoke 에서 네이티브 메서드를 실행할 수 있습니다. 호출된 메서드는 C# 메서드 이름이 아닌 네이티브 메서드 이름과 일치해야 합니다. 예를 들어 AndroidTextView에서 메서드를 setGravity 호출합니다.

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

Invoke C# TextView.Gravity 속성이 아닌 Java TextView.setGravity 메서드를 사용합니다.

Android 권한 처리

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

대신 PreferIdeSettings()를 사용하여 .ApkFile(apkpath) 를 설치하면 앱에 권한 팝업을 제거하는 "모두" 권한이 부여됩니다. 메서드에서 .ApkFile(apkpath)apkpath 컴파일된 apk 파일을 가리킵니다.