Birim testi acemi ekibin birim testi yapması gerekiyor


37

Tarihsel olarak HERHANGİ BİRİM Sınaması yapmayan yeni bir ekiple çalışıyorum. Amacım ekibin sonunda TDD'yi (Test Odaklı Geliştirme) doğal süreçleri olarak kullanması. Ancak TDD, ünite dışı bir test ekibi için çok radikal bir zihin kayması olduğundan, kodlamadan sonra ünite testleri yazmaya başlayacağımı düşündüm.

Benzer bir durumda olan var mı? Bir ekibi herhangi bir ünite testi yapmadıklarında TDD ile rahat etmenin etkili bir yolu nedir? Bunu birkaç adımda yapmak mantıklı mı? Ya da hemen içine dalmalı ve tüm büyüyen acıları bir kerede yüzleşmeli miyiz?

DÜZENLE

Sadece açıklama için, herhangi bir birime maruz kalma / deneyim testi yapan takımda (kendim dışında) kimse yok. Ve Visual Studio'da yerleşik birim test işlevselliğini kullanmayı planlıyoruz.


+1 Bu soru neredeyse bulunduğum durumun ana hatlarını çiziyor, sadece VS yerine Eclipse PHP Dev için.
Kanada

Bu forum için uygun bir soru
Ryan

1
En sonunda ne yapmaya karar verdin? Bunun nasıl ortaya çıktığını gerçekten duymak isterim.
Snoop

Yanıtlar:


36

Mevcut hatalar / kusurlar üzerinde pratik yapın.

Bu gerçekten zor bir durum. Daha önce hiç bir şeyden TDD'ye hiç gitmedim, ama deneyimlerime göre, bir ekip testinden proaktif olarak bunları yazmaya kadar bir ekibin gitmesi, “bir anda bir adım” yaklaşımı oldu.

Öncelikle, rahatça birim testlerini yazmalarını ve gerçekte ne olduklarını ve yararlarını bilmelerini sağlayın. Takımlarım için, mevcut hatalar için birim testleri yazmak en iyisidir. Sistemlerdeki mevcut hataların, insanlara birim testleri iyi yazmaları için öğretmeniz gereken iki şey vardır:

  1. beklenen bir önkoşul ve sonkoşul
  2. şu anda beklenmeyen bir sonuç ve bu önkoşul / sonkoşulları ihlal eden bir sonuç

Bu üyelere çok somut uygulama örnekleri verir. Hatayı düzeltmeden önce bir test yazabilirler, böylece başarısız olur. Ardından, kodu geçmesi için düzeltebilir ve hatayı düzeltirler. Bu konuda rahat olduklarında, daha önce kodsuz olarak ünite testleri yazabilecekleri ve testlerini geçmeleri için yeni kodlar yazabilecekleri şekilde geri kalanını alabilirsiniz.

İşin püf noktası, onlara şartların ön / son koşullarının açık olduğu yerlerde pratik yapmaları için bir şeyler vermektir. Metotların gereklilikleri bulanıksa, deneyimli TDD insanlarının tam olarak nereden başlayacaklarını bilmeleri bile zordur. Zamanda bir adım atın ve oraya gideceksiniz. İyi şanslar!


Kötü bir ünite testi olduğu için mevcut bir böcek ısınması için bir ünite testi yazmaz mı, yani tek bir ünite yerine bir sürü şeyi test eder mi? Bir entegrasyon testi bu senaryo için daha uygun olmaz mıydı?
Isaac Kleinman,

böcek için test yazmak, bu iyi bir tavsiye.
Amitābha

32

