logo

Edge Kılıflarını Unutmayın!

Test Sürüşü Geliştirmeye Giriş (TDD)

Daha büyük bir projenin parçası olarak aşağıdaki işlevi yazmak istediğiniz bir senaryo hayal edin:

İÇİNDE Üçgenin 3 kenarının uzunluğunun değerine dayalı olarak üçgenin türünü döndüren bir fonksiyon kullanın. Giriş veri türü testinin zaten mevcut olduğunu ve bu sayede yalnızca çalışmak üzere sayısal değerler alacağınızı varsayarak işi biraz daha kolaylaştıralım.



performans testi

Durum kolay görünüyor. Devam edin ve buna benzeyen fonksiyonu yazın -

Algoritma:   

    Input :    3 numeric values  
Output : 1 string stating type of triangle
Function : triangleType (side1 side2 side3)
Start :
1. If side1 == side2 == side3
Then Return Equilateral Triangle
2. Else if side1 == side2 or side1 == side3 or side2 == side3
Then Return Isosceles Triangle
3. Else
Return Scalar Triangle
Stop

İşlevi tamamladıktan sonra gerçekleştirmeniz için size birkaç iddia verilir. Ve şaşırtıcı bir şekilde vakaların yalnızca %50'sinin geçtiğini görüyorsunuz. 

Test ifadelerine bakalım. Geçenler şunlar:
1. (String_toLowerCase(triangle_type(678))==skaler üçgen) = Doğru olup olmadığını iddia edin 
2. (String_toLowerCase(triangle_type(666))==eşkenar üçgen) = Doğru olup olmadığını iddia edin 
3. iddia(String_toLowerCase(triangle_type(676))==ikizkenar üçgen) = Doğru 
Buraya kadar işler iyi görünüyor. Ancak başarısız olanlar şunlardır:
4. (String_toLowerCase(triangle_type(000))==üçgen değil) = Yanlış olup olmadığını iddia edin 
5. (String_toLowerCase(triangle_type(-6-7-8))==üçgen değil) = Yanlış olup olmadığını iddia edin 
6. (String_toLowerCase(triangle_type(528))==üçgen değil) = Yanlış olup olmadığını iddia edin 

  • içinde 4. ifade giriş değerleri (000)'dır. Artık (000)'ın üçgen değil, nokta oluşturduğunu biliyoruz. Aslında herhangi bir giriş değeri sıfırsa üçgen mümkün değildir. Ancak bizim durumumuzda eşkenar üçgen dönecektir!
  • Ayrıca 5. ifadesi bize uzunluğun asla negatif bir değer olamayacağını hatırlatır. -30 cm uzunluğunda bir terazi görüyorsunuz. Bu nedenle, eğer elimizde bir tane bile uzunluk değeri varsa üçgen mümkün değildir. Ancak bizim durumumuzda değere bağlı olarak 3 sonuçtan herhangi birini döndürebilir. Burada bir skaler döndürür.
  • Peki ya 6. ifade. Tüm değerler >= 0'dır ve kesinlikle bir skaler üçgendir. Yoksa öyle mi? Bir üçgende herhangi 2 kenarın toplamının her zaman 3. kenardan büyük veya ona eşit olduğu kuralını unutmayın.

Burada şunu görüyoruz:  

8 + 2 > 5  
8 + 5 > 2
5 + 2 > 8

Çıkış :  

True  
True
False

Üçgenlik testinde başarısız oluyor. Dolayısıyla uzunluklar (258) bir üçgen oluşturmaz.

miras java'sı

Yani ihtiyacımız olan şey, bize sahip olduğumuz şeyin bir üçgen olup olmadığını söyleyen bir tür üçgen doğrulamadır. Çözümün bir parçası olarak şuna benzeyen başka bir fonksiyon yazıyorsunuz:

Algoritma:   

Input : 3 sides of the triangle   
Output : Boolean value: True if 3 sides form a triangle false otherwise
Function : triangleValidator(side1 side2 side3)
Start
1. If (side1 <= 0 or side2 <= 0 or side3 <= 0) and
(side2 + side3 >= side1) and
(side3 + side1 >= side2) and (side1 + side2 >= side3)
then return True
3. Return False
Stop

Önceki fonksiyonumuz artık başlangıçta 2 ekstra satır içeriyor ve Wola! şu anda tüm testler geçiyor.

Bu, üretim seviyesi kodu yazarken basit şeylerde bile dikkatli olmamız gerektiğini bize hatırlatan basit bir örnek senaryodur. Basit uç durumları akılda tutarak ve tek tip dizi durumlarını kontrol ederek test kapsamımızı artırdık ve programımızın matematiksel olarak daha doğru sonuçlar vermesini sağladık.

Yukarıdaki yaklaşımın uygulanması aşağıdadır:  

Python3
# Check if given sides form a triangle or not def triangleValidator(side1 side2  side3): if side1 <= 0 or side2 <= 0 or side3 <= 0: return False elif (side1 + side2 >= side3) and (side2 + side3 >= side1) and (side3 + side1 >= side2): return True return False # Return the type of triangle def triangleType(side1 side2 side3): # If not a triangle return 'Not a triangle' if triangleValidator(side1 side2 side3) == False: return 'Not A Triangle' # Else perform type checking if side1 == side2 == side3: return 'Equilateral Triangle' elif (side1 == side2) or (side2 == side3) or (side3 == side1): return 'Isosceles Triangle' return 'Scalar Triangle' def call(): print(triangleType(678)) print(triangleType(666)) print(triangleType(676)) print(triangleType(000)) print(triangleType(-6-7-8)) print(triangleType(528)) if __name__=='__main__': call() 
JavaScript
// Check if given sides form a triangle or not function triangleValidator(side1 side2 side3) {  if (side1 <= 0 || side2 <= 0 || side3 <= 0) {  return false;  } else if (side1 + side2 > side3 && side2 + side3 > side1 && side3 + side1 > side2) {  return true;  }  return false; } // Return the type of triangle function triangleType(side1 side2 side3) {  // If not a triangle return 'Not a triangle'  if (triangleValidator(side1 side2 side3) === false) {  return 'Not A Triangle';  }  // Else perform type checking  if (side1 === side2 && side2 === side3) {  return 'Equilateral Triangle';  } else if (side1 === side2 || side2 === side3 || side3 === side1) {  return 'Isosceles Triangle';  }  return 'Scalar Triangle'; } // Assertions console.assert(triangleType(6 7 8).toLowerCase() === 'scalar triangle'); console.assert(triangleType(6 6 6).toLowerCase() === 'equilateral triangle'); console.assert(triangleType(6 7 6).toLowerCase() === 'isosceles triangle'); console.assert(triangleType(0 0 0).toLowerCase() === 'not a triangle'); console.assert(triangleType(-6 -7 -8).toLowerCase() === 'not a triangle'); console.assert(triangleType(5 3 8).toLowerCase() === 'not a triangle'); 

Yukarıdaki program, daha önce tartışılan iddialar üzerinde test edildiğinde artık test senaryolarını geçecektir.

Sektörde köşe senaryoları bulmak ve ardından bu test senaryolarının geçtiğinden emin olmak için işlevler geliştirmek 'test odaklı geliştirme' olarak adlandırılır. Bu blog TDD'nin pratikte ne anlama geldiğine sadece bir bakış.
 

Test Oluştur