İplik Uygulamalarını Test Etme

Bu bölümde, iş parçacığı uygulamalarının test edilmesini öğreneceğiz. Ayrıca test etmenin önemini de öğreneceğiz.

Neden Test Edilmeli?

Test etmenin önemi hakkındaki tartışmaya girmeden önce, testin ne olduğunu bilmemiz gerekir. Genel anlamda test, bir şeyin ne kadar iyi çalıştığını bulmanın bir tekniğidir. Öte yandan, özellikle bilgisayar programları veya yazılımları hakkında konuşursak, test, bir yazılım programının işlevselliğine erişme tekniğidir.

Bu bölümde, yazılım testinin önemini tartışacağız. Yazılım geliştirmede, yazılımın istemciye yayınlanmasından önce iki kez kontrol edilmelidir. Bu nedenle yazılımı deneyimli test ekibi tarafından test etmek çok önemlidir. Yazılım testinin önemini anlamak için aşağıdaki noktaları göz önünde bulundurun -

Yazılım kalitesinin iyileştirilmesi

Elbette hiçbir şirket düşük kaliteli yazılım sunmak istemez ve hiçbir müşteri düşük kaliteli yazılım satın almak istemez. Test, içindeki hataları bulup düzelterek yazılımın kalitesini artırır.

Müşteri memnuniyeti

Herhangi bir işin en önemli kısmı müşterilerinin memnuniyetidir. Firmalar hatasız ve kaliteli yazılımlar sunarak müşteri memnuniyetini sağlayabilir.

Yeni özelliklerin etkisini azaltın

10000 satırlık bir yazılım sistemi yaptığımızı ve yeni bir özellik eklememiz gerektiğini varsayalım, o zaman geliştirme ekibi bu yeni özelliğin tüm yazılım üzerindeki etkisi hakkında endişelenecektir. Burada da testler hayati bir rol oynar çünkü eğer test ekibi iyi bir test paketi yapmışsa, bizi herhangi bir olası felaket kırılmasından kurtarabilir.

Kullanıcı deneyimi

Herhangi bir işin bir diğer en önemli kısmı, o ürünü kullananların deneyimidir. Yalnızca test, son kullanıcının ürünü kullanmayı basit ve kolay bulmasını sağlayabilir.

Giderleri azaltmak

Test, teslimattan sonra düzeltmek yerine geliştirmenin test aşamasında hataları bularak ve düzelterek yazılımın toplam maliyetini düşürebilir. Yazılımın tesliminden sonra büyük bir hata varsa, o zaman maddi maliyetini giderler ve maddi olmayan maliyetler, müşteri memnuniyetsizliği, şirketin olumsuz itibarı vb.

Ne Test Edilecek?

Her zaman neyin test edileceğine dair uygun bilgiye sahip olunması önerilir. Bu bölümde, herhangi bir yazılımı test ederken önce test cihazının ana nedeni olduğunu anlayacağız. Kod kapsamı, yani test paketimizin test sırasında kaç satır kodla karşılaştığından kaçınılmalıdır. Bunun nedeni, test sırasında yalnızca kod satırlarının sayısına odaklanmak sistemimize gerçek bir değer katmamaktadır. Daha sonraki bir aşamada konuşlandırmadan sonra bile yansıyan bazı hatalar kalabilir.

Neyin test edileceğiyle ilgili aşağıdaki önemli noktaları göz önünde bulundurun:

  • Kod kapsamı yerine kodun işlevselliğini test etmeye odaklanmalıyız.

  • Önce kodun en önemli kısımlarını test etmemiz ve ardından kodun daha az önemli kısımlarına geçmemiz gerekiyor. Kesinlikle zaman kazandıracak.

  • Test cihazı, yazılımı sınırlarına kadar zorlayabilecek çok sayıda farklı teste sahip olmalıdır.

Eşzamanlı yazılım programlarını test etme yaklaşımları

