Xamarin.UITest

Önemli

Visual Studio App Center 31 Mart 2025'te kullanımdan kaldırılıyor. Tamamen kullanımdan kaldırılana kadar Visual Studio App Center'ı kullanmaya devam edebilirsiniz ancak geçiş yapmayı düşünebileceğiniz birkaç önerilen alternatif vardır.

Destek zaman çizelgeleri ve alternatifleri hakkında daha fazla bilgi edinin.

Xamarin.UITest , iOS ve Android uygulamalarında UI Kabul Testleri için NUnit kullanan bir C# test çerçevesidir. Xamarin.iOS ve Xamarin.Android projeleriyle sıkı bir şekilde tümleştirilir, ancak yerel iOS ve Android projeleriyle de kullanılabilir. Xamarin.UITest, NUnit testlerinin Android ve iOS cihazlarda yürütülmesini sağlayan Otomasyon Kitaplığı'dır . Testler kullanıcı arabirimiyle kullanıcının yapacağı gibi etkileşim kurar: metin girme, düğmelere dokunma ve çekme gibi hareketler.

Genellikle, her Xamarin.UITest olarak adlandırılan bir yöntem olarak [Test]yazılır. Testi içeren sınıf olarak [TestFixture]bilinir. Test fikstür tek bir test veya test grubu içerir. Fikstür, test tamamlandığında yapılması gereken test çalıştırması ve temizleme işlemini yapmak için kurulumdan da sorumludur. Her test , Düzenleme Eylemi-Onay desenini izlemelidir:

  1. Düzenleme: Test, koşulları ayarlar ve test eyleme dönüştürülebilmesi için bir şeyler başlatır.
  2. Eylem: Test uygulamayla etkileşim kurar, metin girer, düğmelere basar ve benzeri.
  3. Assert: Test, doğruluğu belirlemek için Act adımında çalıştırılacak eylemlerin sonuçlarını inceler. Örneğin, uygulama belirli bir hata iletisinin görüntülendiğini doğrulayabilir.

Xamarin.UITest ile çalışmaya başlamak için en iyi zaman bir mobil uygulamanın geliştirilmesi sırasındadır. Otomatikleştirilmiş testler, aşağıdaki listede açıklanan adımlara göre bir özellik geliştirilirken yazılır:

  1. Android veya iOS uygulamasında özelliği geliştirin.
  2. İşlevselliği doğrulamak için testleri yazın ve yerel olarak çalıştırın.
  3. App Center Testinde yeni bir Test Çalıştırması oluşturun veya mevcut bir Test Çalıştırması kullanın.
  4. IPA veya APK'yi derleyin ve ardından testlerle birlikte App Center Test'e yükleyin.
  5. App Center Testi tarafından kullanıma sunulan tüm sorunları veya hataları düzeltin.
  6. Uygulamanın bir sonraki özelliğine geçerek işlemi yineleyin.

Artık etkin geliştirme aşamasında olmayan mevcut uygulamalar için geriye dönük olarak otomatikleştirilmiş testler eklemek uygun maliyetli olmayabilir. Bunun yerine, hataları düzeltirken Xamarin.UITest kullanmak daha iyi bir yaklaşımdır. Örneğin, otomatikleştirilmiş testi olmayan ve bir kullanıcının hata bildirdiği bir uygulamayı düşünün. Bu hatayı düzeltmek için atanan bir geliştirici aşağıdaki eylemlerin bazılarını (veya tümünü) alabilir:

  • Hatayı veya regresyonu el ile doğrulayın.
  • Xamarin.UITest kullanarak hatayı gösteren bir test yazın.
  • Hatanın kapsamı ve ilgili cihazlar üzerindeki etkisi hakkında biraz içgörü elde etmek için testi App Center testine gönderin.
  • Hatayı düzeltme.
  • Geçen Xamarin.UITest ile hatanın düzeltildiğini kanıtlayın.
  • Düzeltmeleri gönderin ve ilgili cihazlarda hatanın düzeltildiğini doğrulamak için App Center Test'e test edin.
  • Testlerin sürüm denetimine geçirilmesini denetleyin.

