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.