2010-08-17 20 views
5

Kendi kendine şant birimi test desenini yıllar içinde birkaç kez kullandım. Son zamanlarda birisine açıkladığım gibi SRP'yi ihlal ettiğini ileri sürdüler. Tartışma, test sınıfının iki nedenden biriyle değiştirilebilmesidir: test değiştiğinde veya testin uyguladığı arayüzde yöntem imzası değiştiğinde. Bir süre düşündükten sonra, bu doğru bir değerlendirme gibi görünüyor, ama başka insanların fikirlerini almak istedim. Düşünceler?Kendinden şantlı test düzeni Tek Sorumluluk İlkesini ihlal ediyor mu?

Referans: arayüz uygulanan veya shunted Eğer http://www.objectmentor.com/resources/articles/SelfShunPtrn.pdf

cevap

5

bu almak benim test sınıf teknik SRP ihlal ettiğini, ancak SRP ruhunu ihlal etmez. Kendiliğinden değişme alternatifi, test sınıfından ayrı bir alay sınıfına sahip olmaktır. Eğer hepsi müstakil var ve SRP tatmin düşünebilir ayrı sahte sınıf, sahte sınıfının özelliklerine ancak semantik bağlantı ile

hala orada. Yani, gerçekten anlamlı bir ayrılık elde etmedik.

PDF dışına örneğini alarak:

public class ScannerTest extends TestCase implements Display 
{ 
    public ScannerTest (String name) { 
    super (name); 
    } 
    public void testScan() { 
    // pass self as a display 
    Scanner scanner = new Scanner (this); 
    // scan calls displayItem on its display 
    scanner.scan(); 
    assertEquals (new Item (“Cornflakes”), lastItem); 
    } 
    // impl. of Display.displayItem() 
    void displayItem (Item item) { 
    lastItem = item; 
    } 
    private Item lastItem; 
} 

Şimdi yapmak bir Mock: pratik açıdan (IMHO) DisplayMock için TestClass yüksek kavrama olarak

public class DisplayMock implements Display 
{ 
    // impl. of Display.displayItem() 
    void displayItem (Item item) { 
    lastItem = item; 
    } 

    public Item getItem() { 
    return lastItem; 
    } 
    private Item lastItem; 
} 

public class ScannerTest extends TestCase 
{ 
    public ScannerTest (String name) { 
    super (name); 
    } 
    public void testScan() { 
    // pass self as a display 
    DisplayMock dispMock = new DisplayMock(); 
    Scanner scanner = new Scanner (dispMock); 
    // scan calls displayItem on its display 
    scanner.scan(); 
    assertEquals (new Item (“Cornflakes”), dispMock.GetItem()); 
    } 
} 

daha büyük kötülüktür TestClass için SRP ihlali. Ayrıca, alay çerçevelerinin kullanılmasıyla, bu sorun tamamen ortadan kalkıyor.

DÜZENLEME Sadece Robert C. Martin'in mükemmel kitabında Agile Principles, Patterns, and Practices in C# kendinden şant desen kısaca bahsetmek karşılaştım.

alt text

Yani, (aynı kitapta ayrıntılı olarak anlattı edilir) SRP icat adam kendinden şant desen kullanarak gizlemiyor: İşte kitabın dışına snippet'idir. Bunun ışığında, bu modeli kullanırken OOP'tan (Nesne Yönlendirilmiş Polis) oldukça güvenli olduğunuzu söyleyebilirim. Bence

1

o test paketi de değişmek zorunda olacağı nispeten büyük olasılıkla, değiştirilir. Bu yüzden onu bir SRP ihlali olarak görmüyorum.

+0

Bu kesinlikle iyi bir nokta, ama yanlış bir argüman. Testin her halükarda değişmesi muhtemel olduğu için, bu modelin kullanılması test sınıfının SRP'yi ihlal etmesine sebep olmaz. Pratik bir bakış açısıyla söylenen şey, örüntüyü kullanmaya ve belki de SRP'yi ihlal etmeye karşı değilim. –

1

ben yaratıyorum mocks/koçanları üzerinde biraz daha fazla kontrol sahibi olmak tercih ederim. Kendi şant desenini kullanmaya çalıştığımda, test sınıfımı daha karmaşık hale getirdim. Test metodu içinde yerliler olarak alaylar yaratarak daha temiz kodlara sahip oldum.

FWIW size bir arayüz değiştirdiğinizde test kodu değişecek C# (veya piton veya eşdeğeri) gibi güçlü bir şey kullanmadığınız sürece.

3

o ihlali, ama çok küçük bir tek olduğunu.

Sınama sınıfı, şu anda sınamak için bir bağımlılık sınıfı ve bir bağımlılık sınıfıdır.

Ancak, bu kötü bir şey mi? Muhtemelen birkaç basit test için.Test vakalarınızın sayısı arttıkça, muhtemelen bazı endişeleri ayırmak için sahte bir dersi tekrar gözden geçirmek ve kullanmak isteyeceksiniz. (Yapıştırdığınız linkin dediği gibi, kendinden şant, alay etmek için bir adımdır). Ancak test vakalarının sayısı sabit ve düşük kalırsa, sorun nedir?

Biraz pragmatizm gerektiğini düşünüyorum. SRP'yi ihlal ediyor mu? Evet, ama muhtemelen sınamakta olduğunuz sistemdeki bazı kodlar kadar tahmin edemiyorum. Bu konuda bir şey yapman gerekiyor mu? Hayır, kod açık ve sürdürülebilir olduğu sürece, benim için her zaman alt satırdır. SRP bir kuraldır, kural değildir.

+0

İyi dedi. Başka bir yorumda ima ettiğim gibi, onu kullanmaya karşı değilim, ama sadece “teknik olarak” SRP'yi ihlal ettiğini doğrulamak istedim. –

İlgili konular