Birim testinin değeri nasıl açıklanır


30

İş arkadaşlarıma birim testleri (ve genel olarak test) kavramını tanıtmak istiyorum; şu anda hiçbir test yok ve istenen sonucu görmek için UI aracılığıyla görevleri gerçekten gerçekleştirerek işler test ediliyor. Tahmin edebileceğiniz gibi, kod tam olarak uygulamaya çok sıkı bir şekilde bağlıdır - hatta bir sınıfta olması gereken ve hatta kopyalanıp yapıştırılan sistemde tekrar kullanılması gereken kodlarla sonuçlanır.

Değişen gereklilikler nedeniyle, daha önce yazdığım ve oldukça gevşek bir şekilde bağlanmış olan bir modülü değiştirmem istendi (istediğim kadar değil, ancak birçok başka konsept sunmaya gerek olmadan alabileceğim en iyi şekilde). Beklendiği gibi çalıştığını kanıtlamak ve testin nasıl çalıştığını göstermek için gözden geçirilmiş kodumla bir birim test paketi eklemeye karar verdim; Kodun bir kısmı zaten yazıldığı için gerçek TDD'yi izlemiyorum, ancak oluşturmam gereken yeni kod için bazı TDD kavramlarını izlemeyi umuyorum.

Şimdi, kaçınılmaz olarak, bana kodun yazılmasının neden bir veya iki günden fazla sürdüğünün sorulacağından eminim, çünkü etkileşimde olacağım parçaların bir kısmı sistemde zaten var (testler olmadan ve çok sıkı bir şekilde olsa bile) birleştiğinde) ve içindeki kodu kontrol ettiğimde bu "Testler" projesinin ne olduğu sorulacak. Testin temellerini açıklayabilirim, ancak gerçek faydaları diğerlerinin anlayacağı şekilde açıklayamıyorum (çünkü testin uygulamanın kendiniz çalıştırılmasını gerektirdiğini düşünüyorlar çünkü çoğu zaman gerçek kullanıcı arayüzü özelliğinin işe yarayıp yaramadığının belirlenmesinde önemli " ya da değil). Gevşek bağlanma fikrini anlamıyorlar (hiçbir şeyin gevşek bir şekilde bağlanmadığı açıkça görülüyor; yazdığım kodun dışında herhangi bir arayüz bile yok), bu yüzden bunu bir fayda olarak kullanmaya çalışmak muhtemelen bana bir "Huh?" Bir nevi görünüm, ve yine de mevcut birkaç modüle tekrar çalışmak zorunda kalmadan istediğim kadar gevşeyemem ve muhtemelen "programlama" değil, zaman harcıyormuş gibi görünen bir tür IoC kabı getirdim.

Bu koda nasıl işaret edebileceğim konusunda herhangi bir önerisi var mı ve "küçültme olmadan çıkmadan" birim testleri oluşturmaya başlamalıyız "(örneğin," Testler yazmak sizi iyi kod yazmaya zorlar. " (benimki kötü olmadıkça ) ya da gerçek bir değer katmayan zaman kaybı gibi görünmüyor mu?


1
Bu, "Uzman veritabanı görevlisine" neden kredi kartı bilgilerinin A. unhashed ve B olduğunu sorduğum zaman gibi geliyor. Neden telefon numarası alanı nvarchar (MAX) ve C idi? Neden tablolar arasında hiçbir ilişki yoktu. Sadece anlamadı.
Çörek Adam

1
(Bu alaycı bir cevap, bunun bir şakası ) -> (A) Bazıları veritabanı sunucunuzu kırarsa daha büyük sorunlarınız olur. (B) Veri saklama ucuz ve eğer biri bir alandaki meta-verileri saklamak istiyorsa. (C) NoSQL bebeğim;) ( Yine şaka yapıyorum diye yineleyeyim )
Darknight

Büyük Ünite Testi Sanatı'nda bununla ilgili bir bölüm var .
StuperUser

