Birim Testi: “Yeniden düzenleme yapıyorsanız ve ortak çalışan yoksa bir kod kokusu” mu?


9

Roy Osherove'nin Birim Testi Sanatı'nı okuyorum. Ben bölüm 7.2 yazarın kod kokusu hakkında bu notu var muhafaza testleri yazma:

NOT: Dış durumu test etmek için iç durumu yeniden düzenlediğinizde, bu bir kod kokusu olarak kabul edilebilir mi (kodun tasarımında veya mantığında bir şeylerin yanlış olabileceğine dair bir işaret)? Ortak çalışanları ortaya çıkarmayı yeniden düzenlerken kod kokusu değildir. Yeniden düzenleme yapıyorsanız bir kod kokusu ve ortak çalışan yok (bu yüzden herhangi bir şey saplamanız veya taklit etmeniz gerekmez).

DÜZENLEME : Yazarın "ortak çalışanlar" tarafından kast edildiği şey bağımlılıklardır. Bağımlılıklara ilişkin örneklerinden bazıları, bir veritabanına erişen veya işletim sisteminin dosya sistemine erişen sınıflardır. Saplamayı tanımladığı ve işbirlikçi kelimesini kullanmaya başladığı yer:

Bir saplama mevcut bir bir kontrol yerine geçer bağımlılık (veya ortak çalışan bir sistemde).

Yazar bu kod kokusu bir örneği yok ve ben bu neye benzeyeceğini anlamak / hayal etmekte sorun yaşıyorum. Birisi bunu biraz daha açıklayabilir ve belki somut bir örnek verebilir mi?


Bence buradaki karışıklık "Ortak Çalışanlar" sözcüğünden kaynaklanıyor. İtiraf etmeliyim ki bu bağlamda ne demek istediğinden de emin değilim.
rossipedia

@Bryan Ross, yazıyı yazarın "ortak çalışan" kelimesini nasıl kullandığı ile güncelledim. Teşekkürler!
programcı

Yanıtlar:


3

Bence yazarın işi bu.

Benim kod örneğinde, bir çıkış miktarı artı bir başlangıç ​​ve bitiş zamanı alan bir zamanlama penceresi var. Amaç 24 saatlik bir zaman dilimi içinde bir çıkış penceresi çizmektir. Başlangıç ​​zamanı durma süresinden daha büyük olduğunda bir kırışıklık eklenir, çünkü bu gece yarısına yayılan bir zamanlama penceresidir.

Özel değişkenleri ortaya çıkarmadan nesneyi tam olarak uygulayan birim testleri yazabilirsiniz. Bu özel havuzlar ve zaman aralıkları, birim testi için dahili olanları ortaya koyarken bahsettiği ortak çalışanlardır. Kitaba göre, bu içselleri açığa çıkarmak ortak oldukları için kod kokusu OLMAYACAK.

Çifti ortaya çıkarmak, outputbir ortak çalışan olmadığı için bir kod kokusu olurdu - GetOutputneyin döndürüleceğini belirlemek için koşullu mantığı olan sınıfın kendisi tarafından açıkça gizlenen bir öğedir .

Bools / zaman aralıklarına girmek, birim testlerini daha kapsamlı hale getirecektir. Bunun iyi olduğunu söylüyor.
Çifte kazmak output, birim testinizde ne GetOutputyaptığını yansıtan ek mantık gerektirir . Bu bahsettiği kod kokusu olurdu.

genel sınıf TimeWindow
{
  özel bool isConst;
  özel bool açıklıkları
  özel TimeSpan başlangıç1;
  özel TimeSpan durağı1;
  özel TimeSpan başlangıç2;
  özel TimeSpan stop2;
  özel çift çıkış;

  genel TimeWindow (çift çıkış, TimeSpan başlangıcı, TimeSpan durdurması)
  {
    çıktı = çıkış;

    eğer (start == stop)
      isConst = true;
    else if (başlat> durdur)
    {
      spansMidnight = true;
      başlangıç1 = gece yarısı;
      stop1 = durdur;
      start2 = başlat;
      stop2 = gece yarısı;
    }
    Başka 
    {
      start1 = başlat;
      stop1 = durdur;
    }
  }

  herkese açık çift GetOutput (TimeSpan zamanı)
  {
    // ne / nasıl geri döneceğine dair bazı mantık
    ...
    dönüş çıkışı;
  }

}

0

Diyelim ki bir etki alanı sınıfımız var ve bu etki alanı sınıfı, etki alanı sınıfında çalışan nesnelerin kalıcı değişikliklere çağırabileceği örnek düzeyinde bir "Kaydet" yöntemini göstermek için kullandığı bir Havuz kullanarak kalıcılık katmanı hakkında doğrudan bilgiye sahip. mekanizmanın bilgisine ihtiyaç duyulmadan yapıldı (bunun "iyi" tasarım olup olmadığı başka bir gün için bir tartışmadır). Bu Depoyu bir özellik ve / veya yapıcı argümanı olarak gösterecek şekilde sınıfın yeniden düzenlenmesi, böylece uygun çağrının yapılmasını sağlayabilen alaycı bir Havuzun geçilmesine izin verilmesi, genellikle yalnızca test için değil, genel bakım için de iyi bir şeydir.

Şimdi bu bir etki alanı sınıfı, durum verisi var. Bir an için durum bilgisi olan özelliklerden birinin bir destek alanı olduğunu varsayalım ve özellik erişimcileri geçerli girişe göre yeni bir girişin geçerli olduğunu test eder (belki de yeni değer asla eskisinden daha az olamaz). Bu doğrulamayı test etmeniz gerekiyor, ancak bunu yapmanın, daha sonra üzerine yazmaya çalışacağınız bir başlangıç ​​değeri ayarlamak için destek alanına erişim gerektirdiğini görüyorsunuz. Bu bir kırmızı bayrak olmalı; Test bir uygulama ayrıntıdır destek alanına erişimi (ihtiyacı varsa; hiçbir tüketici gerektiğini hiçnesneyi test için tutarlı bir duruma getirmek için üretim kodu tutarlı bir nesneyi nasıl elde eder? Üretim kodunun testinizle aynı şeyi yapması için bir yöntem varsa, test muhtemelen bu şekilde taklit etmelidir. Üretim kodunun nesneyi bu duruma getirmesi için geçerli bir yol yoksa, neden bu senaryoyu test ediyorsunuz?

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.