Aracılığıyla paylaş


Kurumsal Uygulamaları Birim Testi

Not

Bu e-Kitap 2017 baharında yayımlanmıştır ve o zamandan beri güncelleştirilmemiştir. Kitapta değerli kalan çok şey var, ancak bazı malzemeler güncelliğini yitirmiş.

Mobil uygulamalarda masaüstü ve web tabanlı uygulamaların endişelenmesi gerekmeyen benzersiz sorunlar vardır. Mobil kullanıcılar, kullandıkları cihazlara, ağ bağlantısına, hizmetlerin kullanılabilirliğine ve çeşitli diğer faktörlere göre farklılık gösterir. Bu nedenle, mobil uygulamalar kalitelerini, güvenilirliklerini ve performanslarını geliştirmek için gerçek dünyada kullanılacağından test edilmelidir. Birim testi, tümleştirme testi ve kullanıcı arabirimi testi dahil olmak üzere bir uygulamada yapılması gereken birçok test türü vardır ve birim testi en yaygın test biçimidir.

Birim testi, genellikle bir yöntem olan uygulamanın küçük bir birimini alır, kodun geri kalanından yalıtır ve beklendiği gibi davrandığını doğrular. Amacı, hataların uygulama genelinde yayılmaması için her işlev biriminin beklendiği gibi çalıştığını denetlemektir. Bir hatanın oluştuğu yerde algılanması, hatanın etkisini ikincil bir hata noktasında dolaylı olarak gözlemlemenin daha verimli olmasıdır.

Birim testi, yazılım geliştirme iş akışının ayrılmaz bir parçası olduğunda kod kalitesi üzerinde en büyük etkiye sahiptir. Bir yöntem yazıldığı anda, standart, sınır ve yanlış giriş verileri durumlarına yanıt olarak yönteminin davranışını doğrulayan ve kod tarafından yapılan açık veya örtük varsayımları denetleyebilen birim testleri yazılmalıdır. Alternatif olarak, test temelli geliştirme ile birim testleri koddan önce yazılır. Bu senaryoda, birim testleri hem tasarım belgeleri hem de işlevsel belirtimler işlevi görür.

Not

Birim testleri regresyona karşı çok etkilidir; yani, eskiden çalışan ancak hatalı bir güncelleştirme tarafından rahatsız edilen işlevler.

Birim testleri genellikle düzenleme eylemi-onay desenini kullanır:

  • Birim testi yönteminin düzenleme bölümü nesneleri başlatır ve test altındaki yönteme geçirilen verilerin değerini ayarlar.
  • Act bölümü, gerekli bağımsız değişkenlerle test altındaki yöntemini çağırır.
  • assert bölümü, test altındaki yönteminin eyleminin beklendiği gibi davrandığını doğrular.

Bu düzenin izlenerek birim testlerinin okunabilir ve tutarlı olması sağlanır.

Bağımlılık Ekleme ve Birim Testi

Gevşek bir şekilde bağlanmış bir mimariyi benimsemenin motivasyonlarından biri, birim testini kolaylaştırıyor olmasıdır. Autofac ile kaydedilen türlerden biri sınıfıdır OrderService . Aşağıdaki kod örneğinde bu sınıfın ana hattı gösterilmektedir:

public class OrderDetailViewModel : ViewModelBase  
{  
    private IOrderService _ordersService;  

    public OrderDetailViewModel(IOrderService ordersService)  
    {  
        _ordersService = ordersService;  
    }  
    ...  
}

sınıfı, OrderDetailViewModel kapsayıcının IOrderService bir OrderDetailViewModel nesne örneği oluşturduğunda çözümlediği türe bağımlılığı vardır. Ancak, sınıf birim testi için bir OrderService nesne oluşturmak yerine, testlerin amacı için nesnesini bir sahte ile değiştirinOrderService.OrderDetailViewModel Şekil 10-1'de bu ilişki gösterilmektedir.