6
@Wayne, Her zaman sorularınızdan birini okuduğumda yeni bir iş bulman gerektiğine ikna oldum. Onlar, yazılım geliştirmede sıkıntılı ve eski bir emanetçi ve sen değilsin. Bir pencere açılırsa bunun için zıplar ve arkana bakma.
maple_shaft

2
@WayneM, Çıkın. Ciddi anlamda.
AK_

Yanıtlar:


18

İş arkadaşlarıma birim testleri (ve genel olarak test) kavramını tanıtmak istiyorum

Kavramsal yönden değil pratikten başlamanın daha iyi olacağını düşünüyorum. Elbette, gündelik tartışmalar sırasında iş arkadaşlarınızın ve / veya yönetiminizin birim testlerini duymakla ilgilendiğini fark ederseniz, daha iyisi - o zaman web'den somut deneyimler / kanıtlar alabilir, kısa bir eğitim hazırlayabilirsiniz. Ancak, tarif ettiğinize göre, takım arkadaşlarınız bu garip yeni fikre çok açık değil gibi görünüyor.

Böyle bir durumda, ilk önce çok fazla açıklama yapmaya çalışmadan küçük ünite testlerimi yazmaya başlayacağım. Ne zaman kod değiştirirsem, kodun tamamını kapsamaya çalışmadan bir kaç tane ekleyin (bu çok zaman alır). İdeal olarak, iyi bir denge sağlamayı başarırsam, birim testleri yazdığımı fark ettikleri zaman, zaten önemli bir test takımım ve gösterebileceğim bazı somut sonuçlara sahip olabilirim (bu gibi "bu hatayı yakalamayı başardım" gibi) Geçtiğimiz haftaki değişiklik ile tanıtıldı, aksi halde kalite güvencesi / üretimine geçecekti "). Bu, testlerin ciddi bir geliştirici için değerini kanıtlayacak.

Ondan sonra, birim testinin uzun vadeli faydalarını açıklamaya başlamak için iyi bir konumdayım,

  • kodun çalıştığını kanıtlar - her zaman, her yerde, anında ve otomatik olarak
  • refactor'a güven verir, daha iyi bir tasarım ve daha iyi bakım sağlar.
  • ve eğer bir şey bozulursa, ünite testleri size hata ayrı bir QA departmanı tarafından yakalanırsa, birkaç gün veya hafta gecikme yerine, anında (neredeyse) anında geri bildirim verir. Bu, genellikle kısa süreli hafızanızdan çoktan düştü kodda, saat / gün boyunca hata ayıklamak yerine hatayı saniyeler içinde düzeltmenizi sağlar.

Ayrıca bu konuya bakınız: Otomatik birim testi, entegrasyon testi veya kabul testi .

SO'dan daha erken bir: Birim testi nedir?


4
Pratik yön için +1. Bunu 50+ dev'imizde yaptık. alışverişe çıkıyor. Her defasında bir tane daha dev alırız. testleri yazarken, onlar bağladım.
ale

