Ünite testi için ne tür fonksiyonlar ve / veya sınıflar imkansızdır?


21

Geliştiriciden iyi bir birim testine sahip olmamanın ana bahanesi "Kod, test edilebilir bir şekilde tasarlanmamıştır" dır. Ne tür bir tasarım ve kodun ünite test edilemeyeceğini anlamaya çalışıyorum.


2
Bahanen mi? Bir meslektaş? Yöneticiler? Hangi dille / çerçevelerle çalışıyorsunuz?

1
Uygulamada çok sayıda eski kod var ve yeniden tasarlamak için zaman yok.
knut

4
@gnat: Ben katılmıyorum. Alıntı ettiğiniz soru, birim testlerinin faydalı olmadığı durumlarla ilgilidir. Mevcut soru, birim testlerini zorlaştıran durumlarla ilgilidir.
Arseni Mourzenko

@MainMa görünüşte farklı sorular okuduk. “Birimce test edilemeyen ne tür tasarım ve kodları anlamaya çalışıyorum.” => "Birim testine ne zaman uygun değildir?"
tatarcık

1
@ manizzzz: soruyu düzenlemek isteyebilirsiniz.
jmoreno

Yanıtlar:


27

Birkaç faktör kodun birim testini zorlaştırabilir. Bu durumda, refactoring, test edilebilir olması için kodu iyileştirmeye yardımcı olur.

Muhtemelen test edilmesi zor olan bazı kod örnekleri:

  • 1000-LOC işlevi,
  • Ağır biçimde küresel devlete dayanan kod,
  • Arayüzlere ve Bağımlılık Enjeksiyonuna dayanmak yerine, somut, karmaşık, veritabanı bağlamı gibi nesneler oluşturmak için karmaşık olan kodları,
  • Yavaş yavaş performans gösteren kod ,
  • Spagetti kodu,
  • Okunabilirlik veya bakım açısından önemsiz yıllarca değiştirilen eski kod,
  • Yazarın asıl amacı hakkında hiçbir yorum veya ipucu olmayan kodu anlamak zor (örneğin, gibi değişken adları kullanan kod) function pGetDp_U(int i, int i2, string sText).

Açık mimari eksikliğinin kodun birim testini zorlaştırmayacağına dikkat edin, ünite testleri kodun küçük bölümleriyle ilgilidir. Belirsiz mimarlığın entegrasyon ve sistem testleri üzerinde hala olumsuz bir etkisi olacaktır.


8
Ayrıca vb rasgele sayılar, şimdiki zamanda, kablo bağlantılı I / O gibi olmayan saf fonksiyonları üzerine bağımlılıkları iğne yapmak değil test kodunun zor
9000

kodunu böyle sınamak için önemsizdir - yalnızca kodunuzu koduna göre ayarlamak için doğru test aletine ihtiyacınız yoktur. Örnek olarak Microsoft Fakes'i deneyin.
gbjbaanb

@MainMa, bu cevabı beğendim. Hangi faktörlerin farklı testlerin entegrasyon ve sistem testlerine yönlendirdiği hakkında biraz yorum yapmak ister misiniz? Geçmişte buradakine benzer sorular sormamın nedeninin, hangi test türlerinin en iyi nereye koyduğunu açıklayan bir yol haritasım olmadığını (ya da belki de en uygun maliyetli yere koyduğumu) biliyorum. birim testleri sadece birdi.
J Trana

14

Üniteyi test etmeyi zorlaştıran bir çok şey var. Tesadüfen, çoğu da kodun korunmasını zorlaştırıyor:

  • Demeter Kanunu ihlalleri.
  • Enjeksiyon bağımlılıkları yerine bir metot içerisinde nesneler oluşturma .
  • Sıkı bağlama.
  • Zayıf uyum.
  • Yan etkilere büyük ölçüde güvenir.
  • Globals veya singleton'lara ağır şekilde güvenir.
  • Çok fazla ara sonuç göstermez. (Bir keresinde on sayfalık bir matematik fonksiyonunu tek bir çıktıyla test etmek zorunda kalmıştım ve ara sonuç mevcut değildi. Seleflerim kodun cevabını vermiş olursa olsun temelde kodlanmışlardı.
  • Veritabanları gibi alay edilmesi zor olan hizmetlere ağır ve doğrudan bağlıdır.
  • Çalışma zamanı ortamı, yerleşik bir hedef gibi geliştirme ortamından önemli ölçüde farklıdır.
  • Birimler yalnızca derlenmiş biçimde kullanılabilir (üçüncü taraf DLL gibi).

Bence bu mükemmel bir cevap. Pek çok kod seviyesi sorununa ve genel durum sorunlarına dokunuyorsunuz. @MainMa'nın geçerli olduğunu düşündüğüm başka konular da var, ancak daha az iyi tanımlanmış. Jeffery Thomas, G / Ç ve Kullanıcı Arayüzünden bahseder. Bence, bu üç cevabın iyi kısımlarını eklerseniz, çok iyi bir uyumlu cevabınız olur. Kod cevabı kalıplarına odaklanmamdan dolayı bu cevabı en çok seviyorum.
M2tM

1
Argh - ünite testinden daha kötü hiçbir şey, iş gereksinimlerine benzerlik göstermeyen ve sadece belirli bir zamandaki çıktısı olan - örneğin 3 kez aranacak kurulumlar mı? Neden 3? Çünkü test ilk defa 3 kez yapıldı / rant :)
Michael

