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:
- Düzenleme: Test, koşulları ayarlar ve test eyleme dönüştürülebilmesi için bir şeyler başlatır.
- Eylem: Test uygulamayla etkileşim kurar, metin girer, düğmelere basar ve benzeri.
- 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:
- Android veya iOS uygulamasında özelliği geliştirin.
- İşlevselliği doğrulamak için testleri yazın ve yerel olarak çalıştırın.
- App Center Testinde yeni bir Test Çalıştırması oluşturun veya mevcut bir Test Çalıştırması kullanın.
- IPA veya APK'yi derleyin ve ardından testlerle birlikte App Center Test'e yükleyin.
- App Center Testi tarafından kullanıma sunulan tüm sorunları veya hataları düzeltin.
- 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:
- 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.
- 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.IApp
aracı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 IApp
baş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 yeniIApp
bir kullanılabilir olduğundan emin olmak için yöntemindeSetUp
başlatılmalıdır. -
yönteminde
TestFixtureSetup
Bazı durumlarda tek bir test kendi test fikstürünü gerektirebilir. Bu durumda, nesnesini yöntemindeIApp
TestFixtureSetup
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 IApp
yardı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 AppQuery
Marked
, 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 UITextField ile 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ş Pending
bir 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 TestFixture
oluş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:
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:
REPL, uygulamasıyla etkileşim kuran adlı app
bir ö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:
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 UIButton
id
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 copy
panoya 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ı AccessibilityLabel
gö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:id
action1_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 UILabel alt 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
, AndroidApp
ve iOSApp
iç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.