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.
Ş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ı AddProduct
AddCatalogItemCommand
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ı OnItemTapped
bir 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 ArgumentException
oluş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 Value
beklendiği gibi çalıştığını doğrulamak için her ValidatableObject<T>
örneğin , IsValid
ve 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 , IsValid
ve Errors
Value
ö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.