Otomatik kullanıcı arabirimi testi, büyük ölçüde ekrandaki görünümleri bulup bunlarla etkileşime geçmeyi sağlar. Xamarin.UITest, birbiriyle çalışan iki önemli API kümesiyle bu gereksinimi giderir:

  1. Görünümlerde yapılabilecek eylemler - Xamarin.UITest, bir testin görünüme dokunma, metin girme veya görünümde çekme gibi yaygın kullanıcı eylemlerinin benzetimini gerçekleştirmesine olanak sağlayan API'ler sağlar.
  2. Ekrandaki görünümleri bulmak için sorgular - Xamarin.UITest çerçevesinin bir bölümü, ekrandaki görünümleri bulacak API'lerdir. Sorgular, görünüm özniteliklerini inceleyerek ve eylemlerin çalışabileceği bir nesne döndürerek görünümleri çalışma zamanında bulur. Böyle bir şekilde sorgulamak, ekran boyutu, yönlendirmesi veya düzeni ne olursa olsun kullanıcı arabirimleri için testlerin yazılmasını sağlayan güçlü bir tekniktir

Test yazmaya yardımcı olmak için Xamarin.UITest bir read-eval-print-loop (REPL) sağlar. REPL, geliştiricilerin ve test edicilerin uygulama çalışırken bir ekranla etkileşim kurmasına olanak tanır ve sorguları oluşturmayı basitleştirir.

Xamarin.UITest API'sine giriş

Mobil uygulamayla tüm test etkileşimleri bir örneği Xamarin.UITest.IApparacılığıyla gerçekleşir. Bu arabirim, test için uygulamayla işbirliği yapmak ve kullanıcı arabirimiyle etkileşime geçmek için kritik olan yöntemleri tanımlar. Bu arabirimin iki somut uygulaması vardır:

  • Xamarin.UITest.iOS.iOSApp Bu sınıf, iOS'a karşı testleri otomatikleştirir.
  • Xamarin.UITest.Android.AndroidApp Bu sınıf, Android'de testleri otomatikleştirmeye yöneliktir.

iOSApp ve AndroidApp nesneleri doğrudan örneklenmez. Bunun yerine, yardımcı ConfigureApp sınıfı kullanılarak oluşturulurlar. Bu sınıf, veya AndroidApp öğesinin düzgün bir şekilde örneklendiğinden iOSApp emin olan bir oluşturucudur.

Her test için yeni IApp bir örnek kullanmanızı öneririz. Yeni bir örnek, durumun bir testin diğerine taşmasını engeller. NUnit testinin bir örneğini IAppbaşlatabileceği iki yer vardır:

  • Yönteminde SetUp Genellikle, bir test fikstür her biri birbirinden bağımsız çalışan ilgili testlerin mantıksal bir gruplandırmadır. Bu senaryoda, IApp her test için yeni IApp bir kullanılabilir olduğundan emin olmak için yönteminde SetUp başlatılmalıdır.
  • yönteminde TestFixtureSetup Bazı durumlarda tek bir test kendi test fikstürünü gerektirebilir. Bu durumda, nesnesini yönteminde IAppTestFixtureSetup bir kez başlatmak daha mantıklı olabilir.

Yapılandırıldıktan sonra IApp , test edilen uygulamayla etkileşime geçilmeye başlanabilir. Bunu yapmak için, ekranda görünen görünümlere başvurular almak gerekir. Xamarin.UITest'teki birçok yöntem, görünümleri bulmak için bir Func<AppQuery, AppQuery> parametre alır. Örneğin, aşağıdaki kod parçacığında bir düğmeye nasıl dokunulan gösterilmektedir:

app.Tap(c=>c.Button("ValidateButton"));

Xamarin.UITest çerçevesi içinde arabirimin IApp biri iOS, diğeri Android için iki uygulaması vardır.

iOS Uygulamaları için IApp'i başlatma

Xamarin.UITest iOS üzerinde bir test çalıştırdığında, iOS simülatörünün bir örneğini başlatır, uygulamayı dağıtır, başlatır ve testleri çalıştırmaya başlar. iOS uygulamasının önceden derlenmiş olması gerekir. Xamarin.UITest uygulamayı derlemez ve uygulama paketini sizin için oluşturmaz.

