(Neden) Bir birim testinin bağımlılıkları test etmemesi önemlidir?


103

Otomatikleştirilmiş testin değerini anlıyorum ve sorunun iyi belirlendiği durumlarda iyi test durumları bulabildim. Yine de, burada ve StackOverflow'taki bazı kişilerin bağımlılıklarını değil, yalnızca bir birimi test etmeyi vurguladığını fark ettim . İşte fayda göremiyorum.

Test bağımlılıklarından kaçınmak için alay / kısma, testlere karmaşıklık kazandırır. Sahteciliği desteklemek için üretim kodunuza yapay esneklik / ayrıştırma gereksinimleri ekler. (Bunun iyi bir tasarım geliştirdiğini söyleyenlere katılmıyorum. Ekstra kod yazmak, bağımlılık enjeksiyon çerçeveleri gibi şeyler eklemek veya başka bir şeyi gerçek bir kullanım çantası olmadan daha esnek / takılabilir / genişletilebilir / ayrıştırmak için kod tabanınıza karmaşıklık eklemek iyi tasarım.)

İkincisi, test bağımlılıkları, her yerde kullanılan kritik düşük seviye kodunun, testlerini açıkça düşünenlerin dışındaki girdilerle test edileceği anlamına gelir. Bağlı olduğu düşük seviyeli işlevselliği alay etmeden üst düzey işlevsellikte birim testleri çalıştırarak düşük seviyeli işlevsellikte birçok hata buldum. İdeal olarak, bunlar düşük seviyeli işlevsellik için birim testlerinde bulunmuş olacaktı, ancak cevapsız durumlar her zaman olur.

Bunun diğer tarafı ne? Bir birim testinin bağımlılıklarını da test etmemesi gerçekten önemli mi? Öyleyse neden?

