Birim testleri Citigroup'un bu pahalı hatayı önlemesine yardımcı olur mu?


86

Bu snafu hakkında bilgi okudum: Programlama hatası maliyeti Citigroup, 15 yıl boyunca test verileriyle yanlış okunan işlemlerden sonra 7 milyon dolar .

Sistem 1990'ların ortasına girdiğinde, program kodu, 089 - 100 arasında üç basamaklı dal kodları verilen işlemleri filtreledi ve bu önekleri test amacıyla kullandı.

Ancak 1998'de şirket, işini genişlettikçe alfasayısal şube kodlarını kullanmaya başladı. Bunların arasında, sistemin hariç tutulan aralıkta olduğu kabul edilen 10B, 10C ve benzeri kodlar vardı ve bu yüzden işlemleri SEC'e gönderilen raporlardan çıkarıldı.

(Bunun, açık olmayan bir veri göstergesinin kullanılmasının ... en iyi durumda olduğunu gösterdiğini düşünüyorum Branch.IsLive.

Bu bir yana, ilk tepkim "Birim testleri burada yardımcı olurdu" oldu, ama olur mu?

Geçenlerde okudum Neden çoğu birim testi ilgiyle israf oldu ve bu yüzden benim sorum şu: alfanümerik dal kodlarının girişinde başarısız olan birim testleri nasıl olurdu?



17
SEC'e ihraç edilen işlem miktarını kontrol eden bir entegrasyon testini de kaçırdıkları görülüyor. Bir ihracat özelliği oluşturursanız bu makul bir kontrol olur.
Luc Franken

31
Makalenin yazarı ünite testini anlamıyor gibi görünüyor. Bazı iddialar sadece saçmadır ( "birim testlerin herhangi bir yöntemin işlevselliğinin üç trilyonundan fazlasını test etmesi pek mümkün değildir" ), diğerleri gerileme şansını mahveder ( "bir yılda asla başarısız olmayan testlere bakar ve onları atmayı düşünün " ). Veya çalışma zamanı istisnaları için başarısız olan testleri değiştirmesi beklenen "birim testlerini iddialara dönüştür" gibi öneriler ?
Groo

25
@gnat Dış bağlantıyı okumadım ve hala bu soruyu anlamlı buldum
Jeutnarg

23
Buna değer, "Neden En Çok Birim Testinin Atık Olduğu" ndaki her şeye katılmıyorum. Bir rebuttal yazardım ama bu marj onu içeremeyecek kadar küçük.
Robert Harvey,

Yanıtlar:


19

Gerçekten, “burada birim testlerinin yardımı olur mu?” Diye mi soruyorsunuz ya da “burada muhtemelen herhangi bir testte yardımcı olabilir mi?” Diye mi soruyorsunuz?

Yardımcı olabilecek en bariz test şekli, bir kod tanımlayıcısının sadece rakamlardan oluştuğu (kodlayıcı tarafından kod yazarken kullanılan varsayımın bu olduğunu varsayarak) kodun kendisinde bir önkoşul iddiasıdır.

Bu daha sonra bir çeşit entegrasyon testinde başarısız olmuş olabilir ve yeni alfa-sayısal dal kimlikleri tanıtılır tanıtılmaz savı patlar. Ama bu bir ünite testi değil.

Alternatif olarak, SEC raporunu oluşturan prosedürün bir entegrasyon testi olabilir. Bu test, her gerçek branş tanımlayıcısının işlemlerini rapor etmesini sağlar (ve bu nedenle kullanımdaki tüm branş tanımlayıcılarının bir listesi olan gerçek dünyaya giriş gerektirir). Yani bu bir birim testi de değil.

İlgili arabirimlerin tanımlarını veya belgelerini göremiyorum, ancak ünite testlerinin , ünite arızalı olmadığı için hatayı muhtemelen tespit edemediği olabilir . Birim tanımlayıcılar sadece rakamdan oluşur bu kolu varsaymak izin verilir ve geliştiriciler kod durumda ne yapması gerektiğini bir karar vermedim Eğer vermedi, o zaman olmamalıSayısal olmayan tanımlayıcılar durumunda özel davranışları zorlamak için bir ünite testi yazınız, çünkü test, alfasayısal dal tanımlayıcılarını doğru işleyen ünitenin varsayımsal olarak geçerli bir uygulamasını reddeder ve genellikle geçerli önleyen bir ünite testi yazmak istemezsiniz. gelecekteki uygulamalar ve uzantılar. Veya belki de 40 yıl önce yazılmış bir belge (daha insan dostu bir harmanlama kuralı yerine, ham EBCDIC'deki bazı sözlükbilimsel aralıklarla), 10B'nin 089 ile 100 arasında olduğu için bir test tanımlayıcısı olduğu anlamına geliyordu. 15 yıl önce birisi gerçek bir tanımlayıcı olarak kullanmaya karar verdi, bu yüzden "hata" orijinal tanımı doğru şekilde uygulayan ünitede yatmıyor: 10B'nin bir test tanımlayıcısı olarak tanımlandığını ve bu nedenle bir şubeye atanmaması gerektiğini fark etmeyen süreçte yatmaktadır. Aynı şey, 089 - 100'ü bir test aralığı olarak tanımladıysanız ve daha sonra 10 $ veya 1.0 bir tanımlayıcı tanıtırsa, ASCII'de de olur. Sadece EBCDIC’de rakamların harflerin arkasından geldiği bir şey.

Bir birim Test (veya belki bir işlevsel test) olup makulgünü kurtarmış olabilir, yeni dal tanımlayıcıları üreten veya onaylayan birimin bir testidir. Bu test, tanımlayıcıların yalnızca rakam içermesi gerektiğini ve şube tanımlayıcılarının kullanıcılarının aynı varsayımlara izin vermesi için yazılması gerektiğini iddia eder. Veya belki de bir yerde gerçek şube tanımlayıcılarını ithal eden, ancak hiç bir zaman test olanları görmeyen ve tüm test tanımlayıcılarını reddettiğinden emin olmak için test edilebilecek bir ünite vardır (tanımlayıcılar yalnızca üç karakter ise hepsini sıralayabiliriz ve davranışını karşılaştırabiliriz. Eşleştirilmelerini sağlamak için test filtresinin kontrol edicisinin doğrulayıcısıdır; Sonra birileri kuralları değiştirdiğinde, yeni test edilen davranışla çelişen ünite testi başarısız olmuş olacaktı.

Test iyi bir sebepten dolayı yapıldığı için, değişen iş gereklilikleri nedeniyle kaldırmanız gereken nokta, birisinin işi alması için bir fırsat haline gelir, "istediğimiz davranışa dayanan her yerde kodu bulmak değişiklik". Elbette bu zor ve dolayısıyla güvenilmezdir, bu nedenle hiçbir şekilde günü kurtarmayı garanti etmez. Ancak, varsayımlarınızı mülk edindiğiniz birimlerin testlerinde yakalarsanız, kendinize bir şans verdiniz ve bu yüzden çaba tamamen boşa gitmedi.

Tabii ki, ünite ilk olarak "komik şekilli" bir girdiyle tanımlanmamışsa, test edilecek bir şey olmayacağına katılıyorum. Fiddly ad alanı bölümlerinin düzgün bir şekilde test edilmesi zor olabilir, çünkü komik tanımınızı uygulamada zorluk yatmaz, herkesin komik tanımınıza anlamasını ve saygı duymasını sağlar. Bu bir kod biriminin yerel bir özelliği değil. Ayrıca, bazı veri türlerinin "bir dize dizisinden" "" bir alfanümerik diziden "olarak değiştirilmesi, ASCII tabanlı bir programın Unicode ile çalışmasını sağlamaya benzer: kodunuz asıl tanımına yoğun bir şekilde bağlıysa ve ne zaman veri tipi, programın yaptığı şey için temeldir ve daha sonra yoğun bir şekilde bağlanır.

büyük ölçüde boşa harcanan çaba olduğunu düşünmek biraz rahatsız edici

Birim testleriniz bazen başarısız oluyorsa (örneğin, yeniden yönlendirme yaparken) ve bunu yaparken size yararlı bilgiler verin (örneğin, değişikliğiniz yanlış), o zaman çaba boşa gitmedi. Yapmadıkları, sisteminizin çalışıp çalışmadığını test etmektir. Bu nedenle , işlevsel ve entegrasyon testlerine sahip olmak yerine ünite testleri yazıyorsanız , zamanınızı en iyi şekilde kullanıyor olabilirsiniz.


İddialar iyi!

3
@nocomprende: Reagan'ın yaptığı gibi, "güven, ama doğrula".
Steve Jessop,

1
Ayrıca "Birim kötü test ediyor!" Diyecektim. ama insanların çoğunun Hayvan Çiftliği referansını özleyeceğini ve söylediklerimi düşünmek yerine aslında beni eleştirmeye başlayacağını düşündüm (diz sersemletici tepkiler etkisizdir), ama bunu söylemedim. Belki de daha zeki ve daha fazla bilgiliğe sahip bir insan bu noktayı ortaya koyabilir.

2
"Tüm testler geçiyor, ancak bazı testler diğerlerinden daha fazla geçiyor!"
Graham,

1
Test kırmızı bir ringa balığıdır. Bu adamlar "şube kodunun" nasıl tanımlandığını bilmiyorlardı. Bu, ABD Posta Ofisi'nin 4 basamak eklediğinde posta kodunun tanımını değiştirdiğini bilmemesine benzer.
radarbob

120

Birim testleri, şube kodları 10B ve 10C'nin "test branşları" olarak yanlış bir şekilde sınıflandırıldığını tespit etmiş olabilir, ancak bu branş sınıflandırması için yapılan testlerin bu hatayı yakalayacak kadar kapsamlı olamayacağını düşünüyorum.

Öte yandan, oluşturulan raporların nokta kontrolleri, dallı 10B ve 10C'nin, hatanın şimdi kalmasına izin verilen 15 yıldan daha kısa bir süre içinde raporlardan sürekli olarak eksik olduğunu ortaya çıkarabilirdi.

Son olarak, bu, test verilerini gerçek üretim verileriyle tek bir veritabanında karıştırmanın neden kötü bir fikir olduğunu göstermektedir. Test verilerini içeren ayrı bir veritabanı kullanmışlarsa, resmi raporlardan filtrelemeye gerek kalmayacak ve fazla filtrelemek imkansız olacaktı.


80
+1 Birim testleri kötü tasarım kararlarını asla telafi edemez (karıştırma testi ve gerçek veriler gibi)
Jeutnarg

5
Test verilerinin gerçek verilerle karıştırılmasından kaçınmak en iyisi olsa da, eğer gerçek verilerin değiştirilmesini gerektiriyorsa, bir üretim sistemini doğrulamak zor olabilir. Örneğin, üretimdeki banka hesaplarını değiştirerek bir bankacılık sistemini doğrulamak kötü bir fikirdir. Anlamı belirlemek için kod aralıklarını kullanmak sorunludur. Kayıtların daha açık bir niteliği muhtemelen daha iyi bir seçim olabilirdi.
JimmyJames

4
@Voo Gerçek, konuşlandırılmış üretim sisteminin test edilmesinin faydalı veya gerekli olduğu düşünüldüğünde, bir karmaşıklık düzeyi veya güvenilirlik gereksinimi olduğu konusunda kesin bir varsayım olduğunu düşünüyorum. (Yanlış bir yapılandırma değişkeni nedeniyle ne kadar yanlış gidebileceğini düşünün.) Bunun büyük bir finansal kurum için geçerli olduğunu görebiliyorum.
jpmc26

4
@Voo Test hakkında konuşmuyorum. Sistemin doğrulanmasından bahsediyorum. Gerçek bir üretim sisteminde, kod ile ilgisi olmayan başarısızlığın birçok yolu vardır. Üretime yeni bir bankacılık sistemi koyuyorsanız, db veya ağda vb. İşlemlerin hesaplara uygulanmasını engelleyen bir sorun olabilir. Hiçbir zaman bir bankada çalışmamıştım ama sahte hesaplarla gerçek hesapları değiştirmeye başladığına eminim. Böylece, ya sahte hesaplar hazırlar ya da bekler ve dua edersin.
JimmyJames

12
@JimmyJames Sağlık hizmetlerinde, mümkün olduğu kadar gerçek olan veriler üzerinde test yapmak için üretim veritabanını düzenli aralıklarla üretim veritabanını test ortamına kopyalamak yaygındır; Bir bankanın da aynısını yapabileceğini düşünüyorum.
dj18

75

Yazılım belirli iş kurallarına uymak zorundaydı. Birim testleri olsaydı, birim testleri, yazılımın iş kurallarını doğru bir şekilde işleme koyduğunu kontrol ederdi.

İş kuralları değişti.

Görünüşe göre kimse iş kurallarının değiştiğini farketmedi ve hiç kimse yeni iş kurallarını uygulamak için yazılımı değiştirmedi. Birim testleri olsaydı, bu birim testleri değiştirilmeliydi, ama kimse bunu yapmazdı çünkü kimse iş kurallarının değiştiğini fark etmedi.

Yani hayır, birim testleri bunu yakalamazdı.

Bunun istisnası, birim testlerinin ve yazılımın bağımsız ekipler tarafından oluşturulmuş olması ve birim testlerini yapan ekibin yeni iş kurallarını uygulamak için testleri değiştirip değiştirmemesiydi. Sonra birim testleri başarısız olmuş ve umarım yazılımın değişmesine neden olmuş olabilir.

Elbette aynı durumda ünite testlerinde değil, sadece yazılım değiştirildiyse, ünite testlerinde de başarısız olur. Bir birim testi başarısız olduğunda, yazılımın yanlış olduğu anlamına gelmez, yazılım veya birim testinin (bazen her ikisi de) yanlış olduğu anlamına gelir.


2
Birinin kod üzerinde, diğerinin "birim" testlerinde çalıştığı farklı ekiplere sahip olmak mümkün müdür? Bu nasıl mümkün olabilir? ... Her zaman kodumu tekrar gözden geçiriyorum.
Sergio,

2
@Sergio, bir bakış açısıyla, davranışları korurken yeniden yapılanma davranışını değiştirirken, yani davranışları koruyacak şekilde yazılırsa, test davranışları içsellerine güvenmeden test edecek şekilde yazılırsa, güncelleştirmeye gerek kalmaz.
Daenyth

1
Bunun birkaç kez olduğunu gördüm. Yazılım hiçbir şikayette bulunmadan üretime giriyor, sonra ani kullanıcılar artık artık çalışmadığı ve yıllar içinde yavaş yavaş başarısız olduğu şikayetleriyle patlıyor. Standart bildirim sürecini
Brian Knoblauch

42
“Değişen iş kuralları” kritik gözlemdir. Birim testler mantığını uygulamaya doğrulamak şu an uygulamakta düşünce senin mantık değildi o, doğru .
Ryan Cavanaugh

5
Ne olduğu konusunda haklıysam, bunu yakalamak için birim testlerinin yapılması muhtemel değildir. Testleri seçmek için temel ilke bazı "iyi" durumları, bazı "kötü" durumları ve sınırları sınırlayan durumları test etmektir. Bu durumda, "099", "100" ve "101" i test edersiniz. "10B", eski sistemde "sayıları reddet" testleriyle kaplandığından ve yeni sistemde 101'den (ve bu şekilde test edilerek) kaplandığından, test etmek için hiçbir neden yoktur - bunun dışında EBCDIC, "10B", "099" ile "100" arasında değişir.
Mark

29

Hayır. Bu, ünite testleriyle ilgili en büyük sorunlardan biri: sizi yanlış bir güvenlik duygusuna kaptırıyorlar.

Tüm testleriniz başarılı olursa, sisteminizin doğru çalıştığı anlamına gelmez; Bu, tüm testlerin geçtiği anlamına gelir . Bu, tasarımınızın bilinçli olarak düşündüğünüz ve testler yazdığınız bölümlerinin, bilinçli olarak düşündüğünüz gibi çalıştığı, ki bu gerçekten de çok büyük bir şey değil: gerçekten dikkat ettiğiniz şeylerdi. Her neyse, doğru şekilde yapmış olmanız çok muhtemel! Fakat bunun gibi asla düşünmediğiniz davaları yakalamak için hiçbir şey yapmaz, çünkü onlar için bir test yazmayı asla düşünmediniz. (Ve eğer olsaydı, bunun kod değişikliklerinin gerekli olduğu anlamına geldiğini ve onları değiştireceğini biliyordunuz.)


17
Babam bana şunu sorardı: Neden düşünmediğiniz bir şey hakkında düşünmediniz? (“Bilmiyorsan sor !” Diyerek kafasını karıştırırdı. ) Ama bilmediğimi nasıl bilebilirim?

7
“Tasarımınızın bilinçli olarak düşündüğünüz ve testler yazdığınız bölümlerinin, bilinçli olarak düşündüğünüz gibi çalıştığı anlamına gelir.” Kesinlikle doğru. Bu bilgi, yeniden yönlendirme yapıyorsanız veya sistemde varsayımlarınızı ihlal eden başka bir yerde bir şey değişirse paha biçilmezdir. Sahte bir güvenlik hissine kapılan geliştiriciler, ünite testinin sınırlarını anlamamaktadır, ancak ünite testini işe yaramaz bir araç yapmamaktadır.
Robert Harvey,

12
@MasonWheeler: Sizin gibi, yazar birim testinin bir şekilde programınızın çalıştığını kanıtlaması gerektiğini düşünüyor. Öyle değil. Bunu tekrar edeyim: birim sınaması, programınızın çalıştığını kanıtlamaz. Birim testi, yöntemlerin test sözleşmenizi yerine getirdiğini kanıtlar ve hepsi bu. Kağıdın geri kalan kısmı düşüyor, çünkü bu geçersiz tek öncül üzerine dayanıyor.
Robert Harvey

5
Doğal olarak, bu yanlış inancı olan geliştiriciler, ünite testi tamamen başarısız olduğunda hayal kırıklığına uğrayacak, ancak ünite testinden değil geliştiricinin hatası olduğu ve ünite testinin sağladığı gerçek değeri geçersiz kılmadığı anlaşılıyor.
Robert Harvey,

5
o_O @ ilk cümleniz. Birim testleri size yanlış bir güvenlik hissi verirken, ellerin direksiyon simidinde olması gibi kodlama, sürüş sırasında size yanlış bir güvenlik hissi verir.
djechlin

10

Hayır, mutlaka değil.

Orijinal gereksinim sayısal dal kodları kullanmaktı, bu nedenle çeşitli kodları kabul eden ve 10B gibi herhangi bir şeyi reddeden bir bileşen için bir birim testi üretilecekti. Sistem (olduğu gibi) çalışacaktı.

Daha sonra gereksinim değişmiş olacak ve kodlar güncellenecekti, ancak bu kötü verileri sağlayan birim test kodunun (şimdi iyi veriler) değiştirilmesi gerektiği anlamına geliyordu.

Şimdi, sistemi yöneten kişilerin durumun böyle olacağını bileceğini ve yeni kodları işlemek için birim testini değiştireceğini varsayıyoruz ... ancak bunun gerçekleştiğini bilselerdi, bunları kullanan kodu da değiştireceklerini biliyorlardı. Yine de kodlar .. ve bunu yapmadılar. Başlangıçta 10B kodunu reddeden bir birim testi, bu testi güncellemeyi bilmeseydiniz, çalıştırıldığında "burada her şey yolunda" mutlu bir şekilde söylerdi.

Birim testi orijinal gelişim için iyidir, ancak sistem testi için uygun değildir, özellikle de gereksinimler uzun süre unutulduktan 15 yıl sonra.

Bu tür bir durumda ihtiyaç duydukları şey, uçtan uca bir entegrasyon testidir. Çalışmayı ve verip vermeyeceğinizi görmeyi umduğunuz verileri girebileceğiniz bir veri. Birileri yeni girdi verilerinin bir rapor üretmediğini ve daha sonra daha fazla araştırma yapacağını fark etmiş olacaktı.


Noktaya bak. Ve birim testlerinde ana (sadece?) Problem. Tam olarak aynı şeyi söyleyeceğim gibi, kendi cevabımı ifade etmemi sağladım (ama muhtemelen daha da kötüsü!) :)
Orbit'teki Lightness Races,

8

Tip testi (Haskell test kütüphanesi QuickCheck ve diğer dillerden ilham alan çeşitli portlar / alternatifler tarafından örneklendiği gibi rastgele oluşturulmuş geçerli veriler kullanılarak test edicilerin test işlemi ) bu konuyu yakalamış olabilir, ünite testi neredeyse kesinlikle yapmazdı .

Bunun nedeni, şube kodlarının geçerliliği ile ilgili kuralların güncellendiğinde, doğru bir şekilde çalıştığından emin olmak için bu belirli aralıkları test etmeyi düşünmenin mümkün olmamasıdır.

Tip test kullanımda olsaydı Ancak, birileri olmalı zamanda hayata geçirildi orijinal sistem özelliklerinin bir çift, tek başka hiçbir kodları kontrol etmek tane deney dalları için özel kodlar test verisi olarak tedavi edildi olmadığını kontrol edin ve yazdım …… branş kodunun veri tipi tanımı güncellendiğinde (branş kodunda yapılan değişikliklerden herhangi birinin rakamdan sayısal olarak çalışıldığının test edilmesine olanak sağlamak için gerekli olacaktı), bu test, Yeni seri ve büyük olasılıkla arızayı tespit etmiş olacak.

Tabii ki, QuickCheck ilk 1999 yılında geliştirildi, bu yüzden bu sorunu yakalamak için çok geçti.


1
Bu özellik temelli test olarak adlandırmanın daha normal olduğunu düşünüyorum ve tabii ki bu değişiklikten sonra bile geçebilecek özellik bazlı bir test yazmak mümkün (tabii ki onu bulabilecek bir test yazma olasılığınızın düşük olduğunu düşünüyorum).
jk.

5

Ünite testinin bu problem için bir fark yaratacağından şüpheliyim. Bu tünel vizyon durumlarından biri gibi geliyor çünkü yeni şube kodlarını destekleyecek işlevsellik değiştirildi, ancak bu sistemdeki tüm alanlarda gerçekleştirilmedi.

Bir sınıf tasarlamak için birim testi kullanıyoruz. Birim testinin yeniden çalıştırılması, ancak tasarım değiştiğinde gereklidir. Belirli bir ünite değişmezse, değişmeyen ünite testleri önceden olduğu gibi aynı sonuçları verir. Birim testleri, değişikliklerin diğer birimler üzerindeki etkilerini göstermeyecektir (eğer birim testleri yazmıyorsanız).

Bu sorunu yalnızca makul bir şekilde tespit edebilirsiniz:

  • Entegrasyon testleri - ancak sistemdeki çoklu birimlerle beslenecek yeni kod biçimlerini özellikle eklemeniz gerekir (yani, yalnızca orijinal testler geçerli geçerli dalları içeriyorsa, sorunu size gösterirler)
  • Uçtan uca test - işletme eski ve yeni dal kod formatlarını içeren uçtan uca bir test yapmalıdır

Baştan sona yeterli test yaptırmamak daha endişe vericidir. SADECE veya sistem değişiklikleri için ANA testiniz olarak ünite testlerine güvenemezsiniz. Görünüşe göre yalnızca yeni desteklenen şube kodu biçimleriyle ilgili bir rapor çalıştırması gerekiyordu.


2

Çalışma zamanında yerleşik bir iddia yardımcı olabilir; Örneğin:

  1. Gibi bir işlev oluşturun bool isTestOnly(string branchCode) { ... }
  2. Hangi raporların filtreleneceğine karar vermek için bu işlevi kullanın
  3. Bir dalın bu tür dal kodu kullanılarak yaratılmadığını (yapılamadığını) doğrulamak veya iddia etmek için, dal oluşturma kodunda bu işlevi yeniden kullanın.
  4. Bu iddiayı gerçek çalışma zamanında etkinleştirin ("kodun yalnızca hata ayıklama geliştiricisi sürümü dışında optimize edilmemiş")‼

Ayrıca bakınız:


2

Bu paket servisi olan restoran hızlı başarısız olmaktır .

Kodumuz yoktur ve koda göre test dalı öneki olan veya olmayan birçok önek örneğimiz yoktur. Elimizdeki tek şey bu:

  • 089 - 100 => test dalı
  • 10B, 10C => test dalı
  • <088 => muhtemelen gerçek şubeler
  • > 100 => muhtemelen gerçek şubeler

Kodun rakamlara ve karakter dizilerine izin vermesi biraz gariptir. Tabii ki, 10B ve 10C onaltılık sayılar olarak kabul edilebilir, ancak öneklerin tümü onaltılık sayılar olarak değerlendirilirse, 10B ve 10C test aralığının dışına çıkar ve gerçek dallar olarak değerlendirilir.

Bu muhtemelen önekin bir dizge olarak kaydedildiği, ancak bazı durumlarda sayı olarak değerlendirildiği anlamına gelir. İşte düşünebildiğim en basit kod bu davranışı kopyalıyor (örnekleme amacıyla C # kullanarak):

bool IsTest(string strPrefix) {
    int iPrefix;
    if(int.TryParse(strPrefix, out iPrefix))
        return iPrefix >= 89 && iPrefix <= 100;
    return true; //here is the problem
}

İngilizce'de, dize bir sayıysa ve 89 ile 100 arasındaysa, bir sınamadır. Sayı değilse, bir testtir. Aksi halde test değildir.

Kod bu modeli takip ederse, kodun dağıtıldığı sırada hiçbir birim testi bunu yakalamazdı. İşte bazı örnek birim testleri:

assert.isFalse(IsTest("088"))
assert.isTrue(IsTest("089"))
assert.isTrue(IsTest("095"))
assert.isTrue(IsTest("100"))
assert.isFalse(IsTest("101"))
assert.isTrue(IsTest("10B")) // <--- business rule change

Birim testi "10B" nin bir test dalı olarak ele alınması gerektiğini göstermektedir. Yukarıdaki Kullanıcı @ gnasher729, iş kurallarının değiştiğini ve yukarıdaki son iddianın gösterdiği şeyin olduğunu söylüyor. Bir noktada, bu iddiaya geçmeliydim isFalse, ama olmadı. Birim testler geliştirme ve geliştirme zamanında gerçekleştirilir, ancak daha sonra hiçbir noktada gerçekleştirilmez.


Buradaki ders nedir? Kodun beklenmeyen bir girdi aldığını bildirmek için bir yola ihtiyacı var. Önekin bir sayı olmasını beklediğini vurgulayan bu kodu yazmanın alternatif bir yolu:

// Alternative A
bool TryGetIsTest(string strPrefix, out bool isTest) {
    int iPrefix;
    if(int.TryParse(strPrefix, out iPrefix)) {
        isTest = iPrefix >= 89 && iPrefix <= 100;
        return true;
    }
    isTest = true; //this is just some value that won't be read
    return false;
}

C # bilmeyenler için dönüş değeri, kodun verilen dizeden bir önek ayrıştırıp çözemediğini gösterir. Dönüş değeri doğruysa, arama kodu, şube önekinin bir test öneki olup olmadığını kontrol etmek için isTest out değişkenini kullanabilir. Dönüş değeri yanlışsa, arama kodu verilen ön ekin beklenmediğini bildirmeli ve isTest out değişkeni anlamsızdır ve dikkate alınmamalıdır.

İstisnalarla ilgili sorun yoksa, bunun yerine bunu yapabilirsiniz:

// Alternative B
bool IsTest(string strPrefix) {
    int iPrefix = int.Parse(strPrefix);
    return iPrefix >= 89 && iPrefix <= 100;
}

Bu alternatif daha basittir. Bu durumda, arama kodunun istisnayı yakalaması gerekir. Her iki durumda da, kodun, arayan kişiye bir tam sayıya dönüştürülemeyen bir strPrefix beklememesi gerektiğini bildirmesinin bir yolu olmalıdır. Bu şekilde kod hızlı bir şekilde başarısız olur ve banka SEC'yi utandırmadan sorunu hızla bulur.


1

Çok fazla cevap ve bir Dijkstra'nın teklifine bile:

Testler, böcek yokluğunu değil, varlığını gösterir.

Bu nedenle, bağlıdır. Kod doğru bir şekilde test edildiyse, büyük olasılıkla bu hata olmazdı.


-1

Buradaki bir birim testinin, sorunun ilk etapta asla bulunmamasını sağladığını düşünüyorum.

Düşünün, bool IsTestData(string branchCode)işlevi yazdınız .

Yazdığınız ilk birim testi boş ve boş bir dize olmalıdır. Sonra yanlış uzunluklu dizeler için, sonra tamsayı olmayan dizeler için.

Tüm bu testleri geçmek için işleve parametre kontrolü eklemeniz gerekir.

O zaman sadece 'iyi' verilerini test etseniz bile 001 -> 999, 10A olasılığını düşünmüyorsa, parametre kontrolü, istisnaları önlemek için alfanümerik kullanmaya başladığınızda, işlevi yeniden yazmaya zorlar.


1
Bu işe yaramazdı - işlev değişmedi ve aynı test verisine göre test başarısız olmaya başlamayacaktı. Birinin başarısız olması için testi değiştirmeyi düşünmesi gerekecekti, ancak bunu düşünmüş olsaydı, muhtemelen işlevi de değiştirmeyi düşünürlerdi.
Hulk

(Ya da belki bir şeyi özlüyorum, "parametre kontrolü" ile ne demek istediğinizi tam olarak bilmiyorum)
Hulk

İşlev basit kenar durum birim testinden geçmek için tamsayı olmayan karakter dizileri için bir istisna oluşturmak zorunda kalır. Dolayısıyla, onlar için özel bir programlama yapmadan alfasayısal dal kodlarını kullanmaya başlarsanız, üretim kodu hata verir
Ewan

Fakat işlev IsValidBranchCodebu kontrolü yapmak için bir işlev kullanmaz mıydı ? Ve bu fonksiyon muhtemelen değiştirmeye gerek kalmadan değiştirildi olurdu IsTestData? Bu nedenle, yalnızca 'iyi verileri' test ediyorsanız, test size yardımcı olmazdı. Son durum testi, başarısızlığa başlamak için şu anda geçerli olan bazı branş kodları (ve sadece hala geçersiz olanları değil) içermelidir.
Hulk,

1
Eğer kontrol IsValidCode'da ise, fonksiyon kendi açık kontrolü olmadan geçer, o zaman evet bunu kaçırmak mümkündür, ancak o zaman daha fazla test, sahte Validatörler vb. test numaraları "
Ewan
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.