Çok çekirdekli mimarinin gerçek kapasitesini kullanma yeteneği nedeniyle, eşzamanlı yazılım sistemleri sıralı sistemlerin yerini alıyor. Son zamanlarda cep telefonlarından çamaşır makinelerine, arabalardan uçaklara vb. Her şeyde eşzamanlı sistem programları kullanılıyor. zaten bir hata varsa, birden fazla hatayla sonuçlanırdık.

Eşzamanlı yazılım programları için test teknikleri, yarış koşulları, kilitlenmeler ve atomiklik ihlali gibi potansiyel olarak zararlı modelleri ortaya çıkaran serpiştirmeyi seçmeye yoğun bir şekilde odaklanmaktadır. Eşzamanlı yazılım programlarını test etmek için iki yaklaşım aşağıda verilmiştir:

Sistematik keşif

Bu yaklaşım, serpiştirmelerin alanını olabildiğince geniş bir şekilde keşfetmeyi amaçlamaktadır. Bu tür yaklaşımlar, bir kaba kuvvet tekniğini benimseyebilir ve diğerleri, harmanlamaların alanını keşfetmek için kısmi düzen azaltma tekniğini veya sezgisel tekniği benimser.

Mülkiyet odaklı

Mülkiyet odaklı yaklaşımlar, eşzamanlılık hatalarının şüpheli bellek erişim modeli gibi belirli özellikleri açığa çıkaran serpiştirmeler altında ortaya çıkma olasılığının daha yüksek olduğu gözlemine dayanır. Farklı mülkiyet odaklı yaklaşımlar, yarış koşulları, kilitlenmeler ve atomikliğin ihlali gibi farklı hataları hedefler ve bunlar ayrıca bir veya diğer belirli özelliklere bağlıdır.

Test Stratejileri

Test Stratejisi, test yaklaşımı olarak da bilinir. Strateji, testin nasıl yürütüleceğini tanımlar. Test yaklaşımının iki tekniği vardır -

Proaktif

Derleme oluşturulmadan önce hataları bulmak ve düzeltmek için test tasarım sürecinin olabildiğince erken başlatıldığı bir yaklaşım.

Reaktif

Geliştirme süreci tamamlanana kadar testin başlamadığı bir yaklaşım.

Python programına herhangi bir test stratejisi veya yaklaşımı uygulamadan önce, bir yazılım programının sahip olabileceği hatalar hakkında temel bir fikre sahip olmamız gerekir. Hatalar aşağıdaki gibidir -

Sözdizimsel hatalar

Program geliştirme sırasında çok sayıda küçük hata olabilir. Hatalar çoğunlukla yazım hatalarından kaynaklanmaktadır. Örneğin, eksik iki nokta üst üste veya bir anahtar kelimenin yanlış yazımı vb. Bu tür hatalar, mantıkta değil program sözdizimindeki hatadan kaynaklanır. Bu nedenle, bu hatalara sözdizimsel hatalar denir.

Anlamsal hatalar

Anlamsal hatalara mantıksal hatalar da denir. Yazılım programında mantıksal veya anlamsal bir hata varsa, ifade doğru bir şekilde derlenecek ve çalışacaktır ancak mantık doğru olmadığı için istenen çıktıyı vermeyecektir.

Birim Testi

Bu, python programlarını test etmek için en çok kullanılan test stratejilerinden biridir. Bu strateji, kodun birimlerini veya bileşenlerini test etmek için kullanılır. Birimler veya bileşenler derken, kodun sınıflarını veya işlevlerini kastediyoruz. Birim testi, "küçük" birimleri test ederek büyük programlama sistemlerinin testini basitleştirir. Yukarıdaki konseptin yardımıyla, birim testi, istenen çıktıyı döndürüp döndürmediklerini belirlemek için tek tek kaynak kod birimlerinin test edildiği bir yöntem olarak tanımlanabilir.

Sonraki bölümlerimizde, birim testi için farklı Python modülleri hakkında bilgi edineceğiz.

unittest modülü