Düzenleme: Veritabanları, ağlar, web servisleri vb. Gibi dışsal bağımlılıklarla alay etmenin değerini anlayabiliyorum . (Bunu netleştirmem için motive ettiğim için Anna Lear'a teşekkürler.) İçsel bağımlılıklardan , yani diğer sınıflardan, statik fonksiyonlardan, vb. Bunun doğrudan dış bağımlılıkları yoktur.


14
"mühendislik, iyi tasarım değil". Bundan daha fazla kanıt sağlamak zorunda kalacaksın. Birçok insan buna "mühendislik üzerinden" değil, "en iyi uygulama" diyebilirdi.
S.Lott

9
@ S.Lott: Elbette bu özneldir. Ben sadece sorunu çözmek ve alaycılığın iyi olduğunu söylemek bir sürü cevap istemedim çünkü kodunuzu taklit etmek iyi bir tasarıma sahip. Genel olarak, şu anda veya öngörülebilir gelecekte belirgin bir faydası olmayan yollarla ayrılan kodlarla uğraşmaktan nefret ediyorum. Şu anda birden fazla uygulamanız yoksa ve öngörülebilir gelecekte olmasını öngörmüyorsanız, IMHO bunu sadece kodlamanız gerekir. Daha basittir ve müşteriyi bir nesnenin bağımlılıklarının ayrıntılarıyla donatmaz.
dsimcha

5
Yine de, genel olarak, kötü tasarım dışında bariz bir mantığı olmayan yöntemlerle birleştirilmiş kodlarla uğraşmaktan nefret ediyorum. Daha basittir ve müşterileri yalıtımlı olarak test edebilecek esnekliğe sahip değildir.
S.Lott 6'11 Nisanda

3
@ S.Lott: Açıklama: Açık bir şekilde herhangi bir kullanım durumu olmadan bir şeyleri çözme yolundan kayda değer bir şekilde ayrılan, özellikle de kodu veya müşteri kodunu önemli ölçüde daha ayrıntılı hale getiren, başka bir sınıf / arabirim, vb. Elbette en basit, en özlü tasarımdan daha sıkı bir şekilde birleşme için kod aramıyorum. Ayrıca, erken soyutlama çizgileri oluşturduğunuzda genellikle yanlış yerlerde bulunurlar.
dsimcha

Ne tür bir ayrım yaptığınızı netleştirmek için sorunuzu güncellemeyi düşünün . Yorum dizisini bütünleştirmek zordur. Lütfen açıklığa kavuşturmak ve odaklanmak için soruyu güncelleyin .
S.Lott,

Yanıtlar:


116

Bu bir tanım meselesi. Bağımlılığı olan bir test, bir birim testi değil, bir entegrasyon testidir. Ayrıca bir entegrasyon test takımına sahip olmalısınız. Aradaki fark, entegrasyon test takımının farklı bir test çerçevesinde çalıştırılması olabilir ve muhtemelen daha uzun sürdüğü için yapının bir parçası değildir.

Ürünümüz için: Ünite testlerimiz her bir derleme ile gerçekleştirilir, saniyeler içinde yapılır. Entegrasyon testlerimizin bir alt kümesi, her check-in sırasında 10 dakika sürmektedir. Tam entegrasyon paketimiz her gece 4 saat sürmektedir.


4
Gelecekteki bakım sırasında sisteme yeniden girmelerini önlemek için keşfedilen ve düzeltilen böcekleri kapsayan regresyon testlerini unutmayın.
RBerteig

2
Kabul etsem bile tanımda ısrar etmem. Bazı kodların bir StringFormatter gibi kabul edilebilir bağımlılıkları olabilir ve yine de çoğu birim testi tarafından kabul edilir.
danidacar

2
danip: net tanımlar önemlidir ve ben ederim onlara ısrar. Ancak bu tanımların bir hedef olduğunun farkına varmak da önemlidir. Nişan almaya değiyorlar, ama her zaman bir boğa gözüne ihtiyacın yok. Birim testlerinin genellikle alt düzey kütüphanelere bağımlılığı olacaktır.
Jeffrey Faust,

2
Ayrıca, bileşenlerin birbirine nasıl uyduğunu (entegrasyon testleri gibi) test etmeyen, izolasyonda tek bir bileşeni test eden cephe testleri kavramını anlamak önemlidir. (yani, bir nesne grafiği)
Ricardo Rodrigues

1
sadece daha hızlı olmakla kalmayıp, aynı zamanda aşırı sıkıcı ya da yönetilemez olmakla ilgili değil, hayal etmezseniz, alay yürütme ağacınızın katlanarak büyüyebileceğini hayal edin. Birbirinize 10 bağımlılıkla alay ettiğinizi düşünün, alaycılığa daha fazla basarsanız, 10 bağımlılığın 1'inin birçok yerde kullanıldığını ve bunun 20 bağımlılığının bulunduğunu varsayalım, bu nedenle birçok yerde potansiyel olarak iki kopyada + 20 bağımlılıkla alay etmelisiniz. son noktada alay etmek zorundasınız - örneğin veritabanı, böylece sıfırlamak zorunda kalmazsınız ve söylediğiniz gibi daha hızlıdır
FantomX1

39

Bütün bağımlılıkları yerinde test etmek hala önemlidir, ancak Jeffrey Faust'un söylediği gibi entegrasyon testi alanında daha önemlidir.

Birim testinin en önemli yönlerinden biri, testlerinizi güvenilir hale getirmektir. Başarılı bir testin gerçekten işlerin iyi olduğu ve başarısız testin üretim kodunda bir sorun olduğu anlamına gelmediğine güvenmiyorsanız, testleriniz neredeyse onlar kadar faydalı değildir.

Testlerinizi güvenilir hale getirmek için birkaç şey yapmanız gerekir, ancak bu cevap için sadece bir taneye odaklanacağım. Çalıştırmanın kolay olduğundan emin olmanız gerekir, böylece tüm geliştiriciler kodu girmeden önce kolayca çalıştırabilirler. "Çalıştırması kolay", testlerinizin hızlı bir şekilde çalıştığı ve bunları yapmak için gereken kapsamlı bir yapılandırma veya kurulum olmadığı anlamına gelir . İdeal olarak, herkes kodun en son sürümünü kontrol edebilmeli, testleri hemen uygulayabilmeli ve onaylarını görebilmelidir.

Başka şeylerdeki bağımlılıkları ortadan kaldırmak (dosya sistemi, veri tabanı, web servisleri, vb.) Konfigürasyona gerek duymamanızı sağlar ve sizi ve diğer geliştiricileri "Yapmadığım için testler başarısız oldu" demeye çalıştığınız durumlara daha az duyarlı hale getirir. ağ paylaşımını ayarlamamış. Ah, peki. Onları daha sonra çalıştıracağım. "

Bazı verilerle ne yaptığınızı test etmek istiyorsanız, ünitenizin o işletme mantık kodu için yaptığı testler, bu verileri nasıl aldığınızla ilgilenmemelidir . Uygulamanızın temel mantığını, veritabanları gibi destekleyici şeylere bağlı olmadan test edebilmek harika bir şey. Yapmıyorsan, kaçırıyorsun.

Not: Test edilebilirlik adına fazladan çalışmanın kesinlikle mümkün olduğunu eklemeliyim. Uygulamanızın test sürüşü bunu azaltmanıza yardımcı olur. Ancak, herhangi bir durumda, bir yaklaşımın kötü uygulamaları yaklaşımı daha az geçerli kılmaz. "Neden bunu yapıyorum?" Diye sormaya devam etmezse, her şey kötüye kullanılabilir ve fazla bırakılabilir. gelişirken.


İçsel bağımlılıklar söz konusu olduğunda işler biraz karışır. Düşünmeyi sevdiğim yol, sınıfımı yanlış nedenlerden dolayı değiştirmekten olabildiğince korumak istiyorum. Eğer böyle bir şey yapmazsam ...

public class MyClass 
{
    private SomeClass someClass;
    public MyClass()
    {
        someClass = new SomeClass();
    }

    // use someClass in some way
}

Genelde nasıl SomeClassyaratıldığını umursamıyorum . Sadece kullanmak istiyorum. SomeClass değişiyorsa ve şimdi yapıcı için parametreler gerektiriyorsa ... sorun bu değil Buna uyum sağlamak için Sınıfımı değiştirmek zorunda kalmamalıyım.

Şimdi, bu sadece tasarım kısmına dokunuyor. Ünite testleri söz konusu olduğunda, kendimi diğer sınıflardan da korumak istiyorum. MyClass'ı test ediyorsam, dış bağımlılığın olmadığı gerçeğini bilmek isterim, SomeClass'ın bir noktada bir veritabanı bağlantısı veya başka bir harici bağlantı getirmediğini biliyorum.

Fakat daha da büyük bir sorun, bazı yöntemlerin sonuçlarının SomeClass'taki bazı yöntemlerden elde edilen çıktılara dayandığını da biliyorum. SomeClass'ı taklit / engellemeden, talep edilen girişi değiştirmek için hiçbir yolum olmayabilir. Şanslıysam, test ortamımdaki ortamımı SomeClass’tan gelen doğru cevabı tetikleyebilecek şekilde oluşturabilirim, ancak bu şekilde devam etmek testlerime karmaşıklığı getirir ve kırılgan hale getirir.

MyClass'ı yapıcıdaki bir SomeClass örneğini kabul edecek şekilde yeniden yazmak, istediğim değeri döndüren sahte bir SomeClass örneği oluşturmamı sağlıyor (alaycı bir çerçeveyle veya manuel bir alayla). Genellikle yok olması bu durumda bir arayüz tanıtmak. Bunu yapıp yapmamak, birçok yönden, tercih ettiğiniz dilin belirleyebileceği kişisel bir seçimdir (örneğin arayüzler C # 'da daha muhtemeldir, ancak kesinlikle Ruby'de bir taneye ihtiyacınız olmaz).


+1 Harika cevap, çünkü dış bağımlılıklar orijinal soruyu yazdığım zaman aklıma gelmeyen bir durumdu. Sorumu cevaben açıklığa kavuşturdum. En son düzenlemeye bakın.
dsimcha

@ dsimcha Bu konuda daha fazla ayrıntıya girmek için cevabımı genişlettim. Umarım yardımcı olur.
Adam Lear

Adam, "SomeClass değişirse ve şimdi kurucu için parametre gerektiriyorsa ... MyClass'ı değiştirmek zorunda olmamalıyım" deyince doğru bir dil önerebilir misin? Üzgünüm, bu sadece sıradışı bir gereklilik olarak bana sıçradı. MyClass'ın ünite testlerini değiştirmek zorunda olmadığımı, ancak MyClass'ı değiştirmek zorunda kalmadığını görebiliyorum ... vay.

1
@moz Demek istediğim, eğer SomeClass'ın yaratılma şekli, MyClass'ın dahili olarak yaratılmak yerine SomeClass'a enjekte edilmesi durumunda değişmek zorunda kalmamasıydı. Normal şartlar altında, MyClass’ın SomeClass’ın kurulum ayrıntılarına dikkat etmesi gerekmez. SomeClass'ın arayüzü değişirse, o zaman evet ... Kullandığı yöntemlerden herhangi biri etkilenirse, MyClass'ın hala değiştirilmesi gerekir.
Adam Lear

1
MyClass'ı sınarken SomeClass ile alay ediyorsanız, MyClass'ın SomeClass'ı yanlış kullandığını veya değişebilecek bazı bir ClassClass tuhaflığına güvendiğini nasıl anlayacaksınız?
56'da

22

Ünite vs entegrasyon test sorunu dışında, aşağıdakileri göz önünde bulundurun.

Sınıf Widget'ı Thingamajig ve WhatsIt sınıflarına bağımlıdır.

Widget için bir birim testi başarısız oluyor.

Hangi sınıfta sorun yatıyor?

"Hata ayıklayıcısını ateşle" ya da "bulana kadar kodu okudum" yanıtını verdiyseniz, bağımlılıkları değil, yalnızca birimi test etmenin önemini anlarsınız.


3
@Brook: Tüm Widget bağımlılıkları için sonuçların ne olduğunu görmeye ne dersiniz? Hepsi geçerse, aksi ispat edilmeden Widget ile ilgili bir sorun var.
dsimcha

4
@ dsimcha, ama şimdi ara adımları kontrol etmek için oyuna geri karmaşıklık ekliyorsunuz. Neden basitleştirmiyor ve sadece basit birim testlerini yapıyorsunuz? Ardından entegrasyon testinizi yapın.
asoundmove

1
@dsimcha, önemsiz bir bağımlılık grafiğine girene kadar makul görünüyor. Diyelim ki bağımlılıkları olan 3+ katmanı olan karmaşık bir nesneye sahipseniz, O (1) yerine O (N ^ 2) sorgusuna dönüşür
Brook

1
Ayrıca, SRP hakkındaki yorumum, bir sınıfın kavramsal / problem alanı düzeyinde tek bir sorumluluğa sahip olması gerektiğidir. Sorumluluğun yerine getirilmesi, daha düşük bir soyutlama düzeyinde bakıldığında çok fazla farklı şeyler yapmasını gerektiriyorsa önemli değil. Uç noktalara alındığında, SRP, OO'ya aykırı olacaktır çünkü çoğu sınıf veri tutar ve işlem yapar (yeterince düşük bir seviyede bakıldığında iki şey).
dsimcha

4
@Brook: Daha fazla tip kendi başına karmaşıklığı artırmaz. Bu türler, sorun alanında kavramsal bir anlam ifade ediyorlarsa ve kodu daha zor değil, anlaşılmaları daha kolay hale getiriyorsa daha fazla tür iyidir. Sorun, kavramsal olarak problem alanı düzeyinde birleştirilen şeyleri yapay olarak ayırmaktır (yani, yalnızca bir uygulamanız vardır, muhtemelen hiçbir zaman birden fazla olmayacaktır) ve ayrıştırma, sorun alanı kavramlarıyla iyi eşleşmez. Bu durumlarda, bu uygulama etrafında ciddi soyutlamalar oluşturmak için aptalca, bürokratik ve ayrıntılı.
dsimcha

14

Programlamanın yemek pişirmek gibi olduğunu düşünün. Öyleyse, birim testi malzemelerinizin taze, lezzetli olmasını vb. Sağlamakla aynıdır. Oysaki entegrasyon testi yemeğinizin lezzetli olmasını sağlamak gibidir.

Sonuçta, yemeğinizin lezzetli olduğundan emin olmak (veya sisteminizin çalışmasını sağlamak) en önemli şeydir, nihai amaç. Ama eğer malzemeleriniz, demek istediğim, birimler, iş, öğrenmek için daha ucuz bir yolunuz olacak.

Aslında, birimlerinizin / yöntemlerin işe yarayacağını garanti ediyorsanız, çalışan bir sisteme sahip olmanız daha olasıdır. “Kesin” yerine “daha ​​muhtemel” i vurgularım. Entegrasyon testlerine hala ihtiyacınız var, tıpkı pişirdiğiniz yemeği tadacak ve son ürünün iyi olduğunu söyleyecek birine ihtiyacınız olduğu gibi. Oraya taze malzemelerle ulaşmak daha kolay olacak, hepsi bu.


7
Entegrasyon testleriniz başarısız olduğunda, ünite testi problemde sıfırlanabilir.
Tim Williscroft

9
Bir benzetmeyi genişletmek için: Yemeğinizin çok lezzetli olduğunu görünce, ekmeğinizin küflendiği için olduğunu araştırmak biraz zaman alabilir. Ancak sonuç, pişirmeden önce küflü ekmeği kontrol etmek için bir ünite testi eklemenizdir, böylece belirli bir sorun tekrar olamaz. Öyleyse daha sonra başka bir öğün yemeğinde başarısız olursanız, bunun nedeni olarak küflü ekmeği elemeniz gerekir.
Kyralessa

Bu benzetmeyi seviyorum!
şovmen

6

Üniteleri tamamen izole ederek test etmek, bu ünitenin gönderilebileceği TÜM olası veri varyasyonlarını ve durumlarını test etmenizi sağlar. Diğerlerinden izole edildiği için, test edilecek ünite üzerinde doğrudan etkisi olmayan varyasyonları görmezden gelebilirsiniz. bu sırayla testlerin karmaşıklığını büyük ölçüde azaltacaktır.

Çeşitli seviyelerde bağımlılıklarla test yapmak, birim testlerinde test edilmemiş olan belirli senaryoları test etmenize olanak sağlar.

Her ikisi de önemlidir. Sadece birim testi yaparken, bileşenleri entegre ederken ortaya çıkan her zaman daha karmaşık ince hatalar ortaya çıkar. Sadece entegrasyon testi yapmak, bir makinenin ayrı parçalarının test edilmediğinden emin olmadan bir sistemi test ettiğiniz anlamına gelir. Entegrasyon testi yaparak daha iyi bir tam test başarabileceğinizi düşünmek, giriş birleşimi sayısını eklediğiniz daha fazla bileşen ÇOK hızlı arttığından (faktöriyel düşünün) ve yeterli kapsamda bir test oluşturmak çok hızlı bir şekilde imkansız hale geldiğinden neredeyse imkansızdır.

Kısacası, üç seviye "birim testi" genellikle neredeyse tüm projelerimde kullanıyorum:

  • Tek bir bileşenin cehennemini test etmek için alaylı veya inatçı bağımlılıklarla izole edilmiş birim testleri. İdeal olarak biri tamamen kapsamaya çalışır.
  • Entegrasyon testleri daha ince hataları test etmek için. Sınır durumlarını ve tipik koşulları gösteren dikkatlice hazırlanmış nokta kontrolleri. Eksiksiz kapsama çoğu zaman mümkün değildir, sistemin başarısız olmasına neyin yol açtığı üzerinde duruldu.
  • Sisteme çeşitli gerçek hayat verilerini enjekte etmek, verileri (mümkünse) göstermek ve şartnameye ve iş kurallarına uygun olmasını sağlamak için çıktıyı gözlemlemek için şartname testi.

Bağımlılık enjeksiyonu, sisteme karmaşıklık eklemeden, ünite testleri için bileşenleri izole etmeyi sağladığından, bunu başarmanın çok etkili bir yoludur. İş senaryonuz, enjeksiyon mekanizmasının kullanımını garanti etmeyebilir, ancak test senaryonuz neredeyse olacaktır. Bu benim için vazgeçilmez yapmak için yeterli. Bunları, farklı soyutlama seviyelerini kısmi entegrasyon testi ile bağımsız olarak test etmek için de kullanabilirsiniz.


4

Bunun diğer tarafı ne? Bir birim testinin bağımlılıklarını da test etmemesi gerçekten önemli mi? Öyleyse neden?

Birimi. Tekil anlamına gelir.

2 şeyi test etmek, iki şeye ve tüm işlevsel bağımlılıklara sahip olduğunuz anlamına gelir .

Eğer 3. bir şey eklerseniz, testlerdeki fonksiyonel bağımlılıkları lineer olarak ötesine yükseltirsiniz. Şeyler arasındaki ara bağlantılar, sayı sayısından daha hızlı büyür.

Test edilen n maddeler arasında n (n-1) / 2 potansiyel bağımlılığı vardır .

Bu büyük sebep.

Sadelik değeri vardır.


2

Özyineleme yapmayı ilk nasıl öğrendiğini hatırlıyor musun? Profesör "x olan bir yönteminiz olduğunu varsayalım" dedi (örneğin, herhangi bir x için fibbonacci çözer). "X'i çözmek için, bu yöntemi x-1 ve x-2 için çağırmalısınız." Aynı bakımdan, bağımlılıkları bastırmak, var olduklarını iddia etmenize ve mevcut ünitenin yapması gerekeni yaptığını test etmenize izin verir. Kuşkusuz, bağımlılıkları titizlikle sınamakta olduğunuz varsayımıdır.

Bu aslında işyerinde SRP'dir. Testleriniz için bile tek bir sorumluluğa odaklanmak, yapmanız gereken zihinsel hokkabazlık miktarını ortadan kaldırıyor.


2

(Bu küçük bir cevaptır. Teşekkürler @TimWilliscroft.)

Hatalar daha kolaydır lokalize ise:

  • Hem test edilen ünite hem de bağımlılıklarının her biri bağımsız olarak test edilir.
  • Her test, yalnızca testin kapsadığı kodda bir hata olduğunda başarısız olur.

Bu kağıt üzerinde güzel çalışır. Bununla birlikte, OP'nin açıklamasında gösterildiği gibi (bağımlılıklar arızalı), bağımlılıklar test edilmiyorsa, hatanın yerini belirlemek zor olacaktır.


Bağımlılıklar neden test edilmedi? Muhtemelen daha düşük seviyedeler ve birim testi daha kolay. Ayrıca, belirli bir kodu kapsayan birim testleri ile hatanın yerini belirlemek daha kolaydır.
David Thornley

2

Çok iyi cevaplar. Ayrıca birkaç puan daha eklerim:

Birim testi ayrıca bağımlılıklar olmadığında kodunuzu test etmenizi sağlar . Örneğin, siz veya ekibiniz diğer katmanları henüz yazmamış veya başka bir şirket tarafından sunulan bir arayüz bekliyorsunuz.

Birim testleri ayrıca, dev makinenizde tam bir ortama sahip olmanız gerekmediği anlamına gelir (örneğin bir veritabanı, bir web sunucusu vb.). Güçlü tüm geliştiricilerin öneriyoruz yapmak nedense üretim ortamını taklit etmek mümkün değilse o üreme hatalar için, aşağı kesilmiş ancak, böyle bir ortamı var vb Ancak, daha sonra birim test en azından yu bir seviyede verir Daha büyük bir test sistemine girmeden önce kodunuza olan güveniniz.


0

Tasarım özellikleri hakkında: Küçük projelerin bile kodu test edilebilir hale getirmekten faydalandığına inanıyorum. Guice gibi bir şeyi tanıtmanız gerekmez (basit bir fabrika sınıfı sık sık yapar), ancak yapım sürecini programlama mantığından ayırmak,

  • Arayüzüyle her sınıfın bağımlılıklarını açıkça belgelemek (takımda yeni olan insanlar için çok yararlı)
  • sınıflar daha net ve kolay anlaşılır hale geliyor (çirkin nesne grafiği oluşturmayı ayrı bir sınıfa koyduğunuzda)
  • gevşek kavrama (değişiklikleri çok daha kolay hale getirir)

2
Yöntem: Evet, ancak bunun için fazladan kod ve fazladan sınıf eklemeniz gerekir. Kod hala okunurken olabildiğince kısa ve öz olmalıdır. IMHO fabrikalar ekliyor ve gerek duymadığınızı veya sağladığı esnekliğe ihtiyaç duymanızın çok muhtemel olduğunu ispatlayamazsanız, daha fazla çalışma yapmıyor.
dsimcha

0

Uh ... burada bu cevaplarda yazılı birim ve entegrasyon testlerinde iyi noktalar var!

Burada maliyetle ilgili ve pratik görüşleri özlüyorum . Çok izole / atomik birim testlerinin (belki birbirinden oldukça bağımsız ve bunları paralel olarak ve veri tabanları, dosya sistemleri vb. Gibi herhangi bir bağımlılık olmadan çalıştırma seçeneğiyle) ve (daha yüksek seviye) entegrasyon testlerinin faydasını açıkça gördüğümü söyledi. ama ... aynı zamanda bir maliyet (zaman, para, ...) ve risk meselesidir .

Bu yüzden deneyimlerimden "nasıl sınanacağını" düşünmeden önce çok daha önemli olan ( "neyin test edileceği " gibi ) başka faktörler var ...

Müşterim (dolaylı olarak) fazladan yazma ve devam ettirme sınavları için para ödüyor mu? Daha fazla test odaklı bir yaklaşım (kodu yazmadan önce testleri yazın) ortamımda gerçekten maliyet etkin midir (kod hatası riski / maliyet analizi, insanlar, tasarım özellikleri, test ortamı oluşturma)? Kod her zaman hatalıdır, ancak testi üretim kullanımına (en kötü durumda!) Taşımak daha uygun maliyetli olabilir mi?

Ayrıca, kod kalitenizin (standartların) ne olduğuna veya sizin ve ekibinizin izlediği çerçevelere, IDE'ye, tasarım ilkelerine vb. Ne kadar deneyimli olduklarına da bağlıdır. İyi yazılmış, kolayca anlaşılabilir, yeterince iyi belgelenmiş (ideal olarak kendi kendine belgeleme), modüler, ... kodu, diğerlerinden daha az hataya neden olur. Bu nedenle, gerçek "ihtiyaç", baskı veya genel bakım / hata düzeltme maliyetleri / kapsamlı testler için riskler yüksek olmayabilir.

Ekibimdeki bir iş arkadaşının önerdiği en uç noktaya gelelim, saf Java EE model katman kodumuzu, veritabanındaki ve sınıfındaki tüm sınıflar için istenen% 100 kapsam dahilinde test etmeye çalışmalıyız. Veya entegrasyon testlerinin tüm olası gerçek dünya kullanım durumlarının ve web kullanıcı iş akışlarının% 100'ünü kapsamasını isteyen yönetici, çünkü herhangi bir kullanım durumunun başarısız olma riskini almak istemiyoruz. Ancak yaklaşık 1 milyon Euro'luk sıkı bir bütçemiz var, her şeyi kodlamak için oldukça sıkı bir plan. Potansiyel uygulama hatalarının insanlar veya şirketler için çok büyük bir tehlike oluşturmayacağı bir müşteri ortamı. Bizim app dahili (bazı) önemli birim testleri, entegrasyon testleri, tasarlanmış test planları ile anahtar müşteri testleri, bir test aşaması vb ile test edilecektir. Bazı nükleer fabrika veya ilaç üretimi için bir uygulama geliştirmiyoruz!

Kendimi mümkünse test yazmaya ve kodumu test ederken geliştirmeye çalışıyorum. Ancak bunu genellikle yukarıdan aşağıya bir yaklaşımdan (entegrasyon testi) yapıyorum ve önemli testleri (genellikle model katmanında) "uygulama katmanını kesmek" için iyi bir nokta bulmaya çalışıyorum. (çünkü genellikle "katmanlar" hakkında çok şey var)

Ayrıca, birim ve entegrasyon test kodu zaman, para, bakım, kodlama vb. Üzerinde olumsuz bir etkisi olmadan gelmez. Serin ve uygulanmalıdır, ancak 5 yıllık gelişmiş testin başlangıcında veya sonrasında ortaya çıkacak etkileri göz önünde bulundurarak dikkatli ve dikkatli olunmalıdır. kodu.

Bu yüzden bunun gerçekten güvene ve maliyet / risk / fayda değerlendirmesine çok bağlı olduğunu söylerdim ... gerçek hayatta olduğu gibi,% 100 güvenlik mekanizmalarıyla koşmak istemeyeceğiniz ve koyamayacağınız yerler.

Çocuk bir yere tırmanabilir ve tırmanmalı ve düşüp kendine zarar verebilir. Yanlış yakıt doldurduğum için araba çalışmayabilir. (Geçersiz giriş :)). 3 yıl sonra zaman düğmesi durduğunda, kızarmış ekmek yanabilir. Ama hiçbir zaman, karayolu üzerinde sürmek ve müstakil direksiyonumu ellerimde tutmak istemiyorum :)

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.