Sıkı kavrama sadece uygun olmadığında kötüdür. Oldukça yapışkan olduğu kodundaki sıkı bağlantı bir zorunluluktur. Örneğin değişken bir bildirim ve kullanımı. Sıkıca bağlı, çok yapışkan.
dietbuddha

1
Çıktının kodun ne olduğuna göre kontrol edildiği ünite testlerine, herhangi bir ticari durum / gerekçe olmaksızın Karakterizasyon Testleri denir. Daha önce testlerin olmadığı ve genellikle belgelendirilmiş gerekliliklerin olmadığı bakımda kullanılırlar ve bu fonksiyonun çıktısı değişirse kırılacak bir şey koymak zorunda kalırsınız. Hiçbir şeyden daha iyiler.
Andy Krouwel

5

Genel kod örnekleri, birim testi yapmak istemiyor:

  • Doğrudan g / Ç ile etkileşime giren kod (dosya okumak, doğrudan ağ aramaları,…).
  • Kullanıcı arabirimini doğrudan güncelleyen kod.
  • Tekillere veya global nesnelere doğrudan referans veren kod.
  • Nesne veya alt nesne durumunu dolaylı olarak değiştiren kod.

Sahte bir çerçeve kullanarak, bu örneklerin tümü birim test edilebilir. Sadece iç bağımlılıklar için sahte değiştirmeleri ayarlamak işe yarıyor.

Gerçekten birim test edilemeyen şeyler:

  • Sonsuz döngüler (bir iş parçacığı yöneticisi, sürücüsü ya da başka bir uzun süreli kod türü için)
  • Bazı doğrudan montaj işlemi türleri (bazı dillerin desteklediği)
  • Ayrıcalıklı erişim gerektiren kod (imkansız değil, sadece iyi bir fikir değil)

2

Bunlar ünite testleri yazmayı zorlaştıracak birkaç alandır. Bununla birlikte, testinize biraz karmaşıklık katabilecekleri için kullanışlı teknikleri elden indirmeniz gerektiği anlamına gelmediğini vurguluyorum. Herhangi bir kodlama olduğu gibi size faydalar maliyetleri outway olmadığını belirlemek için kendi analizini yapıyor olmalı ve körlemesine net neyi bazı rasgele adam kabul etmeyen.

Kötü tasarlanmış kodun yazıldığı yer

  • uygun olmayan bağlantı (genellikle olmaması gereken yerlerde sıkı bağlantı)
  • mutfak lavabo kodu (bir fonksiyonun çok fazla mantık / sorumluluk olduğu yerlerde)

Devletin farklı bir kapsamda güvenmesi

Ne yaptığınızı bilmiyorsanız, bu spirallerin çoğunun maliyeti kontrolden çıkar. Ne yazık ki, çoğu kişi bu teknikleri, karmaşıklığı test etmek gibi şeyleri hafifletmek için nasıl kullanacağını bilmez.

  • singletons
  • Globaller
  • Kapaklar

Dış / Sistem Durumu

  • Donanım / cihaz bağımlılıkları
  • Ağ bağımlılıkları
  • Dosya sistemi bağımlılıkları
  • İşlemler arası bağımlılıklar
  • Diğer sistem çağrısı bağımlılıkları

eşzamanlılık

  • Diş açma (kilitler, kritik bölümler vb.)
  • fork'ing
  • Eşyordamlar
  • Çağrı geri
  • Sinyal İşleyicileri (hepsi değil, bazıları)

2

Test edilemeyen kod diye bir şey yoktur. Bununla birlikte, GERÇEKTEN, GERÇEKTEN zor test edilebilecek birkaç kod örneği vardır (muhtemelen çabaya değmeyecek kadar):

Donanım etkileşimleri - Kod, donanımı doğrudan yönetiyorsa (örneğin, bir fiziksel aygıtı taşımak için bir kayıt defterine yazma), birim test etmek çok zor veya pahalı olabilir. Test için gerçek bir donanım kullanıyorsanız, bu test donanımına uygun geri bildirim almak için daha pahalı olabilir (yine de daha fazla ekipman!) Ve eğer yapmazsanız, fiziksel nesnelerin tam davranışını taklit etmeniz gerekir - küçük bir hile yapmak yok Bazı örnekler

Saat etkileşimleri - Bu genellikle daha kolaydır, çünkü sistem saati işlevlerini oldukça önemsiz bir şekilde çıkarmak neredeyse her zaman mümkündür. Ancak, yapamadığınızda, bu testler yönetilemez hale gelir - gerçek zamana dayanan testlerin çalışması uzun zaman alır ve benim deneyimlerime göre sistem yükleri işleri gereğinden uzun sürdüğü için çok kırılgan olma eğilimindedirler. , hayalet test başarısızlıklarına neden olur.


0

Bunun için üç ana grubum:

  • harici servislere dayanan kod

  • Test cihazlarının uygulamadan bağımsız olarak durumlarını değiştirmelerine izin vermeyen sistemler.

  • üretim kurulumunu çoğaltmayan ortamları test edin.

Bu, bir geliştirici olarak QA mühendisine dönüştüğünde en çok yaşadığım şeydi.

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.