Birim testi için ilk modül, birim testi modülüdür. JUnit'ten esinlenmiştir ve varsayılan olarak Python3.6'ya dahildir. Test otomasyonunu, testler için kurulum ve kapatma kodunun paylaşılmasını, testlerin koleksiyonlarda toplanmasını ve testlerin raporlama çerçevesinden bağımsızlığını destekler.

Aşağıda, unittest modülü tarafından desteklenen birkaç önemli kavram yer almaktadır.

Metin fikstürü

Teste başlamadan önce çalıştırılabilmesi ve test bittikten sonra yırtılabilmesi için bir test kurmak için kullanılır. Teste başlamadan önce ihtiyaç duyulan geçici veritabanı, dizin vb. Oluşturulmasını içerebilir.

Test durumu

Test senaryosu, belirli bir girdi setinden gerekli bir yanıtın gelip gelmediğini kontrol eder. Unittest modülü, yeni test senaryoları oluşturmak için kullanılabilen TestCase adlı bir temel sınıf içerir. Varsayılan olarak iki yöntem içerir -

  • setUp()- egzersiz yapmadan önce test fikstürünü kurmak için bir kanca yöntemi. Bu, uygulanan test yöntemleri çağrılmadan önce çağrılır.

  • tearDown( - sınıftaki tüm testleri çalıştırdıktan sonra sınıf fikstürünü yeniden yapılandırmak için bir kanca yöntemi.

Test odası

Test paketleri, test senaryoları veya her ikisinden oluşan bir koleksiyondur.

Test koşucusu

Test senaryolarının veya giysilerinin çalışmasını kontrol eder ve sonucu kullanıcıya sağlar. Sonucu sağlamak için GUI veya basit metin arabirimi kullanabilir.

Example

Aşağıdaki Python programı, adlı bir modülü test etmek için unittest modülünü kullanır. Fibonacci. Program, bir sayının Fibonacci serisinin hesaplanmasına yardımcı olur. Bu örnekte, farklı yöntemler kullanarak test senaryolarını tanımlamak için Fibo_test adlı bir sınıf oluşturduk. Bu yöntemler, unittest.TestCase'den miras alınır. Varsayılan olarak iki yöntem kullanıyoruz - setUp () ve tearDown (). Ayrıca testfibocal yöntemini de tanımlıyoruz. Testin adı harf testi ile başlamalıdır. Son blokta, unittest.main () test betiğine bir komut satırı arabirimi sağlar.

import unittest
def fibonacci(n):
   a, b = 0, 1
   for i in range(n):
   a, b = b, a + b
   return a
class Fibo_Test(unittest.TestCase):
   def setUp(self):
   print("This is run before our tests would be executed")
   def tearDown(self):
   print("This is run after the completion of execution of our tests")

   def testfibocal(self):
   self.assertEqual(fib(0), 0)
   self.assertEqual(fib(1), 1)
   self.assertEqual(fib(5), 5)
   self.assertEqual(fib(10), 55)
   self.assertEqual(fib(20), 6765)

if __name__ == "__main__":
   unittest.main()

Komut satırından çalıştırıldığında, yukarıdaki komut dosyası şuna benzer bir çıktı üretir -

Çıktı

This runs before our tests would be executed.
This runs after the completion of execution of our tests.
.
----------------------------------------------------------------------
Ran 1 test in 0.006s
OK

Şimdi, daha net hale getirmek için, Fibonacci modülünün tanımlanmasına yardımcı olan kodumuzu değiştiriyoruz.

Aşağıdaki kod bloğunu bir örnek olarak düşünün -

def fibonacci(n):
   a, b = 0, 1
   for i in range(n):
   a, b = b, a + b
   return a

Aşağıda gösterildiği gibi kod bloğunda birkaç değişiklik yapılmıştır -

def fibonacci(n):
   a, b = 1, 1
   for i in range(n):
   a, b = b, a + b
   return a

Şimdi, betiği değiştirilen kodla çalıştırdıktan sonra, aşağıdaki çıktıyı alacağız -

This runs before our tests would be executed.
This runs after the completion of execution of our tests.
F
======================================================================
FAIL: testCalculation (__main__.Fibo_Test)
----------------------------------------------------------------------
Traceback (most recent call last):
File "unitg.py", line 15, in testCalculation
self.assertEqual(fib(0), 0)
AssertionError: 1 != 0
----------------------------------------------------------------------
Ran 1 test in 0.007s

FAILED (failures = 1)

Yukarıdaki çıktı, modülün istenen çıktıyı veremediğini gösterir.

Docktest modülü

Docktest modülü ayrıca birim testinde yardımcı olur. Ayrıca python ile önceden paketlenmiş olarak gelir. Birim test modülüne göre kullanımı daha kolaydır. Unittest modülü karmaşık testler için daha uygundur. Doctest modülünü kullanmak için onu içe aktarmamız gerekiyor. Karşılık gelen işlevin docstring'i, çıktılarıyla birlikte etkileşimli python oturumuna sahip olmalıdır.

Kodumuzda her şey yolundaysa, docktest modülünden hiçbir çıktı alınmayacaktır; aksi takdirde çıktı sağlayacaktır.

Misal

Aşağıdaki Python örneği, bir sayının Fibonacci serisini hesaplamaya yardımcı olan Fibonacci adlı bir modülü test etmek için docktest modülünü kullanır.

import doctest
def fibonacci(n):
   """
   Calculates the Fibonacci number

   >>> fibonacci(0)
   0
   >>> fibonacci(1)
   1
   >>> fibonacci(10)
   55
   >>> fibonacci(20)
   6765
   >>>

   """
   a, b = 1, 1
   for i in range(n):
   a, b = b, a + b
   return a
      if __name__ == "__main__":
   doctest.testmod()

Fib adlı ilgili fonksiyonun docstringinin çıktılarla birlikte etkileşimli python oturumuna sahip olduğunu görebiliriz. Kodumuz iyi ise, doctest modülünden hiçbir çıktı alınamayacaktır. Ancak nasıl çalıştığını görmek için -v seçeneğiyle çalıştırabiliriz.

(base) D:\ProgramData>python dock_test.py -v
Trying:
   fibonacci(0)
Expecting:
   0
ok
Trying:
   fibonacci(1)
Expecting:
   1
ok
Trying:
   fibonacci(10)
Expecting:
   55
ok
Trying:
   fibonacci(20)
Expecting:
   6765
ok
1 items had no tests:
   __main__
1 items passed all tests:
4 tests in __main__.fibonacci
4 tests in 2 items.
4 passed and 0 failed.
Test passed.

Şimdi, Fibonacci modülünün tanımlanmasına yardımcı olan kodu değiştireceğiz

Aşağıdaki kod bloğunu bir örnek olarak düşünün -

def fibonacci(n):
   a, b = 0, 1
   for i in range(n):
   a, b = b, a + b
   return a

Aşağıdaki kod bloğu değişikliklere yardımcı olur -

def fibonacci(n):
   a, b = 1, 1
   for i in range(n):
   a, b = b, a + b
   return a

Betiği –v seçeneği olmadan bile değiştirilen kodla çalıştırdıktan sonra, çıktıyı aşağıda gösterildiği gibi alacağız.

Çıktı

(base) D:\ProgramData>python dock_test.py
**********************************************************************
File "unitg.py", line 6, in __main__.fibonacci
Failed example:
   fibonacci(0)
Expected:
   0
Got:
   1
**********************************************************************
File "unitg.py", line 10, in __main__.fibonacci
Failed example:
   fibonacci(10)
Expected:
   55
Got:
   89
**********************************************************************
File "unitg.py", line 12, in __main__.fibonacci
Failed example:
   fibonacci(20)
Expected:
   6765
Got:
   10946
**********************************************************************
1 items had failures:
   3 of 4 in __main__.fibonacci
***Test Failed*** 3 failures.

Yukarıdaki çıktıda üç testin başarısız olduğunu görebiliyoruz.