AppBundle yöntemi, uygulama paketinin dosya sisteminde nerede bulunabileceğini belirtmek için kullanılabilir. Bunu yapmanın iki yolu vardır: mutlak bir yol veya göreli yol. Bu kod parçacığı, uygulama paketinin mutlak yolunun kullanılmasını gösterir:

IApp app = ConfigureApp
    .iOS
    .AppBundle("/path/to/iosapp.app")
    .StartApp();

Kısmi yollar Xamarin.UITest derlemesine göre olmalıdır. Bu kod parçacığı bir örnektir:

IApp app = ConfigureApp
    .iOS
    .AppBundle("../../../iOSAppProject/bin/iPhoneSimulator/Debug/iosapp.app")
    .StartApp();

Göreli yol örneği, Xamarin.UITest derlemesinden üç dizin yukarı gitmenizi ve ardından uygulama paketini bulmak için iOS uygulama projesinin proje ağacına inmenizi söyler AppBundle .

ConfigureApp yapılandırmasına IAppyardımcı olacak başka yöntemlere sahiptir. Daha fazla ayrıntı için bkz. iOSAppConfigurator sınıfı. Daha ilginç yöntemlerden bazıları aşağıdaki tabloda açıklanmıştır:

Yöntem Açıklama
AppBundle Bu yöntem, test sırasında kullanılacak uygulama paketinin yolunu belirtir.
Debug Bu yöntem, test çalıştırıcısında hata ayıklama günlüğü iletilerini etkinleştirir. Bu yöntem, uygulamayı simülatörde çalıştırmayla ilgili sorunları gidermek için yararlıdır.
DeviceIdentifier Cihazı, cihaz tanımlayıcısıyla kullanılacak şekilde yapılandırılır. Bu yöntem aşağıda daha ayrıntılı olarak açıklanacaktır.
EnableLocalScreenshots Testleri yerel olarak çalıştırırken ekran görüntülerini etkinleştirin. Testler bulutta çalışırken ekran görüntüleri her zaman etkinleştirilir.

Belirli bir iOS Simülatöründe iOS testleri çalıştırma hakkında daha fazla bilgi için bkz. iOS Simülatörü için Cihaz Kimliğini Belirleme.

Android Uygulamaları için IApp'i başlatma

Xamarin.UITest, mevcut APK'yi bağlı bir cihaza veya zaten çalışmakta olan Android öykünücüsünün bir örneğine dağıtır. Uygulama başlatılır ve test çalıştırılır. Xamarin.UITest, APK'yi oluşturamaz ve Android öykünücüsünün bir örneğini başlatamaz.

ApkFile yöntemi, APK'nın IApp dosya sisteminde nerede bulunabileceğini belirtmek için kullanılır. Bunu yapmanın iki yolu vardır: mutlak bir yol veya göreli yol. Bu kod parçacığı APK için mutlak bir yol kullanmayı gösterir:

IApp app = ConfigureApp
    .Android
    .ApkFile("/path/to/android.apk")
    .StartApp();

Kısmi yollar Xamarin.UITest derlemesine göre olmalıdır. Bu kod parçacığı bir örnektir:

IApp app = ConfigureApp
    .Android
    .ApkFile("../../../AndroidProject/bin/Debug/android.apk")
    .StartApp();

Göreli yol örneği, Xamarin.UITest derlemesinden üç dizin yukarı gitmenizi ve ardından apk dosyasını bulmak için Android uygulama projesinin proje ağacında aşağı gitmenizi söyler ApkFile .

Bağlı birden fazla cihaz veya öykünücü varsa, Xamarin.UITest test için hedeflenen hedefi çözümleyemediğinden test yürütmeyi durdurur ve bir hata iletisi görüntüler. Bu durumda, testi çalıştırmak için cihazın veya öykünücünün seri kimliğinin sağlanması gerekir. Örneğin, bilgisayara bağlı tüm cihazları (veya öykünücüleri) (seri kimlikleriyle birlikte) listeleyen komutundan adb devices aşağıdaki çıkışı göz önünde bulundurun:

$ adb devices
List of devices attached
192.168.56.101:5555 device
03f80ddae07844d3    device

Cihaz şu yöntem kullanılarak DeviceSerial belirtilebilir:

IApp app = ConfigureApp.Android.ApkFile("/path/to/android.apk")
                               .DeviceSerial("03f80ddae07844d3")
                               .StartApp();

