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 파일을 가리킵니다.