Classes that implement the IOrderService interface

Şekil 10-1: IOrderService arabirimini uygulayan sınıflar

Bu yaklaşım nesnenin OrderService çalışma zamanında sınıfına OrderDetailViewModel geçirilmesini sağlar ve test edilebilirlik açısından sınıfın OrderMockService test zamanında sınıfına geçirilmesini OrderDetailViewModel sağlar. Bu yaklaşımın temel avantajı, birim testlerinin web hizmetleri veya veritabanları gibi gereksiz kaynaklara gerek kalmadan yürütülmesine olanak tanımasıdır.

MVVM Uygulamalarını Test Etme

Modelleri test etme ve MVVM uygulamalarından modelleri görüntüleme, diğer sınıfları test etmeyle aynıdır ve birim testi ve sahte oluşturma gibi aynı araç ve teknikler kullanılabilir. Ancak, model sınıflarını modellemek ve görüntülemek için tipik olan ve belirli birim testi tekniklerinden yararlanabilen bazı desenler vardır.

İpucu

Her birim testiyle tek bir şey test edin. Birim testi alıştırması yapmak için birimin davranışının birden fazla yönünü seçmeyin. Bunun yapılması, okunması ve güncelleştirilmesi zor olan testlere yol açar. Ayrıca bir hatayı yorumlarken kafa karışıklığına neden olabilir.

eShopOnContainers mobil uygulaması, iki farklı birim testi türünü destekleyen birim testi gerçekleştirir:

  • Olgular her zaman doğru olan ve sabit koşulları test eden testlerdir.
  • Teoriler, yalnızca belirli bir veri kümesi için geçerli olan testlerdir.

eShopOnContainers mobil uygulamasına dahil edilen birim testleri olgu testleridir ve bu nedenle her birim testi yöntemi özniteliğiyle [Fact] dekore edilmiştir.

Not

xUnit testleri bir test çalıştırıcısı tarafından yürütülür. Test çalıştırıcısını yürütmek için gerekli platform için eShopOnContainers.TestRunner projesini çalıştırın.

Zaman Uyumsuz İşlevselliği Test Etme

MVVM desenini uygularken, görünüm modelleri genellikle hizmetlerdeki işlemleri genellikle zaman uyumsuz olarak çağırır. Bu işlemleri çağıran kod testleri genellikle gerçek hizmetler için değiştirme olarak sahteleri kullanır. Aşağıdaki kod örneği, bir sahte hizmeti görünüm modeline geçirerek zaman uyumsuz işlevselliği test etme işlemini gösterir:

[Fact]  
public async Task OrderPropertyIsNotNullAfterViewModelInitializationTest()  
{  
    var orderService = new OrderMockService();  
    var orderViewModel = new OrderDetailViewModel(orderService);  

    var order = await orderService.GetOrderAsync(1, GlobalSetting.Instance.AuthToken);  
    await orderViewModel.InitializeAsync(order);  

    Assert.NotNull(orderViewModel.Order);  
}

Bu birim testi, yöntem çağrıldıktan sonra örneğin özelliğinin OrderDetailViewModel bir değere InitializeAsync sahip olup olmadığını denetlerOrder. Yöntemi InitializeAsync , görünüm modelinin ilgili görünümüne gidildiğinde çağrılır. Gezinti hakkında daha fazla bilgi için bkz . Gezinti.

OrderDetailViewModel Örnek oluşturulduğunda, bir OrderService örneğin bağımsız değişken olarak belirtilmesi beklenebilir. Ancak, OrderService bir web hizmetinden veri alır. Bu nedenle, sınıfının sahte sürümü OrderService olan bir OrderMockService örnek, oluşturucunun bağımsız değişkeni OrderDetailViewModel olarak belirtilir. Ardından, işlemleri çağıran IOrderService görünüm modelinin InitializeAsync yöntemi çağrıldığında, sahte veriler bir web hizmetiyle iletişim kurmak yerine alınır.