Kullanıcı Arabirimi ile Etkileşim Kurma

Görünümlerle etkileşime geçmek için birçok IApp yöntem görünümü bulmak için bir Func<AppQuery, AppQuery> temsilci alır. Bu temsilci, AppQuery Xamarin.UITest'in görünümleri bulma şeklinin temelini oluşturur.

AppQuery , görünümleri bulmak için sorguları oluşturmaya yönelik akıcı bir arabirimdir . Sağlayan yöntemlerden AppQueryMarked , yöntem en basit ve en esnek yöntemlerden biridir. Bu yöntem, görünümleri bulmaya çalışmak için buluşsal bir yöntem kullanır ve aşağıdaki bölümde daha ayrıntılı olarak ele alınacaktır. Şimdilik, bir uygulamayla etkileşime geçmek için birçok yöntemin olduğunu IApp anlamak önemlidir. Bu yöntemler, etkileşim kurulacak görünüme başvuru almak için kullanır Func<AppQuery, AppQuery> . tarafından AppQuery sağlanan daha ilginç yöntemlerden bazıları aşağıda listelenmiştir:

Yöntem Açıklama
Button Ekranda bir veya daha fazla düğme bulur.
Class Belirtilen sınıftaki görünümleri bulmaya çalışır.
Id Belirtilen kimlikle bir görünüm bulmaya çalışır.
Index . Eşleşen görünümler koleksiyonundan bir görünüm döndürür. Genellikle diğer yöntemlerle birlikte kullanılır. Sıfır tabanlı bir dizin alır.
Marked Aşağıda açıklanan buluşsal yöntemlere göre bir görünüm döndürür.
Text Sağlanan metni içeren görünümler ile eşleşecektir.
TextField Bir Android EditText veya iOS UITextFieldile eşleşecek.

Örneğin, aşağıdaki yöntem "SaveUserdataButton" adlı düğmeye dokunma benzetimini gösterir:

app.Tap(c=>c.Marked("SaveUserDataButton"));

AppQuery Akıcı bir arabirim olduğundan, birden çok yöntem çağrısını birbirine zincirleme yapmak mümkündür. Bir görünüme dokunmanın daha karmaşık bir örneğini düşünün:

app.Tap(c=>c.Marked("Pending")
            .Parent()
            .Class("AppointmentListCell").Index(0));

Burada, ilk olarak AppQuery işaretlenmiş Pendingbir görünüm bulur, ardından bu görünümün türdeki AppointmentListCell ilk üst öğesini seçer.

Bir mobil uygulamaya bakarak bu sorguları oluşturmaya çalışmak zor olabilir. Xamarin.UITest, bir ekranın görünüm hiyerarşisini keşfetmek, sorgu oluşturma denemeleri yapmak ve bunları bir uygulamayla etkileşime geçmek için kullanmak için kullanılabilecek bir REPL sağlar.

REPL kullanma

REPL'yi başlatmanın tek yolu, mevcut bir test içinde IApp.Repl yöntemini çağırmaktır. Bunun için bir NUnit TestFixtureoluşturulması ve bir yönteminde Test kullanılabilecek bir örneğinin yapılandırılması IApp gerekir. Aşağıdaki kod parçacığında bunun nasıl yapıldığını gösteren bir örnek gösterilmektedir:

[TestFixture]
public class ValidateCreditCard
{
    IApp app;

    [SetUp]
    public void Setup()
    {
        app = ConfigureApp.Android.ApkFile("/path/to/application.apk").StartApp();
    }
    [Test]
    public void CreditCardNumber_TooLong_DisplayErrorMessage()
    {
        app.Repl();
    }
}

Visual Studio'nun oluğuna sağ tıklayıp Çalıştır'ı seçerek testi çalıştırmak için:

Bir test için çalıştırma seçeneklerini içeren açılan menünün ekran görüntüsü

Test çalıştırılır ve yöntem çağrıldığında Repl Xamarin.UITest, aşağıdaki ekran görüntüsünde gösterildiği gibi REPL'yi terminal oturumunda başlatır:

Xamarin.UITest REPL çalıştıran macOS terminalinin ekran görüntüsü