Tüm şirketimi TDD'ye geçmeye ikna ettim. Kolay olmadı, ama çabaya değdi: geçişin ardından kodun kalitesi arttı ve şimdi kimse korkunç kovboy kodlama zamanlarına geri dönmeyi hayal etmiyor.

  1. Açıkla, açıkla, açıkla. Takımınızın test yazmasını istemiyorsunuz. Takımınızın test yazmak istemesini istiyorsunuz . Bu, neden yaptıklarını, faydalarını ve bunun işlerini nasıl daha kolay hale getireceğini tam olarak anlamaları gerektiği anlamına gelir . Kırmızı, Yeşil, Refactor , bir regresyon testi yazmak, bir hatanın giderildiğinin bir kanıtı olarak vb.

  2. Gerçek olanı araştırın (önce testler, sonra kod). Kodlamadan sonra test yazmak hiç de mantıklı değil, aslında işe yarayıp yaramadıklarını asla bilemeyeceksiniz (ve insanlar buggy test vakaları yazıyorlar). Sezgim sen gitmek gerekir çaba miktarı olmasıdır hiçbir testler için testler ilk daha az sen formu gitmek için gerekenleri daha hiçbir testler aracılığıyla ilk kod için ilk testlerin siz de orta adımı atlayabilirsiniz yüzden.

  3. Regresyon testleriyle başlayın. Bunların anlaşılması oldukça basittir ve anında memnuniyet verir. Tabii ki, bu kodun uygun şekilde modüler hale getirildiğini ve kolayca test edilebileceğini varsayar. Değilse, bu adımı atlayın.

  4. Bebeğin adımlarını at. TDD'nin kullanılması biraz zaman alıyor ve ilk başta sinir bozucu olabiliyor. Testleri yepyeni bir proje veya bileşende tanıtmaya çalışın, ideal: çok önemli olmayan bir şey. Gerçekten de hızlı bir şekilde yapılması gereken çok önemli bir şey olduğunda ve programcılar TDD'nin yoluna girdiğini düşündüklerinde durumdan hiçbir şekilde kaçınmak istersiniz.

  5. Takım rahat olmaya başladığında, tüm yeni işlevsellik TDD tarzında yazılmalıdır. Bu, projenizin büyüklüğüne bağlıdır, ancak bir süre sonra , projenizin eski kısımlarını sadece eski şekilde yazılmış olarak oldukça iyi bir şekilde kapsamalısınız .

  6. Bu noktada, ekip zaten TDD'yi anlamalı ve benimsemeli ve eski (TDD olmayan) malzemelerin çalışması zor ve sinir bozucu olarak görülmelidir. Refactored alın: çoğu popo zevkle yapacak.

Diğer bazı önemli noktalar:

  • Mevcut en iyi test çerçevesini kullandığınızdan emin olun. İnsanları, kötü yazılmış bir kütüphane ile etkileşime girmeleri gerektiğinde TDD yapmaya ikna etmek daha zor olacaktır.

  • Testlerin çalıştırılmasının kolay olduğundan ve tamamlanması çok zaman almadığınızdan emin olun (veya örneğin testler için bellekteki bir db kullanarak hile yapın).

  • Kesintisiz testlerin hemen bulunabilmesi için bazı sürekli entegrasyon yazılımları kurun.


1
Muhtemelen en önemlisi, gemiye yönetim sağlamaktır.
Todd,

18

TDD ile rahat etmenin bir yolu, önce entegrasyon testlerini yazmaktır. Daha sonra test dikişleri ve gerçek birim testlerini tanıtın.

Kodlama sonrası birim testleri yazmanın sorunu, kodun test edilebilir olmak için iyi tasarlanmış olmasının gerekmediğidir . Test dikişlerini tanıtmak için bir miktar yeniden yapılandırma veya belki de yeniden tasarım yapmanız gerekebilir. Ancak herhangi bir test kapsamınız yoksa nasıl güvenli bir şekilde yeniden dizayn edebilir veya yeniden tasarlayabilirsiniz ?