INotifyPropertyChanged Uygulamalarını Test Etme

Arabirimin uygulanması, görünümlerin INotifyPropertyChanged görünüm modellerinden ve modellerinden kaynaklanan değişikliklere tepki vermesine olanak tanır. Bu değişiklikler denetimlerde gösterilen verilerle sınırlı değildir; animasyonların başlatılmasına veya denetimlerin devre dışı bırakılmasına neden olan görünüm modeli durumları gibi görünümü denetlemek için de kullanılır.

Birim testi tarafından doğrudan güncelleştirilebilen özellikler, olaya bir olay işleyicisi PropertyChanged eklenerek ve özellik için yeni bir değer ayarlandıktan sonra olayın tetiklenip tetiklenmediği denetlenerek test edilebilir. Aşağıdaki kod örneğinde bu tür bir test gösterilmektedir:

[Fact]  
public async Task SettingOrderPropertyShouldRaisePropertyChanged()  
{  
    bool invoked = false;  
    var orderService = new OrderMockService();  
    var orderViewModel = new OrderDetailViewModel(orderService);  

    orderViewModel.PropertyChanged += (sender, e) =>  
    {  
        if (e.PropertyName.Equals("Order"))  
            invoked = true;  
    };  
    var order = await orderService.GetOrderAsync(1, GlobalSetting.Instance.AuthToken);  
    await orderViewModel.InitializeAsync(order);  

    Assert.True(invoked);  
}

Bu birim testi, sınıfının yöntemini çağırır InitializeAsync ve bu da özelliğinin OrderViewModel güncelleştirilmeye neden olur Order . Özellik için Order olayın tetiklenmiş olması koşuluyla PropertyChanged birim testi geçer.

İleti Tabanlı İletişimi Test Etme

Gevşek bağlanmış sınıflar arasında iletişim kurmak için sınıfını kullanan MessagingCenter modelleri görüntüleme, aşağıdaki kod örneğinde gösterildiği gibi test altındaki kod tarafından gönderilen iletiye abone olarak birim testi yapılabilir:

[Fact]  
public void AddCatalogItemCommandSendsAddProductMessageTest()  
{  
    bool messageReceived = false;  
    var catalogService = new CatalogMockService();  
    var catalogViewModel = new CatalogViewModel(catalogService);  

    Xamarin.Forms.MessagingCenter.Subscribe<CatalogViewModel, CatalogItem>(  
        this, MessageKeys.AddProduct, (sender, arg) =>  
    {  
        messageReceived = true;  
    });  
    catalogViewModel.AddCatalogItemCommand.Execute(null);  

    Assert.True(messageReceived);  
}

Bu birim testi, CatalogViewModel yürütülmekte olan iletiye yanıt olarak iletiyi yayımlayıp yayımlamadığını AddProductAddCatalogItemCommand denetler. MessagingCenter sınıfı çok noktaya yayın ileti aboneliklerini desteklediğinden, birim testi iletiye AddProduct abone olabilir ve almak için bir geri çağırma temsilcisi yürütebilir. Lambda ifadesi olarak belirtilen bu geri çağırma temsilcisi, deyimi tarafından Assert testin davranışını doğrulamak için kullanılan bir boolean alan ayarlar.

Özel Durum İşlemeyi Test Etme

Birim testleri, aşağıdaki kod örneğinde gösterildiği gibi geçersiz eylemler veya girişler için belirli özel durumların oluşturulduğunu denetleyene de yazılabilir:

[Fact]  
public void InvalidEventNameShouldThrowArgumentExceptionText()  
{  
    var behavior = new MockEventToCommandBehavior  
    {  
        EventName = "OnItemTapped"  
    };  
    var listView = new ListView();  

    Assert.Throws<ArgumentException>(() => listView.Behaviors.Add(behavior));  
}