REPL, uygulamasıyla etkileşim kuran adlı appbir örneğini IApp başlatmıştır. Yapılması gereken ilk şeylerden biri kullanıcı arabirimini keşfetmektir. REPL'nin bunu yapmak için bir tree komutu vardır. Görüntülenen ekranda görünüm hiyerarşisini yazdırır. Örneğin, bir uygulamanın aşağıdaki ekran görüntüsünü göz önünde bulundurun:

iPhone'da çalışan örnek bir uygulamanın ekran görüntüsü

Bu ekranın aşağıdaki hiyerarşisini görüntülemek için komutunu kullanabiliriz tree :

App has been initialized to the 'app' variable.
Exit REPL with ctrl-c or see help for more commands.

>>> tree
[UIWindow > UILayoutContainerView]
  [UINavigationTransitionView > ... > UIView]
    [UITextView] id: "CreditCardTextField"
      [_UITextContainerView]
    [UIButton] id: "ValidateButton"
      [UIButtonLabel] text: "Validate Credit Card"
    [UILabel] id: "ErrorrMessagesTestField"
  [UINavigationBar] id: "Credit Card Validation"
    [_UINavigationBarBackground]
      [_UIBackdropView > _UIBackdropEffectView]
      [UIImageView]
    [UINavigationItemView]
      [UILabel] text: "Credit Card Validation"
>>>

Bu görünümde ValidateButton ile bir UIButtonid olduğunu görebiliriz. Görünümleri bulmak ve görünümlerle etkileşime geçmek için gerekli sorguları oluşturmaya yardımcı olması için komutu tarafından tree görüntülenen bilgileri kullanabiliriz. Örneğin, aşağıdaki kod düğmeye dokunmanın benzetimini yapar:

app.Tap(c=>c.Marked("ValidateButton"))

Komutlar girilirken, bir arabellekteki REPL tarafından hatırlanır. REPL, bu arabelleğin içeriğini panoya kopyalayacak bir copy komut sağlar. Bu, bir test prototipi oluşturmamızı sağlar. REPL'de yapılan işi ile copypanoya kopyalayabilir ve ardından bu komutları içine [Test]yapıştırabiliriz.

Görünümleri bulmak için İşaretlendi'yi kullanma

AppQuery.Marked yöntemi, ekrandaki görünümleri sorgulamanın kullanışlı ve güçlü bir yoludur. Ekrandaki bir görünümün görünüm hiyerarşisini inceleyerek ve görünümdeki özellikleri sağlanan dizeyle eşleştirmeye çalışarak çalışır. Marked işletim sistemine bağlı olarak farklı çalışır.

İşaretli iOS Görünümlerini Bulma

iOS görünümleri aşağıdaki özniteliklerden biri kullanılarak bulunur:

  • AccessibilityIdentifier görünümün görünümü
  • AccessibilityLabel görünümün görünümü

Örneğin, bir UILabel oluşturan ve ayarlayan aşağıdaki C# kod parçacığını AccessibilityLabelgöz önünde bulundurun:

UILabel errorMessagesTextField = new UILabel(new RectangleF(10, 210, 300, 40));
errorMessagesTextField.AccessibilityLabel = "ErrorMessagesTextField";
errorMessagesTextField.Text = String.Empty;

Bu görünüm aşağıdaki sorgu tarafından bulunabilir:

AppResult[] results = app.Marked("ErrorMessagesTextField");

İşaretli Android Görünümlerini Bulma

Android görünümleri aşağıdaki özelliklerden birine göre konumlandırılır:

  • Id görünümün görünümü
  • ContentDescription görünümün görünümü
  • Text görünümün görünümü

Örneğin, aşağıdaki düğmenin tanımlandığı bir Android düzeni düşünün:

<Button
    android:text="Action 1"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:id="@+id/action1_button"
    android:layout_weight="1"
    android:layout_marginLeft="5dp" />

Bu düğmenin android:idaction1_button ve Eylem 1 olduğunu android:text görebiliriz. Aşağıdaki iki sorgudan biri ekrandaki düğmeyi bulur:

  • app.Query(c=>c.Marked("action1_button"));
  • app.Query(c=>c.Marked("Action 1"));

Xamarin.UITest.IApp ile Uygulamayı Denetleme

