Zapewnienie jakości

Dbamy o jakość

Stale doskonalimy nasz wewnętrzny system zapewnienia jakości i usprawniamy procedury w celu zapewnienia jak najwyższej jakości każdego produktu, który trafia do naszych klientów.

Nasz system zapewnienia jakości składa się z:

  • Dział Jakości (Quality Gate) - przez który przechodzą wszystkie elementy, które otrzymuje Klient. Dział Jakości musi zatwierdzić każdą nową wersję strony internetowej, stworzonego systemu czy nawet specyfikacji.
  • scenariusze testowe - opisy sekwencji testowych dla testerów Działu Jakości, prowadzone dla wszystkich dużych systemów
  • system śledzenia błędów (mantis)
  • moduły automatycznego testowania w ramach systemów (koncepcja wbudowywania jakości w tworzone oprogramowanie:
  1. testy jednostkowe uruchamiane w każdym procesie budowy - mają na celu sprawdzenie czy elementy systemu są poprawne (jUnit, PHPUnit)
  2. zautomatyzowane testy funkcjonalne uruchamiane w regularnych odstępach czasu na budowanych systemach lub stronach internetowych, symulujące rzeczywiste działania podejmowane przez użytkownika na interfejsie użytkownika (Selenium)
  • mechanizmy raportowania błędów - w przypadku wystąpienia błędu podczas testów automatycznych, wysyłane jest powiadomienie (e-mail lub sms) do wskazanych osób w celu szybkiego usunięcia błędu

Przeprowadzamy również testy wydajnościowe pozwalające na symulację zadanego obciążenia systemu, usługi lub bazy danych w określonym środowisku lokalnym lub rozproszonym (JMeter).

Najważniejszym elementem zapewnienia jakości oprogramowania jest koncepcja wbudowywania jakości w tworzone oprogramowanie. Jest ona ściśle związana z Test-Driven Development. Najpierw tworzy się mechanizmy testowania danego elementu, a następnie rozpoczyna się etap jego implementacji. Testy te są utrzymywane i uruchamiane również na późniejszych etapach rozwoju oprogramowania. Pozwala to upewnić się, że żadna z wprowadzanych zmian nie spowoduje błędów w już istniejących częściach systemu.

Kolejnym ważnym elementem zapewnienia jakości jest koncepcja ciągłej integracji. Używamy serwera ciągłej integracji, który przeprowadza kompilację/instalację, pełną konfigurację (w tym baz danych) oraz uruchamia serię automatycznych testów po potwierdzeniu każdej zmiany w repozytorium kodu. Jeśli testy wykażą jakieś nieprawidłowości, programiści muszą je naprawić. O każdym nieprawidłowym działaniu jesteśmy informowani. 

Opisane mechanizmy pozwalają nie tylko na stałą kontrolę nad jakością naszego oprogramowania, ale także na znacznie szybsze dostarczanie nowych wersji.
 

Metody i praktyki zapewniające wysoką jakość i bezpieczeństwo

⦁    SCRUM
⦁    ITIL
⦁    Praktyka ciągłej integracji
⦁    Testy funkcjonalne (ręczne i automatyczne)
⦁    Badania wydajności
⦁    Testy penetracyjne
⦁    OWASP TOP10
⦁    Nasze rozwiązania są zgodne z regulacjami przepisów Generalnego Inspektora Ochrony Danych Osobowych.

Automatyzacja procesów testowych

Manualne testy oprogramowania są monotonne i czasochłonne. Ponadto, konieczność wykonywania testów regresyjnych (sprawdzających poprawność wcześniej wykonanych funkcjonalności) przy każdej nowej funkcjonalności zwiększa obciążenie pracą testerów. Testów tych nie można pominąć, gdyż może to obniżyć jakość testowania. Dlatego też automatyzacja zadań testera wydaje się być idealnym rozwiązaniem. Pełne wdrożenie automatyzacji testów w 3e nie było prostym zadaniem i wymagało zmiany całego cyklu budowy aplikacji. Pierwsze próby obejmowały jedynie narzędzie do automatyzacji (którym w tamtym czasie było Selenium 1.0.3) i zakończyły się tylko częściowym sukcesem, ponieważ testy były trudne do zbudowania w przypadkach, gdy funkcjonalność aplikacji była bardziej skomplikowana. Ponadto, mieliśmy problemy z odtworzeniem danego stanu aplikacji. W celu rozwiązania tych problemów, zaimplementowaliśmy mechanizmy wersjonowania bazy danych. W tym celu wykorzystaliśmy pakiet dbMaintain, który w prosty sposób pomaga odtworzyć stany bazy danych od podstaw dla środowiska testowego oraz pozwala na jej aktualizację w środowiskach produkcyjnych i deweloperskich. Również nowa wersja Selenium 2 (projekt związany z biblioteką Webdriver) przyczyniła się do usprawnienia tego procesu. Należy również dodać, że nasza firma jest autorem popularnej biblioteki open-source, która umożliwia tworzenie testów w oparciu o Selenium2/Webdriver. Ostatnią rzeczą, którą musieliśmy zrobić było powiązanie wszystkiego w skrypt ant oraz skonfigurowanie serwera ciągłej integracji Hudson.

ETAP 1. POBIERANIE KODÓW ŹRÓDŁOWYCH Z REPOZYTORIUM
Wszystkie kody źródłowe przechowywane są w repozytorium kodu. Każdy programista po zakończeniu pracy wgrywa swoje zmiany do repozytorium. Dzięki temu, że serwer repozytorium wersjonuje pliki z kodem źródłowym, wiemy jakie zmiany lub uzupełnienia zostały wprowadzone do kodu źródłowego i kto ich dokonał. Proces budowania aplikacji jest zawsze oparty o aktualny kod z repozytorium. Daje to pewność, że testowana wersja jest tą właściwą i że później ta sama wersja zostanie wgrana na produkcję.

ETAP 2. WYMAZYWANIE I ODTWARZANIE BAZY DANYCH PROJEKTU TESTOWEGO
Baza danych jest dynamicznie zmieniającym się elementem systemu. Jej struktura często zmienia się w trakcie rozwoju, natomiast dane podlegają ciągłym modyfikacjom w wyniku przeprowadzanych testów. Większość testów, niezależnie od tego czy są to testy automatyczne czy manualne, do rozpoczęcia pracy wymaga pewnych danych konfigurujących system lub proces, który ma być testowany. Dlatego też przed każdym uruchomieniem testu ważne jest, aby doprowadzić bazę danych do określonego stanu zarówno w sensie aktualnych struktur, jak i danych testowych. Do tego celu służy narzędzie dbMaintain. Umożliwia ono sprawne przeprowadzenie wersjonowania struktur bazy danych oraz wgranych danych testowych. Wymusza zachowanie wszystkich plików SQL w strukturze kodu aplikacji i podczas aktualizacji wgrywa tylko wymagane skrypty. W procesie rekonstrukcji całej bazy dbMaintain najpierw ją kasuje, a następnie wgrywa oryginalne struktury oraz dane testowe i każdą aktualizację po kolei. Dzięki takiemu podejściu zawsze odzyskiwany jest ten sam, najbardziej aktualny stan bazy. Co więcej, testowane są również skrypty aktualizujące poprzednie wersje bazy danych, co jest istotne przy aktualizacji produkcyjnych baz danych.

ETAPY 3 I 4. PRZEPROWADZANIE TESTÓW AUTOMATYCZNYCH
Automatyzacja testów jest kluczową technologią, która pomaga tworzyć niezawodne aplikacje internetowe lub intranetowe. Mechanizmy autotestów, podobnie jak systemy lotnicze, sprawdzają, czy poszczególne elementy aplikacji działają i czy poprawnie współpracują ze sobą. Testy jednostkowe to mechanizmy testujące wewnętrzne komponenty systemu, natomiast testy funkcjonalne symulują rzeczywiste akcje wykonywane przez użytkowników i sprawdzają, czy wyniki tych akcji są zgodne z oczekiwaniami. Tworzone przez nas testy funkcjonalne można porównać do zaprogramowanego robota, który klikając w przeglądarkę na bieżąco sprawdza poszczególne funkcje aplikacji.

ETAPY 5 I 6.  GENEROWANIE STATYSTYK I WYSYŁANIE POWIADOMIEŃ
Z punktu widzenia kierownika projektu informatycznego istnieje wiele wskaźników, które pomagają określić poziom realizacji projektu oraz potencjalną niezawodność budowanej aplikacji. Wskaźnikami tymi są:
⦁    statystyka ilości testów automatycznych (ile było pozytywnych, ile nieudanych, czy ilość nieudanych testów stopniowo maleje wraz z postępem wdrożenia),
⦁    procentowe określenie, jak duża część kodu źródłowego została pokryta testami jednostkowymi (można sprawdzić, które fragmenty kodu są wykorzystywane podczas uruchamiania testów automatycznych; generalnie im większa część kodów źródłowych jest poddawana tym testom, tym mniejsze prawdopodobieństwo wystąpienia w nich błędów; oczywiście nie wyklucza to testowania ręcznego),
⦁    poziom udokumentowania kodu źródłowego (wskaźnik procentowy pokazujący ile klas lub metod w kodzie źródłowym posiada komentarze).

W 3e Software House wykorzystaliśmy wszystkie wyżej wymienione techniki, aby tworzone przez nas oprogramowanie było najwyższej jakości, a nasi Klienci mogli polegać na dostarczanych przez nas aplikacjach.