PODOBAŁ CI SIĘ TEN ARTYKUŁ?
Sprawdź podobne teksty
Jeśli przygotowujesz się do egzaminu ISTQB z pewnością trafisz na tematykę testowania opartego na strukturze. W dużym uogólnieniu opiera się ono na testowaniu przepływu sterowania i przepływu danych. Przykładowo, dla testowania przepływu sterowania poziomu podstawowego sylabusa, tester będzie sprawdzał instrukcje i decyzje, a dla poziomu zaawansowanego warunki, warunki w decyzjach, zmodyfikowane pokrycie warunków i decyzji, wielokrotne pokrycie warunków i decyzji, testowanie ścieżek i gałęzi. Obydwie techniki wiążą się z projektowaniem i analizą grafów przepływu, będzie więc wymagana przynajmniej podstawowa umiejętność czytania kodu źródłowego i rozpisania go na schematy blokowe. Z pomocą przyjdzie nam wówczas code2flow.
Na potrzeby wpisu skupimy się na podstawowym testowaniu pokrycia instrukcji i decyzji, aby pokazać możliwości aplikacji. W moim odczuciu sylabusy traktują ten temat ‘po macoszemu’, opisując go w kilku zdaniach bez odwoływania się do konkretnych przykładów. Aby więc zapoznać się z wyżej wymienionymi technikami, tester musi szukać tej wiedzy na własną rękę, czyli w książkach technicznych, prezentacjach, tutorialach. Moim celem jest pokazać, jak można ułatwić proces nauki tego zagadnienia przy użyciu narzędzia do generowania schematów blokowych. Ale najpierw słów kilka o pseudokodzie i schematach blokowych.
Pseudokod jest luźnym zapisem imitującym kod. Charakteryzuje się tym, że nie odnosi się bezpośrednio do żadnego języka programowania. Służy do opisania działania danej funkcji lub całego programu. Dobrze sformatowany i opisany pseudokod umożliwia testerowi oprogramowania stworzenie schematu blokowego, dzięki któremu łatwe będzie obliczenie takich metryk jak pokrycie instrukcji, pokrycie decyzji, czy nawet zmodyfikowanego pokrycia warunków i decyzji.
Schemat blokowy to nic innego jak wizualny zapis analizowanego fragmentu kodu/-pseudokodu. Schemat blokowy składa się z bloków instrukcji – dla różnych rodzajów instrukcji bloki mają różne kształty – oraz strzałek, które określają kolejność wykonywania tych instrukcji. Składa się z bloku początkowego, bloku końcowego, bloku wejścia / wyjścia, bloku operacji, procedury, decyzji oraz łączników i punktów koncentracji. W ramach poznawania schematów blokowych, tester oprogramowania powinien znać bloki: początkowe, końcowe, operacji, decyzji oraz punkty koncentracji. Wymagana będzie również znajomość podstawowych instrukcji warunkowych oraz pętli. Wśród nich najważniejsza będą:
If
If…then
for
do…while
while…do
SWITCH-CASE
Internet obfituje w gotowe rozwiązania, które mogą ułatwić nam naukę tworzenia schematów blokowych oraz czytania pseudokodu. Czynnikami, które brałem pod uwagę podczas swoich poszukiwań były: możliwość darmowego wypróbowania funkcji programu oraz (ewentualnie) łatwość w instalacji. Zarówno popularny Lucidchart, jak i Flowgorithm nie przekonały mnie do siebie, w pierwszym przypadku wymagając wykupienia licencji bez możliwości próbnego wykorzystania funkcji, a w drugim wymagając instalacji oprogramowania na swoim komputerze. Idealnym rozwiązaniem okazała się być internetowa aplikacja code2flow. Można ją znaleźć pod linkiem: code2flow.
Znaczącą zaletą przemawiającą za wybraniem właśnie tego narzędzia był dla mnie fakt, że nie wymaga ona od nas zainstalowania żadnego dodatkowego oprogramowania na komputerze (poza przeglądarką internetową).
Aplikacja składa się z dwóch sekcji. Pierwsza jest edytorem umożliwiającym wprowadzenie pseudokodu. Autor zadbał również o odpowiednie formatowanie tekstu oraz możliwość wpisywania składni, dzięki czemu edytor jeszcze bardziej przypomina IDE.
Możliwości aplikacji
Możliwości edytora mogą kojarzyć się z popularnym językiem znaczników Markdown. Dodatkowo, poza czystym tekstem edytor przyjmuje instrukcje:
Umożliwia również komentowanie wybranych linii za pomocą ukośników //. Takie komentarze na schemacie blokowym konwertowane są w ‘chmurki’ zawierające komentowany tekst/linie kodu.
Przydatną możliwością aplikacji może okazać się podświetlanie konkretnych linii kodu na wygenerowanym schemacie blokowym, dzięki któremu nawet osoba bez przygotowania technicznego zobaczy kod i jego wywołania w przystępnej graficznej formie. Użytkownik ma również możliwość dodatkowego dostosowania aspektów kosmetycznych utworzonego grafu w zakładce APPEARANCE oraz możliwość zapisu schematu do formatów: PDF, SVG, PNG w sekcji DOWNLOAD. Więcej możliwości samego edytora opisane zostało w sekcji HELP.
Druga sekcja jest stroną wyświetlającą wynik pseudokodu w formie schematu blokowego.
Schematy blokowe zastosowane w przykładach dalszej części wpisu są wyeksportowane za pomocą aplikacji code2flow. Aplikacja umożliwia również dostosowanie formatu wyświetlanego schematu blokowego oraz jego wydrukowanie. Co ciekawe, istnieje również wersja aplikacji, która integruje się z Jirą, oprogramowaniem do śledzenia błędów i zarządzania projektami. Dla zainteresowanych wypróbowaniem lub wdrożeniem narzędzia do swojego projektu w narzędziu Jira, umieszczam link do Atlassian Marketplace. Jak proces generowania schematu z pseudokodu wygląda w praktyce? Przykłady przedstawię poniżej.
Pokrycie instrukcji oblicza się przez podzielenie liczby wykonywalnych instrukcji pokrytych przez (zaprojektowane lub wykonane) przypadki testowe, przez liczbę wszystkich wykonywalnych instrukcji w testowanym kodzie. Przepływ powinien przejść przez wszystkie bloki instrukcji pseudokodu najkrótszą drogą.
int a,b
if (a > 0) {
printf ("a jest dodatnia");
}
if (b > 0) {
printf ("dodatnia");
}
end
Aby pokryć wszystkie instrukcje tego pseudokodu, wymagany będzie jeden przypadek testowy. Przepływ oznaczono kolorem czerwonym. Dzięki takiemu wizualnemu zapisowi widzimy wszystkie bloki instrukcji zawarte we fragmencie pseudokodu (niebieskie prostokąty).
int a, b, c, d;
if (a > 0) {
printf ("a jest dodatnia");
if (c==0) {
printf ("c jest równe 0");
}
} else {
printf ("a nie jest dodatnia");
}if (b > 0) {
printf ("b jest dodatnia");
if (d==0) {
printf ("d jest równe 0");}
} else {
printf ("b nie jest dodatnia");
}
end
Aby w pełni pokryć instrukcje w pseudokodzie, wymagane będą dwa przypadki testowe. Pierwszy przepływ oznaczono kolorem czerwonym i obejmuje on bloki instrukcji dla warunków True, drugi zaś kolorem niebieskim i obejmuje on bloki instrukcji dla warunków False.
Uwaga: Wyjątkiem tutaj są warunki False dla (c==0) orac (d==0), które nie posiadają bloków instrukcji.
int x, a;
while (x <=a) {
printf ("x nie jest większe od a");
x = x+1;
}
printf ("x jest większe od a");
end
Aby w pełni pokryć instrukcje w pseudokodzie, wymagany będzie jeden przypadek testowy. Pętla wykonywana jest jednorazowo. Jej wykonanie pozwala w pełni pokryć wszystkie bloki instrukcji za jednym przejściem (kolor czerwony).
Pokrycie decyzji, spokrewnione z testowaniem gałęzi, polega na zmierzeniu jaki odsetek wyników decyzji (np. wyniku prawda lub fałsz instrukcji if) został przetestowany przez zestaw testów. W technice testowania decyzji projektuje się przypadki testowe tak, aby pokryć określone wyniki decyzji. Jest wyliczane przez podzielenie liczby wyników decyzji pokrytych przez (zaprojektowane lub wykonane) przypadki testowe przez liczbę wszystkich wyników decyzji znajdujących się w testowanym kodzie.
Testowanie decyzji jest jedną z form testowania przepływu sterowania, ponieważ podąża za konkretnym przepływem sterowania przez punkty decyzyjne. Pokrycie decyzji jest mocniejsze niż pokrycie instrukcji. 100% pokrycia decyzji gwarantuje 100% pokrycia instrukcji, ale nie odwrotnie. Widać to wyraźnie w przykładach poniżej, gdzie podczas testowania decyzji brane są pod uwagę wszystkie bloki instrukcji.
int a,b;
if (a > 0) {
printf ("a jest dodatnia");
}
if (b > 0) {printf ("b jest dodatnia");
}
end
Do pełnego pokrycia decyzji będą wymagane dwa przypadki testowe. Pierwszy przypadek testowy pokrywa wszystkie bloki instrukcji (kolor czerwony) dla warunków True, a drugi przypadek testowy pokrywa warunki False dla decyzji (kolor niebieski).
int a, b, c, d;
if (a > 0) {
printf ("a jest dodatnia");
if (c==0) {
printf ("c jest równe 0");
}
} else {
printf ("a nie jest dodatnia");
}
if (b > 0) {
printf ("b jest dodatnia");
if (d==0) {printf ("d jest równe 0");
}
} else {
printf ("b nie jest dodatnia");
}
end
Do pełnego pokrycia decyzji będą wymagane trzy przypadki testowe. Pierwszy przepływ (kolor czerwony) pokrywa wszystkie bloki instrukcji i warunki True dla decyzji. Drugi przepływ (kolor niebieski) pokrywa wszystkie bloki instrukcji dla warunku False, z wyłączeniem warunku False dla instrukcji (c==0) i (d==0), które nie mają bloków instrukcji. Trzeci przypadek testowy pokrywa wspomniane warunki False dla instrukcji (c==0) i (d==0) (kolor żółty).
int x, a;
while (x <=a) {
printf ("x nie jest więsze od a");
x = x+1;
}
printf ("x jest więsze od a");
end
Podobnie jak w przypadku testowania instrukcji, przez pętle poruszamy się jednokrotnie, a więc dla wymienionego przypadku wymagany będzie jeden przypadek testowy (kolor czerwony). W przypadku, kiedy pętla byłaby zagnieżdżona w warunku wielokrotnego wyboru jak SWITCH-CASE, liczba przypadków testowych wymaganych do pokrycia decyzji wzrośnie.
Podsumowując, uważam, że warto zainteresować się aplikacją code2flow. Przyznaję, że celowo zostawiam pewien niedosyt, aby zachęcić Was do wypróbowania działania aplikacji w praktyce, poeksperymentować z zagnieżdżaniem warunków i pętli. Jestem pewien, że w ten sposób szybciej opanujecie tworzenie pseudokodu, czytanie schematów blokowych oraz obliczanie pokrycia kodu. Jednocześnie, opanowanie tego materiału może zapewnić wam zaliczenie podczas egzaminu ISTQB, czego Wam z tego miejsca życzę.
Dodatkowo, zachęcam do obejrzenia dwóch filmików przygotowanych przez Akademię Altkom:
REMIGIUSZ BEDNARCZYK
Znajdź mnie na mediach społecznościowych