Yapılandırılıp başlatıldıktan sonra IApp , test uygulamayla etkileşime başlamaya başlayabilir. kullanan Func<AppQuery, AppQuery> bir yönteme örnek olarak yöntemi örnek olarak verilmiştir IApp.Query() . Bu yöntem sorguyu yürütür ve sonuçları döndürür. En basit örnek, ekranda görünen tüm görünümlerin listesini döndüren aşağıdaki kod parçacığında gösterilmiştir:

AppResult[] results = app.Query(c=>c.All())

Aşağıdaki tabloda, ekrandaki görünümleri bulmak için kullanmanın AppQuery diğer bazı örnekleri gösterilmektedir:

Syntax Sonuçlar
app.Query(c=>c.Class("UILabel")) yöntemi, .Class() bir iOS'un UILabelalt sınıfı olan görünümleri sorgular.
app.Query(c=>c.Id("txtUserName")) yöntemi txtUserName.Id() içeren Id görünümleri sorgular.
app.Query(c=>c.Class("UILabel").Text("Hello, World")) "Hello, World" metnini içeren tüm UILabel sınıfları bulur.
results = app.Query(c=>c.Marked("ValidateButton")) Belirtilen metinle işaretlenmiş tüm görünümleri döndürür. Marked yöntemi, sorguları basitleştirebilen kullanışlı bir yöntemdir. Aşağıdaki bölümde ele alınacaktır.

Sonraki tabloda, tarafından IApp sağlanan ve ekrandaki görünümlerle etkileşime geçmek veya görünümleri değiştirmek için kullanılabilecek yöntemlerin bazıları (tümü değil) listelenir:

Örnek Description
PressEnter Uygulamada Enter tuşuna basın.
Tap Eşleşen öğede dokunma / dokunma hareketinin simülasyonunu oluşturur.
EnterText Görünüme metin girer. Bir iOS uygulamasında, Xamarin.UITest yumuşak klavyeyi kullanarak metni girer. Buna karşılık, Xamarin.UITest Android klavyeyi kullanmaz, metni doğrudan görünüme girer.
WaitForElement Görünümler ekranda görünene kadar testin yürütülmesini duraklatır.
Screenshot(String) Uygulamanın geçerli durumundaki ekran görüntüsünü alır ve diske kaydeder. Alınan ekran görüntüsü hakkında bilgi içeren bir FileInfo nesne döndürür.
Flash Bu yöntem, seçili görünümün ekranda "yanıp söner" veya "titremesine" neden olur.

Arabirimi hakkında IApp daha fazla bilgi için IApp, AndroidAppve iOSAppiçin API belgelerine bakın.

Bu yöntemlerin nasıl kullanılacağını gösteren bir örnek olarak, yukarıda görüntülenen ekran görüntüsü için aşağıdaki testi göz önünde bulundurun. Bu test, bir metin alanına kredi kartı için 17 basamaklı bir sayı girer ve ardından ekrandaki bir düğmeye dokunur. Ardından ekranı inceleyerek kullanıcıya numaranın geçerli bir kredi kartı numarası olamayacak kadar uzun olduğunu bildiren bir hata iletisi görüntüler:

[Test]
public void CreditCardNumber_TooLong_DisplayErrorMessage()
{
    /* Arrange - set up our queries for the views */
    // Nothing to do here, app has been instantiated in the [SetUp] method.

    /* Act */
    app.EnterText(c => c.Marked("CreditCardTextField"), new string('9', 17));
    // Screenshot can be used to break this test up into "steps".
    // The screenshot can be inspected after the test run to verify
    // the visual correctness of the screen.
    app.Screenshot("Entering a 17 digit credit card number.");

    app.Tap(c => c.Marked("ValidateButton"));
    app.Screenshot("The validation results.");

    /* Assert */
    AppResult[] result = app.Query(c => c.Class("UILabel").Text("Credit card number is too long."));
    Assert.IsTrue(result.Any(), "The error message isn't being displayed.");
}

Bu test, test yürütme sırasında önemli noktalarda resim çekmek için yöntemini de kullanır Screenshot . Bu test çalıştırıldığında App Center ekran görüntülerini alır ve test sonuçlarında görüntüler. yöntemi, bir testi adımlara ayırmaya ve ekran görüntüleri için açıklamalar sağlamaya olanak tanır.