Entegrasyon testleri başlangıçta bu kapsamı size verebilir. Her ne zaman bir gerileme veya üretim sorunu yaşarsanız, kodu koda düzeltin ve bu kodu bir testle kapatın. Bu tür testlerin sağladığı yeterli güvenlik ağına sahip olduğunuzda, sisteminizin daha ince taneli, izole edilmiş bileşenlerinin ve / veya sınıflarının birim testlerini sunabilirsiniz.


6
Bunun harika bir yol olduğunu düşünüyorum: Ekibe önce uçtan uca testlerin nasıl otomatik hale getirilebileceğini ve her binada nasıl çalıştırılabileceğini gösterin. Testleri yazmak zorunda bile değiller, eğer ekip ikna etmek zorsa bunu kendiniz yapabilirsiniz. Bir şeyi her değiştirdiklerinde otomatik geri bildirim almanın ne kadar harika olduğunu gördüklerinde, size daha fazlasını nasıl yapacağınızı soranlar onlar olacaktır.
Sergio Acosta

1
İkinci param yerinde. Kodun test edilmesi zor ancak testlerin olmadığı eski bir kod tabanında bulunduğundan, refactor bir seçenek değil. Bu durumda test yapmak, insanları rahatsız etmelerini bile engelleyecek şekilde uygulamak zor olabilir.
Todd,

3

TDD'nin uygulanması çok zordur ve her geliştirme ekibi için her zaman en iyi seçenek değildir. Önceki işimde, ekip ağırlıklı olarak TDD'ye odaklanmıştı. Geliştirme modelimiz, çevik geliştirme yaklaşımı kullanılarak tamamen TDD idi. Visual Studio birim testleri ile test yapıldı.

Bir geliştirici, özelliği için herhangi bir ünite testi yazmadıysa, teknik lider ile başları belaya girerdi. Ayrıca, herhangi biri kırılmış bir yapıyı veya herhangi bir birim testini iade eden bir kişi varsa, geliştiricinin tüm sorunları çözmesi ve ekip parası kavanozuna 1 dolar eklemesi gerekir.


3

Eklemek için sadece küçük bir şey, süreci görselleştirin. Sürekli entegrasyon çalışması testlerini otomatik olarak yapın ve kod kapsamını kontrol edin. Herkesin görebileceği bazı başlangıç ​​sayfalarındaki en eksiksiz test modüllerini listeleyin. Bu takım yarışmasını devam ettirmeli.


2

Hiçbir JUnit deneyiminden doğrudan TDD'ye geçtim ve deneyim TDD'nin değerini açıkça belli etti. Ünite testleri için o kadar minnettar oldum ki, hızlı bir şekilde bu yaklaşım için bir müjdeci oldum.


0

Herhangi bir ünite testi yapmayan takımlarda bulundum ancak tanıtıldı ve şimdi bazı testler yapmak neredeyse yaygınlaştı. Ekibinizin birim testinin temellerini ve buraya hangi araçları getirmek istediğinizi ne kadar iyi anladığını keşfetmenizi öneririm.

Benim durumumda, iş mantığı, kullanıcı arayüzü ve arka uç işlevselliğinin bir karışımı olan bazı .Net kodları için nUnit'i getirmekti. Bir kaç insanın diğerlerinden daha fazla elde etmek isteyenlere sahip olup olmadığını görmeyi öneririm, böylece takımdaki birkaç kişi onu alır ve herkesi almaya çalıştığınız kapaktan biraz daha iyi yayılır. Buna atlamak için. İlk önce bazılarını iyi yapmak, bu bazı çapraz eğitimleri mümkün kılar, böylece toplayanlar başkasına ne kadar iyi öğretebilecekleri test edilebilir.

Başka bir nokta, bunu bir dereceye kadar göstermek için daha fazla uzmanlığa sahip olanları getirmeyi düşünmektir. Bize bazılarının yaygın olarak benimsemiş olduğu bazı şeyleri ve diğer kısımlarını pek fazla değil göstermek için çalıştığım düşünceler getirildi, ama bunun çoğu yerde geçerli olacağını düşünüyorum.

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.