2015-11-02 17 views
5

Modern birim testleri çerçeveler böyle bir Eşzamansız birim testinin sonuçlarını bekleyen destekleyen testleri?Avantajı/üniteyi engelleme üzerinde bekliyor

public void SomeTest() 
{ 
    var result = SomeMethodAsync().Result; 
    // ... Verify the result ... 
} 

Async, testleri paralel olarak çalıştırırken yalnızca bir yarar sağlar mı?

+0

Bir otomatik test paketi için ana iş parçacığının paralel olarak daha fazla birim testi yürütmesi serbest olması, bunun bir avantaj gibi görünmesini sağlar. eşzamanlı bir çağrıda engelleniyor –

cevap

6

birincil faydaları, sunucu tarafında bir tepki istemci tarafında UI ve ölçeklenebilirlik vardır. Ünite testleri için, biraz ölçeklenebilirlik elde edersiniz (ünite testleri doğa tarafından patlatıldığı için genel hız faydaları anlamına gelir).

Ancak bu büyük bir fayda değil. Testleriniz (muhtemelen) biraz daha hızlı çalışır.

Genellikle bu nedenlerden dolayı async Task birim test yöntemleri kullanın:

  • sonra klasik kilitlenme soruna neden olabilir engelleme, bir bağlam içinde kod test ediyorsanız. Bazı çerçevelerin (ör. XUnit) her zaman varsayılan olarak bir bağlam sağladığını unutmayın. Diğer çerçeveler için bile, ViewModels birim testine bir bağlam sağlamak genellikle gereklidir.
  • await, AggregateException numaralı belgede istisnalar sarmaz.
  • (Teoride) birim testlerinizin daha hızlı çalışmasına izin veren bir ölçeklenebilirlik avantajı elde edersiniz. Çerçevenizin, testlerinizi paralel olarak çalıştırdığını varsayarsak.
  • Neden değil? Eşzamanlı yöntemler kadar kolaylar. async Task birim test yöntemleri, 2012'den beri her ana ünite test çerçevesi tarafından desteklenmiştir.
+3

Tüm iyi ve +1.Ancak "Neden olmasın" ile ilgili olarak: Artık hata ayıklayıcısını duraklatamazsınız ve zaman içinde o noktada bir IO bağlı testin nerede durduğunu (hatta belki de askıda kaldığını) göremezsiniz. – usr

+0

@usr: Geçerli bir nokta! –

+0

@usr Msft bu özellik üzerinde çalışıyor (ya da planlanmış. Nerede gördüğümü bilmiyorum). Umarım bekleyen bekleyen noktaları –

1

Bu async yaklaşımını kullanmanın herhangi bir avantajı var mı? engelleme?

Gerçekten test yapıyorlarbağlı olduğunu düşünüyorum. Eğer ünite test çerçevelerinden bakış açısından bakarsanız, ben burada herhangi bir fayda görmüyorum. Böyle bir çerçevenin IO'ya göre ölçeklenmesi gerektiğini düşünmüyorum. Yaptığınız tek şey, uyumsuz API'nizin nasıl davrandığını test etmektir. Örneğin, bir kitaplık yazarı olarak, bir uyumsuz bitiş noktası olabilir ve kodunuz kitaplığınızı düzgün bir şekilde nasıl kullanacağınızı anlamayan bir kullanıcı tarafından eşzamanlı olarak engellendiğinde neler olduğunu test edebilirsiniz.

bir örnek olabilir: async kod

[TestClass] 
public class M 
{ 
    [TestMethod] 
    public void X() 
    { 
     var myService = new MyService(); 
     myService.FetchSomeDataAsync().Result; // Will this deadlock? 
    } 
} 
+0

Eğer bu Kilitlenme olabilirse, Async modunda aynı dezavantaj da olabilir, burada ana iş parçacığı serbest ancak Async işlemi kilitli ve beklemede, alternatif bir mekanizma –

+0

@MrinalKamboj tarafından serbest bırakılıncaya kadar Bununla ne demek istediğini anlamadım. –

+0

Cevabınızdaki bu yoruma cevap veriyorum - // Bu çıkmaz mı ?, Evet ise, Async modunda benzer bir sorun ortaya çıkarır, diğer testlerin çalıştırılmasında asıl iş parçacığı serbest bırakılır –