Denetimin adlı OnItemTappedbir olayı olmadığından ListView bu birim testi bir özel durum oluşturur. Assert.Throws<T> yöntemi, beklenen özel durumun türü olan T genel bir yöntemdir. yöntemine Assert.Throws<T> geçirilen bağımsız değişken, özel durum oluşturacak bir lambda ifadesidir. Bu nedenle, lambda ifadesinin bir ArgumentExceptionoluşturması koşuluyla birim testi geçer.

İpucu

Özel durum ileti dizelerini inceleyen birim testleri yazmaktan kaçının. Özel durum ileti dizeleri zaman içinde değişebilir ve bu nedenle, varlıklarını kullanan birim testleri kırılgan olarak kabul edilir.

Doğrulamayı Test Etme

Doğrulama uygulamasını sınamanın iki yönü vardır: doğrulama kurallarının doğru uygulandığını test etme ve sınıfın beklendiği gibi performans göstermesini ValidatableObject<T> test etme.

Doğrulama mantığı genellikle test etmek kolaydır, çünkü genellikle çıkışın girişe bağlı olduğu kendi içinde bir işlemdir. Aşağıdaki kod örneğinde gösterildiği gibi, en az bir ilişkili doğrulama kuralına sahip her özellikte yöntemini çağırmanın Validate sonuçları üzerinde testler olmalıdır:

[Fact]  
public void CheckValidationPassesWhenBothPropertiesHaveDataTest()  
{  
    var mockViewModel = new MockViewModel();  
    mockViewModel.Forename.Value = "John";  
    mockViewModel.Surname.Value = "Smith";  

    bool isValid = mockViewModel.Validate();  

    Assert.True(isValid);  
}

Bu birim testi, örnekteki iki ValidatableObject<T> özelliğin de verileri olduğunda doğrulamanın MockViewModel başarılı olup olmadığını denetler.

Doğrulamanın başarılı olup olmadığını denetlemenin yanı sıra doğrulama birimi testleri, sınıfın Valuebeklendiği gibi çalıştığını doğrulamak için her ValidatableObject<T> örneğin , IsValidve Errors özelliğinin değerlerini de denetlemelidir. Aşağıdaki kod örneğinde bunu sağlayan bir birim testi gösterilmektedir:

[Fact]  
public void CheckValidationFailsWhenOnlyForenameHasDataTest()  
{  
    var mockViewModel = new MockViewModel();  
    mockViewModel.Forename.Value = "John";  

    bool isValid = mockViewModel.Validate();  

    Assert.False(isValid);  
    Assert.NotNull(mockViewModel.Forename.Value);  
    Assert.Null(mockViewModel.Surname.Value);  
    Assert.True(mockViewModel.Forename.IsValid);  
    Assert.False(mockViewModel.Surname.IsValid);  
    Assert.Empty(mockViewModel.Forename.Errors);  
    Assert.NotEmpty(mockViewModel.Surname.Errors);  
}

Bu birim testi, özelliğinde MockViewModel veri olmadığında ve her ValidatableObject<T> örneğin , IsValidve ErrorsValueözelliği doğru ayarlandığında doğrulamanın başarısız Surname olup olmadığını denetler.

Özet

Birim testi, genellikle bir yöntem olan uygulamanın küçük bir birimini alır, kodun geri kalanından yalıtır ve beklendiği gibi davrandığını doğrular. Amacı, hataların uygulama genelinde yayılmaması için her işlev biriminin beklendiği gibi çalıştığını denetlemektir.

Test altındaki bir nesnenin davranışı, bağımlı nesnelerin davranışını simüle eden sahte nesnelerle değiştirilerek yalıtılabilir. Bu, web hizmetleri veya veritabanları gibi gereksiz kaynaklar gerektirmeden birim testlerinin yürütülmesini sağlar.

Modelleri test etme ve MVVM uygulamalarından modelleri görüntüleme, diğer sınıfların test edilmesiyle aynıdır ve aynı araçlar ve teknikler kullanılabilir.