Birim testleri: Linq ile ertelenmiş iddialar


18

Bunun gibi ertelenmiş iddialar eklemek uygun mudur?

var actualKittens = actualKittens.Select(kitten => {
    Assert.IsСute(kitten);
    return kitten
});

Neden? Bu yüzden, örneğin, materyalize toplama bekleyen ifadelerle bile sadece bir kez yineleyebilirim:

CollectionAssert.AreEquivalent(expectedKittens, actualKittens.ToList());

Ve aynı zamanda sadece Select değil, yineleyici tanımlı ve çok fazla kontrol ve mantık içeren bir yöntem olabilir (örneğin, bazı sayma ve filtreleme).

Şüphe kaynağı, testin başarısız olması durumunda bu kodu okuma ve hata ayıklamanın karmaşıklığıdır.


1
Test için buna güvenmem ama bazen daha iyi bir çözüm yoksa bunu üretim kodunda yapmak sorun değil. Kendinizi sequence.WithSideEffect(item => Assert.IsCute(item))daha temiz hale getirmek için kendinize yardımcı bir işlev yapabilirsiniz.
usr

@usr Görünüşe göre böyle bir kilit noktayı yakaladınız - Bir yineleyicinin yan etkisi.
SerG

Listeyi oluşturmak için bir kez ve tekrar karşılaştırmak için iki kez tekrarlamanız gerekmez expectedKittensmi? Yöntem çağrılarının arkasındaki yinelemeleri gizlediniz.
IllusiveBrian

@IllusiveBrian Bu anlamda örnekte evet. Hala ek olandan daha az .All().
SerG

Yanıtlar:


37

Bunun gibi ertelenmiş iddialar eklemek uygun mudur [..]

Hayır , değil. Neden? Çünkü herhangi bir nedenden dolayı ikinci savunmayı kaldırırsanız test yine de yeşile dönecektir ve hala işe yaradığını düşünürsünüz, ancak koleksiyon numaralandırılmayacağından böyle olmaz. İki veya daha fazla bağımsız iddianız varsa, bunlardan birini devre dışı bıraksanız bile işlerini yapmaya devam ederler.

Bu kombinasyonu düşünün:

Assert.IsTrue(actualKittens.All(x => x.IsCute());
CollectionAssert.AreEquivalent(expectedKittens, actualKittens.ToList());

Şimdi, eklerden birini devre dışı bıraksanız veya kaldırsanız bile diğeri işini yine de yapar. Ayrıca koleksiyonu gerçekleştirmeyi unutursanız , çalıştırılması daha uzun sürebilir, ancak yine de çalışacaktır. Bağımsız testler daha sağlam ve güvenilirdir.

Ayrıca ikinci bir hayır var . Diğer çerçevelerin nasıl işlediğinden emin değilim ama MS Test platformunu kullanıyorsanız hangi testin başarısız olduğunu bilemezsiniz. Başarısız olan testi çift tıklatırsanız, başarısız olduğunu gösterir CollectionAssertancak gerçekte Assertyanlış giden iç içe geçmişti ve hata ayıklamak son derece zor olacaktır. İşte bir örnek:

    [TestMethod]
    public void TestMethod()
    {
        var numbers = new[] { 1, 2, 3 }.Select(x =>
        {
            Assert.Fail("Wrong number.");
            return x;
        });

        // This will fail and you won't be sure why.
        CollectionAssert.AreEqual(new[] { 1, 2, 3 }, numbers.ToList()); 

    }

Bu, ilk testin aslında işe yaramaz olduğu anlamına gelir, çünkü bir hata bulmaya yardımcı olmaz. Bir sayının geçersiz olması veya her iki koleksiyonun farklı olması nedeniyle başarısız olup olmadığını bilmiyorsunuz.


Neden? Böylece, somutlaşmış toplama bekleyen ifadelerle bile sadece bir kez yineleyebilirim

Acaba neden umursuyorsun? Bunlar birim testlerdir. Bunların her bir parçasını optimize etmek zorunda değilsiniz ve genellikle testler milyonlarca öğe gerektirmez, bu nedenle performans bir endişe olmamalıdır.

Bu tür testleri sürdürmeniz gerekecek, bu yüzden onları neden gerektiğinden daha karmaşık hale getirmelisiniz? Çalışan basit ekler yazın.


Herhangi bir nedenden ötürü bir kontrolün kontrol akışına gömülmesi gerekiyorsa, yürütüldüğünden emin olmanın bir yolu, iç içe yerleştirme işleminden önce artırılmış / doğru olarak ayarlanmış bir sayaç / bayrağı tutmaktır. Daha sonra bu sayacı kontrol ederek beklenen kontrol akışının alındığını söyleyebiliriz. Mükemmel değil, ama ilk eleştirinizi büyük ölçüde ele alıyor.
amon

1
Ayrıca, siz veya bir başkası ertelenmiş iddiaya 6 ay içinde geri dönecek ve bunu çözmek için zaman kaybetmek zorunda kalacaksınız.
DavidTheWin

Örneğinizde bir sorun var. Arayan ToListdeğil, enumerator yineleme olacaktır?
RubberDuck

1
@ RubberDuck evet, olacak ve aynı zamanda başarısız olacak Assert.Failama değil de ve CollectionAsserthangi iddia aslında yanlış olduğunu söyleyemeyiz. Yani VS odaklanmayacak Assert.Failama diğerine odaklanacak ... şimdi hata ayıklayabilirsiniz.
t3chb0t
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.