CherryPy - testowanie
Testowanie to proces, podczas którego aplikacja jest prowadzona z różnych perspektyw w celu -
- Znajdź listę problemów
- Znajdź różnice między oczekiwanym a rzeczywistym wynikiem, wynikiem, stanami itp.
- Zrozum etap wdrażania.
- Znajdź aplikację przydatną do realistycznych celów.
Celem testowania nie jest spowodowanie winy programisty, ale zapewnienie narzędzi i poprawienie jakości do oszacowania kondycji aplikacji w określonym czasie.
Testowanie należy zaplanować z wyprzedzeniem. Wymaga to zdefiniowania celu testowania, zrozumienia zakresu przypadków testowych, sporządzenia listy wymagań biznesowych i świadomości ryzyka związanego z różnymi fazami projektu.
Testowanie definiuje się jako szereg aspektów, które należy zweryfikować w systemie lub aplikacji. Poniżej znajduje się lista plikówcommon test approaches -
Unit testing- Zwykle robią to sami programiści. Ma to na celu sprawdzenie, czy jednostka kodu działa zgodnie z oczekiwaniami, czy nie.
Usability testing- Deweloperzy zwykle zapominają, że piszą aplikację dla użytkowników końcowych, którzy nie mają wiedzy o systemie. Testy użyteczności weryfikują zalety i wady produktu.
Functional/Acceptance testing - Podczas gdy testy użyteczności sprawdzają, czy aplikacja lub system nadaje się do użytku, testy funkcjonalne zapewniają zaimplementowanie każdej określonej funkcjonalności.
Load and performance testing- Ma to na celu zrozumienie, czy system może dostosować się do przeprowadzanych testów obciążenia i wydajności. Może to prowadzić do zmian w sprzęcie, optymalizacji zapytań SQL itp.
Regression testing - Sprawdza, czy kolejne wydania produktu nie przerywają żadnej z wcześniejszych funkcjonalności.
Reliability and resilience testing - Testowanie niezawodności pomaga w walidacji aplikacji systemowej z awariami jednego lub kilku komponentów.
Testów jednostkowych
Aplikacje fotoblogów stale używają testów jednostkowych, aby sprawdzić następujące elementy -
- Nowe funkcjonalności działają poprawnie i zgodnie z oczekiwaniami.
- Istniejące funkcjonalności nie są przerywane przez nowe wydanie kodu.
- Usterki są naprawiane i pozostają naprawione.
Python jest dostarczany ze standardowym modułem unittest oferującym inne podejście do testów jednostkowych.
Unittest
unittest jest zakorzeniony w JUnit, pakiecie testów jednostkowych Java opracowanym przez Kenta Becka i Ericha Gamma. Testy jednostkowe po prostu zwracają zdefiniowane dane. Można zdefiniować pozorowane obiekty. Obiekty te umożliwiają testowanie w interfejsie naszego projektu bez konieczności polegania na całej aplikacji. Umożliwiają również uruchamianie testów w trybie izolacji wraz z innymi testami.
Zdefiniujmy atrapę klasy w następujący sposób -
import unittest
class DummyTest(unittest.TestCase):
def test_01_forward(self):
dummy = Dummy(right_boundary=3)
self.assertEqual(dummy.forward(), 1)
self.assertEqual(dummy.forward(), 2)
self.assertEqual(dummy.forward(), 3)
self.assertRaises(ValueError, dummy.forward)
def test_02_backward(self):
dummy = Dummy(left_boundary=-3, allow_negative=True)
self.assertEqual(dummy.backward(), -1)
self.assertEqual(dummy.backward(), -2)
self.assertEqual(dummy.backward(), -3)
self.assertRaises(ValueError, dummy.backward)
def test_03_boundaries(self):
dummy = Dummy(right_boundary=3, left_boundary=-3,allow_negative=True)
self.assertEqual(dummy.backward(), -1)
self.assertEqual(dummy.backward(), -2)
self.assertEqual(dummy.forward(), -1)
self.assertEqual(dummy.backward(), -2)
self.assertEqual(dummy.backward(), -3)
Wyjaśnienie kodu jest następujące -
Należy zaimportować moduł unittest, aby zapewnić możliwości testów jednostkowych dla danej klasy.
Klasę należy utworzyć przez podklasę unittest.
Każda metoda w powyższym kodzie zaczyna się od testu słów. Wszystkie te metody są wywoływane przez procedurę obsługi unittest.
Metody assert / fail są wywoływane przez przypadek testowy w celu zarządzania wyjątkami.
Rozważ to jako przykład do uruchomienia przypadku testowego -
if __name__ == '__main__':
unittest.main()
Wynik (dane wyjściowe) uruchomienia przypadku testowego będzie następujący -
----------------------------------------------------------------------
Ran 3 tests in 0.000s
OK
Testy funkcjonalności
Gdy funkcje aplikacji zaczną nabierać kształtu zgodnie z wymaganiami, zestaw testów funkcjonalnych może zweryfikować poprawność aplikacji w zakresie specyfikacji. Jednak test powinien zostać zautomatyzowany, aby uzyskać lepszą wydajność, co wymagałoby użycia produktów innych firm, takich jak Selenium.
CherryPy zapewnia klasę pomocniczą, taką jak wbudowane funkcje, które ułatwiają pisanie testów funkcjonalnych.
Testowanie obciążenia
W zależności od aplikacji, którą piszesz i Twoich oczekiwań co do wielkości, może być konieczne przeprowadzenie testów obciążenia i wydajności w celu wykrycia potencjalnych wąskich gardeł w aplikacji, które uniemożliwiają jej osiągnięcie określonego poziomu wydajności.
Ta sekcja nie będzie szczegółowo opisywać, jak przeprowadzić test wydajności lub obciążenia, ponieważ jest poza pakietem FunkLoad.
Bardzo podstawowy przykład FunkLoad jest następujący -
from funkload.FunkLoadTestCase
import FunkLoadTestCase
class LoadHomePage(FunkLoadTestCase):
def test_homepage(self):
server_url = self.conf_get('main', 'url')
nb_time = self.conf_getInt('test_homepage', 'nb_time')
home_page = "%s/" % server_url
for i in range(nb_time):
self.logd('Try %i' % i)
self.get(home_page, description='Get gome page')
if __name__ in ('main', '__main__'):
import unittest
unittest.main()
Oto szczegółowe wyjaśnienie powyższego kodu -
Przypadek testowy musi dziedziczyć po klasie FunkLoadTestCase, aby funkcja FunkLoad mogła wykonać swoje wewnętrzne zadanie śledzenia tego, co dzieje się podczas testu.
Nazwa klasy jest ważna, ponieważ FunkLoad będzie szukał pliku na podstawie nazwy klasy.
Zaprojektowane przypadki testowe mają bezpośredni dostęp do plików konfiguracyjnych. Metody Get () i post () są po prostu wywoływane na serwerze w celu uzyskania odpowiedzi.