\n",
" \n",
"Defekt to niedoskonałość w kodzie programu. \n",
"\n",
"Błąd ujawniony w czasie testów świadczy o defekcie w testowanym kodzie.\n",
" \n",
"
\n",
" \n",
"Usuwanie defektów to proces lokalizacji i poprawiania defektów.\n",
"\n",
"Procesy testowania i usuwania defektów często przeplatają się w pętlach iteracyjnych:\n",
"\n",
"
\n",
" \n",
"Przypadek testowy to eksperyment przeprowadzany w testowaniu, który można opisać w kategoriach:\n",
"
\n",
"
wartości wprowadzanych danych, \n",
"
akcji wykonywanej przez użytkownika\n",
"
oczekiwanych wyników. \n",
"
\n",
"\n",
"Przypadki testowe służą do ograniczenia przestrzeni sytuacji, które należy sprawdzić, aby wywołać błąd programu. \n",
"
"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Jak tworzyć przypadki testowe?\n",
"\n",
" * Analiza klas równoważności:\n",
" * Klasa równoważności – wszystkie możliwe wartości danych wejściowych przetwarzanych w ten sam sposób. \n",
" * Jeden przypadek testowy reprezentuje jedną klasę równoważności. \n",
"\n",
"**Przykład**: Testowany komponent systemu operuje na parze danych, z których pierwszy element oznacza godzinę, a drugi minutę. Ile można wyróżnić klas równoważności?\n",
" \n",
"\n",
"\n",
" * Analiza wartości brzegowych\n",
" * Metoda zakłada, że błędy mogą być spowodowane nieprzewidzianym zachowaniem programu w okolicach wartości brzegowych.\n",
" * Jeden przypadek testowy odpowiada jednej wartości brzegowej.\n",
"\n",
"**Przykład**: Testowany komponent systemu operuje na parze danych, z których pierwszy element oznacza godzinę, a drugi minutę. Ile można wyróżnić przypadków testowych metodą analizy wartości brzegowych? \n",
"\n",
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Jak opisywać przypadki testowe?\n",
"\n",
" * W metodzie białej skrzynki – za pomocą testów jednostkowych, stosując metodę analizy wartości brzegowych lub klas równoważności\n",
" * W metodzie czarnej skrzynki – w postaci:\n",
" * Prostej instrukcji do testera\n",
" * Scenariusza przypadku testowego\n",
" \n",
"**Przykład opisu przypadków testowych z prostą instrukcją:**\n",
"\n",
"\n",
" \n",
"**Przykład opisu przypadku testowego ze scenariuszem:**\n",
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 4. Poziomy testowania\n",
"\n",
"* Znalezienie defektu jest tym trudniejsze, im dłuższa droga dzieli miejsce defektu od miejsca ujawnienia błędu.\n",
"\n",
"* Każdemu etapowi wytwarzania oprogramowania odpowiada określony poziom testowania.\n",
"\n",
"\n",
"(źródło: https://edux.pjwstk.edu.pl/mat/200/lec/wyklady/11_3.html)\n",
"\n",
"* Zarządzanie poziomami testowania ma na celu skrócenie drogi od spowodowania defektu do wykrycia błędu.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Poziomy testowania w Scrumie\n",
"\n",
"* W programowaniu tradycyjnym testowanie odbywa się sekwencyjnie.\n",
"\n",
"* W Scrumie testowanie na wszystkich poziomach odbywa się równolegle (codziennie lub co przyrost).\n",
"\n",
"* Wnioski:\n",
"\n",
" * 1: Każdy zespół powinien zawierać osobę, która zajmuje się testowaniem „na pełen etat”.\n",
" * 2: W każdym sprincie powinno odbyć się testowanie na każdym poziomie.\n",
" * 3: W każdym kolejnym sprincie pojawiają się nowe przypadki testowe, ale wszystkie „stare” pozostają.\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 5. Testowanie jednostkowe\n",
"### Zasady testowania jednostkowego\n",
"\n",
" 1. Przedmiotem testowania są podstawowe jednostki programu.\n",
" 2. Testy jednostkowe tworzone są przez dewelopera - programistę.\n",
" 3. W testowaniu jednostkowym (jak i w całym procesie Scrum) polecana strategia to Test First.\n",
" 4. Test jednostkowy powinien testować jednostkę w izolacji. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 5.1. Przedmiotem testowania są podstawowe jednostki programu\n",
" * Every method needs to be tested.”\n",
" * W praktyce testowane są tylko metody publiczne…\n",
" * …Co oznacza, że testy metod publicznych muszą być tak dokładne, by testowały WSZYSTKIE wywoływane przez nie metody prywatne…\n",
" * …Co również oznacza, że defekty w metodach prywatnych ujawnione zostaną dopiero w testach dla metod publicznych.\n",
" * „Keep test logic out of production code”\n",
" * Nie wprowadzaj testów jednostkowych do kodu produkcyjnego."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 5.2. Testy jednostkowe tworzone są przez programistę\n",
" \n",
"\n",
"(rysunek na podstawie: Tilo Linz, \"Testing in Scrum\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 5.3. W testowaniu jednostkowym (jak i w całym procesie Scrum) polecana strategia to Test First\n",
"#### Zasady strategii Test First \n",
" * Zanim napiszesz linijkę kodu, napisz test automatyczny, który się nie powodzi.\n",
" * Pisz kod tak długo, aż powiodą się wszystkie testy.\n",
"#### Zalety strategii TestFirst\n",
" * Testowanie zastępuje metodę prób i błędów.\n",
" * Realizacja przypadków testowych jest obiektywną miarą postępów w pracy.\n",
" * Przypadki testowe zastępują formalną specyfikację.\n",
" * „Test first” wprowadza porządek w interfejsach między klasami.\n",
" * „Test first” świetnie wpisuje się w Scrum."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 5.4. Test jednostkowy powinien testować wyłącznie jednostkę (w izolacji)\n",
" * Każdy obiekt testowany jest indywidualnie…\n",
" * …Ale działanie obiektu może zależeć od innych komponentów…\n",
" * …Które mogą być niezaimplementowane w czasie testowania.\n",
" * Takie komponenty zastępuje się zamiennikami (ang. placeholder).\n",
"\n",
" * Typy zamienników:\n",
" * Stub (zalążek) - imituje obiekt zewnętrzny, który przekazuje dane do testowanego obiektu).\n",
" * Spy (szpieg) - zapamiętuje historię danych przekazywanych przez testowany obiekt).\n",
" * Mock (atrapa) - \"inteligentnie\" imituje obiekt zewnętrzny, który reaguje na dane przekazywane z testowanego obiektu.\n",
" * Fake (podróbka) - mocno uproszczona atrapa obiektu zewnętrznego, która nie ma wpływu na wynik testowania.\n",
" * Dummy (manekin) - pusty obiekt.\n",
" * Blog na temat zamienników:\n",
" [Przeczytaj o zamiennikach](https://dariuszwozniak.net/posts/kurs-tdd-19-mock-stub-fake-spy-dummy)\n",
" \n",
" **Przykład stuba (zalążka)**: \n",
" \n",
"(rysunek na podstawie: wikipedia\")\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 6. Testowanie integracyjne w Scrumie\n",
" * Celem testowania integracyjnego jest sprawdzenie, czy niezależne komponenty (np. klasy) prawidłowo ze sobą współpracują.\n",
" * Testowanie wykonują deweloperzy (na swojej maszynie) lub zespół testujący (w repozytorium).\n",
" * Metody testowania integracyjnego:\n",
" * Metoda wielkiego wybuchu\n",
" * Metoda stopniowej integracji i testowania\n",
" * W metodyce Scrum możliwe jest stosowanie obu metod:\n",
" * Metoda wielkiego wybuchu na zakończenie sprintu lub\n",
" * Metoda Ciągłej Integracji (testowanie po każdej zmianie)\n",
" * Systemy Ciągłej Integracji ułatwiają testowanie po każdej zmianie poprzez uruchamianie testów automatycznych. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Podsumowanie\n",
" * Niewykryte defekty w kodzie programu mogą doprowadzić do poważnej awarii lub katastrofy.\n",
" * Testowanie jest czynnością kreatywną, której celem jest wykazanie istnienia defektów w kodzie.\n",
" * Przypadki testowe mają na celu ograniczenie przestrzeni wyszukiwania defektów.\n",
" * Testowanie odbywa się na różnych poziomach – w tradycyjnych systemach jest to proces sekwencyjny, a w Scrumie – iteracyjny."
]
}
],
"metadata": {
"author": "Krzysztof Jassem",
"email": "jassem@amu.edu.pl",
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"lang": "pl",
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.5"
},
"subtitle": "08. Testowanie w programowaniu zwinnym[wykład]",
"title": "Przygotowanie do projektu badawczo-rozwojowego",
"year": "2021"
},
"nbformat": 4,
"nbformat_minor": 4
}