İşin kötü yanı testleri yazıyor, ancak iş arkadaşları bunları bilmiyor ve üretim kodunda testlerin başarısız olmasına ve böylece tüm çabalarını iptal etmesine neden olacak bir şeyler değiştirecek: (
Igor Popov

Testleri ilk önce kontrol ettin mi, yoksa kendin için mi sakladın? Patronumdan onay almadan test dosyalarına bakmaya başlarsam, bir gözden geçiricinin heyecanlanmayacağını hayal edebiliyorum
Frode

12

Korkusuz yeniden faktör

Biraz farklı bir açıdan, TDD "korkudan yeniden düşünebilmenizi" sağlar ve bu, ekibinizi satabileceğiniz önemli bir avantajdır. Geliştiricilerin kendilerine şunları söylemesini önler:

  • "Bu koda dokunmak istemiyorum çünkü korkarım onu ​​kıracağım"
  • "Bu kodu kullanabilmek için yeni işlevler yazmak istemiyorum çünkü nasıl çalıştığını bilmiyorum"
  • "Gizlice, bu koddan korkuyorum"

Daha üzerinde durmak olabilir, ama bu iyi gibi zemin kaplıdır TDD üzerinde Amca Bob ve TDD üzerinde Martin Fowler .

Bağımlılıklar

Oh, bir şey daha ekleyeceğim. Onlara TDD'nin iyi bir tasarımı nasıl zorladığını ve bu da bağımlılıklarla başa çıkmanızı sağlar.

Bob: "Oh c% ^ p! Patronlar hepimizi MS SQL Server 2008'i kullanmaya zorladılar" Jane: "Sorun değil, zarar gördü, çünkü veri kaynağımızı ve DAO sınıflarımızı DI ekledik, TDD'nin teşvik ettiği için çok mutluyum Bizi bu yolda. "


4

Otomatikleştirilmiş testleri olmayan kaynak kodları üzerinde çalışırken, yaptığımız değişikliklerin mevcut işlevselliklerin hiçbirini bozmadığından emin olmak için büyük özenle çalışmalı ve daha fazla incelemeye ihtiyaç duymalıyız.

İyi otomatikleştirilmiş test durumlarımız olduğunda, sonuçlar daha hızlı, güvenli ve korkusuz bir gelişme olacaktır (hata düzeltme, geliştirme veya yeniden faktoring olabilir).


4

Matematik yap

  • t mt: Etkileyebileceğiniz her şeyi manuel olarak test etmek için gereken süre
  • t wt = testleri yazmak için gereken süre
  • k = yeni kodu çıkarmadan önce muhtemelen her şeyi test etmeniz gerekecek

    eğer ( ağırlıkça <t mt ) veya ( ağırlıkça <(k * t mt )) o zaman beyninde olmayan: testlerin yazılması gelişmeyi hızlandıracaktır.

Aksi oranında (t nokta ağırlık / (k * t mt )). Çok büyük bir sayı ise, başka bir fırsatı bekleyin; Aksi takdirde, regresyon testi yararları ile haklı.

Not: Bu noktada birimlerin değil sadece özelliklerin test edilmesini öneririm - haklı çıkarmak ve anlamak çok daha kolay ve tartışmasız yeniden yapılanma sırasında yalnızca ünite testlerinden daha yüksek bir değere sahip daha az çalışma.

Not 2: zamanıdır için gereken çalıştırmak testleri önemli değil onlar otomatik çünkü. Testler sürerken, testin son sürenizi kaçıracak kadar uzun sürmemesi koşuluyla , testler sırasında verimli bir şey yapabilirsiniz. Bu nadirdir.


Sana +1 veriyorum, ama bu matematik korkutucu görünüyor!
Wayne Molina

Bu indisler sadece var @Wayne, onlar vardır korkutucu. Ancak programlama sissies için değil! ;-)
Steven A. Lowe

1

Bir Microsoft mağazasıysanız Bir öneri: birim testi veya gevşek couping en iyi uygulama olarak (Emin birden çok örneği vardır am önerir MSDN'de bazı belgeleri bulabilirsiniz bu çakışma varsa ona) ve nokta.

Bir şeyler yapmanın saçma bir yolu gibi gelebilir, ancak 'en iyi uygulama' terimini kullanmanın özellikle yönetim konusunda uzun bir yol alacağını öğrendim.


1

Her zaman önerdiğim gibi, harika bir uygulama biliyorsanız, bunu ortamınıza nazikçe tanıtmanın en iyi yolu elbette kendiniz yapmaya başlayacak ve daha sonra yol boyunca bir yerde, iş arkadaşlarınızdan bazıları faydaları görecek ve onu al.

Buradaki anahtar kelime devrim değil evrimdir.

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.