From 8be76ec1915da83fba20827c2344647f7ad3d496 Mon Sep 17 00:00:00 2001 From: Krzysztof Jassem Date: Sun, 7 Nov 2021 19:54:36 +0100 Subject: [PATCH] =?UTF-8?q?Aktualizacja=20wyk=C5=82adu=209.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ..._integracyjne_i_systemowe-checkpoint.ipynb | 394 ++++++++++++++++-- ..._testowanie_integracyjne_i_systemowe.ipynb | 256 ++++++++++-- .../obrazy/definicje błędów.png | Bin 0 -> 51748 bytes 3 files changed, 591 insertions(+), 59 deletions(-) create mode 100644 materiały na PPB (wykład)/obrazy/definicje błędów.png diff --git a/materiały na PPB (wykład)/.ipynb_checkpoints/09_testowanie_integracyjne_i_systemowe-checkpoint.ipynb b/materiały na PPB (wykład)/.ipynb_checkpoints/09_testowanie_integracyjne_i_systemowe-checkpoint.ipynb index f24ad8b..1bab75c 100644 --- a/materiały na PPB (wykład)/.ipynb_checkpoints/09_testowanie_integracyjne_i_systemowe-checkpoint.ipynb +++ b/materiały na PPB (wykład)/.ipynb_checkpoints/09_testowanie_integracyjne_i_systemowe-checkpoint.ipynb @@ -7,7 +7,7 @@ "![Logo 1](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech1.jpg)\n", "
\n", "

Przygotowanie do projektu badawczo-rozwojowego

\n", - "

9. Testowanie integracyjne i systemowe[wykład]

\n", + "

9. Testowanie systemowe i adaptacyjne[wykład]

\n", "

Krzysztof Jassem (2021)

\n", "
\n", "\n", @@ -18,24 +18,19 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "
\n", - " \n", - "

Błąd

\n", - " \n", - "Błąd to objaw nieoczekiwanego działania programu ujawniony podczas testów.\n", - "
" + "# 1. Testowanie systemowe i adaptacyjne - wyjaśnienie pojęć" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "
\n", + "
\n", + "

Testowanie systemowe

\n", " \n", - "

Defekt

\n", - " \n", - "Defekt to niedoskonałość w kodzie programu.\n", - "Błąd ujawniony w czasie testów świadczy o defekcie w testowanym kodzie.\n", + "Przedmiotem testowania systemowego jest całość oprogramowania zainstalowana w pewnym środowisku wykonawczym.\n", + " * Środowisko testowania musi być zbliżone do środowiska pracy.\n", + " * Testowanie systemowe odbywa się metodą „czarnej skrzynki”.\n", "
" ] }, @@ -44,11 +39,11 @@ "metadata": {}, "source": [ "
\n", + "

Testowanie adaptacyjne

\n", " \n", - "

Testowanie

\n", - " \n", - "Testowanie to proces, który ma na celu wykazanie istnienia defektów w kodzie programu \n", - "poprzez wywołanie błędów w działaniu.\n", + "Przedmiotem testowania adaptacyjnego jest oprogramowanie stanowiące przedmiot dostawy do użytkownika w docelowym środowisku pracy.\n", + " * Testowana jest zgodność z wymaganiami i potrzebami użytkownika.\n", + " * Testowanie akceptacyjne przeprowadza użytkownik / klient.\n", "
" ] }, @@ -56,41 +51,386 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Opracowywanie przypadków testowych dla testowania integracyjnego" + "# 2. Typy testowania systemowego" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Strategie testowania integracyjnego" + "## 2.1. Testowanie funkcjonalne (functional testing)\n", + "**Testowanie funkcjonalne** ma na celu wykazanie rozbieżności między programem a jego specyfikacją zapisaną w postaci wymagań funkcjonalnych lub przypadków użycia.\n", + " * Przypadki testowe (scenariusze testowe) wielokrotnie tworzy się na podstawie przypadków użycia.\n", + " * Podstawowa zasada:Im więcej błędów wykryto w pewnej funkcji programu, tym (prawdopodobnie) większą liczbę błędów ona jeszcze ukrywa.\n", + " * Testowanie funkcjonalne może odbywać się na różnych poziomach szczegółowości:\n", + " * testy dymne\n", + " * testy zdroworozsądkowe\n", + " * testy regresywne" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Środowisko testowania systemowego" + "### Testy dymne\n", + "**Testy dymne** (ang. smoke tests) to powierzchowne testy pozwalające wykazać błędy krytyczne,\n", + " * Przykładem testu dymnego może być test CRUD (Create, Read, Update, Delete).\n", + " \n", + "**Przykład opisu testów dymnych:**\n", + "\"Przykład" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Testowanie manualne: \n", - "### Testowanie eksploracyjne\n", - "### Testowanie sesyjne\n", - "### Testowanie akceptacyjne" + "### Testy zdroworozsądkowe\n", + "**Testy zdroworozsądkowe** mają wykazać, że aplikacja nie działa zgodnie ze stawianymi przed nią wymaganiami.\n", + ">\"Smoke test określa, czy w ogóle coś działa, a sanity test - czy działa tak, jak ma działać”.\n", + "\n", + "**Przykład przypadków testowych na poziomie testowania regresywnego:**\n", + "\"Przykład" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Testowanie automatyczne\n", - "### Testowanie oparte na nagrywaniu\n", - "### Testowanie oparte na słowach kluczowych\n", - "### Testowanie oparte na zachowaniu" + "### Testy regresywne\n", + "**Testy regresywne** to szczegółowe testy, pozwalające wykazać, że w aplikacji powstały nieznane błędów będące wynikiem wprowadzonych zmian.\n", + "\n", + "**Przykład przypadku testowego na poziomie testowania regresywnego:**\n", + "\"Przykład" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Raport z testowania funkcjonalnego\n", + "Przypadki testowe w testowaniu funkcjonalnym warto tworzyć w takiej formie, aby łatwo można je było rozszerzyć o wyniki testowania - tworząc raport z testowania.\n", + "\n", + "**Fragment raportu z testowania funkcjonalnego:**\n", + "\"Przykład\n", + "\n", + "W raporcie z testowania można zawrzeć dodatkowe informacje np. o wydajności działania danego przypadku testowego." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2.2. Testowanie wydajności (performance testing)\n", + "Zadaniem **testowania wydajności** jest wykazanie, że system nie daje odpowiedzi w wystarczająco krótkim czasie pod ustalonym obciążeniem produkcyjnym, np. przy dużym wolumenie przetwarzanych danych.\n", + "\n", + "**Przykładowy fragment raportu z testowania wydajności systemu tłumaczenia:**\n", + "\"Przykład\n", + "\n", + "**Stronę internetową** można bardzo szybko przetestować pod kątem wydajności, korzystając np. z narzędzia dostępnego na stronie https://webspeed.intensys.pl/.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2.3. Testowanie przeciążeń (load testing)\n", + "**Przeciążenie** to skumulowanie w krótkim czasie dużej liczby jednocześnie działających użytkowników lub przeprowadzanych transakcji. \n", + "\n", + "Celem **testowania przeciążeń** jest zweryfikowania działania systemu przy wysokim obciążeniu.\n", + " * Przykładowy scenariusz testowania przeciążeń:\n", + " * Nagranie ciągu operacji wykonywanych przez jednego klienta (np. \u000b", + "w postaci makra)\n", + " * Odtworzenie nagranego ciągu operacji dla wybranej (dużej) liczby klientów\n", + " * Analiza raportu\n", + "\n", + "**Przykład raportu tekstowego z testu przeciążeń systemu tłumaczenia:**\n", + "\"Przykład\n", + "\n", + "**Przykład raportu graficznego z testu przeciążeń systemu tłumaczenia:**\n", + "\"Przykład" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2.4. Testowanie pamięci (memory testing)\n", + "Celem **testowania pamięci** jest wykazanie, że system narusza narzucone wymagania pamięciowe." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2.5. Testowanie ochrony danych (security testing)\n", + "Proces ma wykazać, że dane nie są chronione w odpowiedni sposób.\n", + " * Przypadki testowe mają wymusić naruszenie mechanizmów ochrony danych." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2.6. Testowanie konfiguracji\n", + "**Testowanie konfiguracji** ma na celu zweryfikowanie działania systemu w różnych konfiguracjach sprzętowych i programowych.\n", + " * Testowanie może odbywać się za pomocą specjalnie przygotowanej maszyny wirtualnej.\n", + " * Dla serwisów webowych istotne jest testowanie różnych urządzeń oraz różnych typów przeglądarek." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2.7. Testowanie zgodności wersji\n", + "**Testowanie zgodności wersji** ma na celu wykazanie niezgodności z przeszłymi wersjami programów:\n", + " * testowanie patchów i aktualizacji,\n", + " * testowanie nowych wersji." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2.8. Testowanie zgodności z dokumentacją użytkownika\n", + "Jest to próba wykrycia rozbieżności między programem a jego specyfikacją zapisaną w dokumentacji użytkownika.\n", + " * Przy okazji porównuje się dokumentację użytkownika z pierwotnymi celami projektowymi.\n", + " * Ten typ testowania stosowany jest również w testowaniu akceptacyjnym." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2.9. Testowanie procedury instalacyjnej\n", + "Celem jest wykazanie istnienia defektów poprzez wywołanie błędów w trakcie procedury instalacyjnej." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2.10. Testowanie odporności (resilience testing)\n", + "Zadaniem **testowania odporności** jest postawienie pod znakiem zapytania odporności systemu na awarie. \n", + " * Testowanie polega na umyślnym „zasianiu” w kodzie programu różnorakich błędów.\n", + " * Odporność na awarie mierzy się przy pomocy MTTR (mean time to recovery).\n", + " * Celem testowania jest wskazanie, że łączny czas przestojów przekracza limit określony w celach projektowych." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 3. Testowanie akceptacyjne\n", + "## Cele testowania akcpetacyjnego\n", + " * Sprawdzenie kompletności systemu i jego prawidłowego działania;\n", + " * Sprawdzanie zgodności zachowania funkcjonalnego i niefunkcjonalnego systemu ze specyfikacją;\n", + " * Spełnienie wymagań wynikających z obowiązujących przepisów prawa lub norm/standardów;\n", + " * Wykrycie defektów.\n", + " \n", + " ## Kto i kiedy wykonuje testowanie akceptacyjne?\n", + "* Testowanie akceptacyjne wykonywane jest przez: \n", + " * właścicieli produktów (przedstawicieli wykonawców);\n", + " * wyznaczonych przedstawicieli strony zamawiającej;\n", + " * operatorów systemów (np. pełniących rolę administratora);\n", + " * użytkowników końcowych.\n", + "* Testowanie akceptacyjne jest zazwyczaj ostatnim etapem sekwencyjnego cyklu życia oprogramowania.\n", + "* W iteracyjnych modelach wytwarzania oprogramowania testowanie akceptacyjne może odbywać się na zakończenie każdej iteracji (np. sprintu). \n", + "\n", + "## Typy testowania akceptacyjnego\n", + " * Testowanie akceptacyjne przez użytkownika\n", + " * Testowanie produkcyjne\n", + " * Testowanie akceptacyjne zgodności \u000b", + "z umową i zgodności \u000b", + "z przepisami prawa\n", + " * Testy alfa i testy beta" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3.1. Testowanie akceptacyjne przez użytkownika\n", + "Ma na celu sprawdzenie, czy system nadaje się do użytkowania przez przyszłych odbiorców: \n", + " * czy spełni ich potrzeby, \n", + " * czy wypełni postawione wymagania,\n", + " * wykona proces biznesowy z minimalną liczbą problemów, minimalnymi kosztem i ryzykiem." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3.2 Produkcyjne testy akceptacyjne\n", + "Są to testy systemu przez operatorów lub administratorów, które mogą obejmować:\n", + " * testowanie mechanizmów tworzenia kopii zapasowych i odtwarzania danych;\n", + " * instalowanie, odinstalowywanie i aktualizowanie oprogramowania;\n", + " * usuwanie skutków awarii;\n", + " * zarządzanie użytkownikami;\n", + " * wykonywanie czynności pielęgnacyjnych;\n", + " * wykonywanie czynności związanych z ładowaniem i migracją danych;\n", + " * sprawdzanie, czy występują podatności zabezpieczeń;\n", + " * wykonywanie testów wydajnościowych." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3.3. Testowanie akceptacyjne zgodności z umową i zgodności z przepisami prawa!\n", + "**Testowanie zgodności z umową** to weryfikowanie zgodności działania z kryteriami akceptacji zapisanymi w umowie. \n", + "\n", + "**Testowanie zgodności z przepisami prawa** sprawdza zgodność działania z ustawami, rozporządzeniami czy normami bezpieczeństwa. \n", + " * Wykonywane jest często przez niezależnych testerów pod nadzorem." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3.4. Testy alfa i testy beta\n", + "**Testowanie alfa** jest wykonywane w siedzibie wykonawcy.\n", + " * Wykonują je potencjalni lub obecni klienci, i/lub operatorzy bądź niezależni testerzy. \n", + " \n", + "**Testowanie beta** wykonują obecni lub potencjalni klienci we własnych lokalizacjach. \n", + " * Celem może być wykrywanie błędów związanych z warunkami i środowiskiem (środowiskami), w których system będzie używany." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 4. Testowanie automatyczne\n", + "**Automatyzacja testowania** polega na zastąpienia testera oprogramowaniem, które:\n", + "* Steruje testem,\n", + "* Porównuje wyniki z oczekiwaniami,\n", + "* Raportuje błędy." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4.1. Podejścia do testowania automatycznego\n", + "\n", + "### Code-driven testing (testowanie sterowane kodem)\n", + " * Testowane są publiczne interfejsy do klas (modułów, bibliotek) poprzez podanie różnorakich danych wejściowych i walidacji wyników.\n", + " * Jest to poziom testów jednostkowych.\n", + "\n", + "### Graphical user interface testing (testowanie graficznego interfejsu użytkownika)\n", + " * Generowane są zdarzenia interfejsu takie jak: kliknięcia myszką czy naciśnięcie klawiszy i obserwowane są zmiany w interfejsie użytkownika. \n", + " * Jest to poziom testów systemowych.\n", + " \n", + "#### Testowanie za pomocą makr, np. Macro Express (https://www.macros.com/)\n", + "1. Nagrywamy makro realizujące ciąg zdarzeń (kliknięć, klawiszy itp.),\n", + "2. przygotowujemy zestaw plików graficznych, które obrazują kolejne oczekiwane wyglądy interfejsu,\n", + "3. podczas testowania każdorazowo porównujemy obrazy interfejsu z obrazami oczekiwanymi.\n", + "\n", + "#### Testowanie za pomocą oprogramowania, np. Selenium\n", + "(http://tynecki.pl/pdf/Automating-functional-tests-using-Python-and-Selenium-Piotr-Tynecki.pdf)\n", + "* Opracowujemy sekwencję zdarzeń (kliknięć, klawiszy itp.).\n", + "* Sprawdzamy powodzenie testowanej operacji (np. sprawdzamy, czy istnieje na stronie poszukiwany element).\n", + "\n", + "#### Zalety automatycznego testowania GUI\n", + "* Może być stosowane do każdego oprogramowania z graficznym interfejsem użytkownika.\n", + "* Znakomicie wkomponowuje się w paradygmat „continous integration”.\n", + "\n", + "#### Wady automatycznego testowania GUI\n", + "* Przygotowanie przypadków testowych jest czasochłonne.\n", + "* Każda najmniejsza zmiana interfejsu powoduje konieczność opracowania nowego zestawu testowego.\n", + "* W scenariuszach zawarte są się często operacje nieistotne z punktu widzenia testowania." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 5. Plan testów\n", + "**Plan testów** to dokument opisujący organizację procesu testowania. \n", + " * Dotyczy zazwyczaj testowania systemowego.\n", + " * Plan testów składa się z następujących elementów:\n", + " * Zakres testów\n", + " * Strategia testowania\n", + " * Zasoby niezbędne do testów\n", + " * Specyfikacja testów" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 5.1. Zakres testów\n", + " * Identyfikacja testowanego produktu (co testujemy?)\n", + " * Określenie wymagań (właściwości), które testujemy\n", + " * Określenie wymagań (właściwości), których nie testujemy" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 5.2. Metodologia testowania\n", + " * Określenie typów testowania, które przeprowadzimy.\n", + " * Określenie typów testowania, których nie przeprowadzimy.\n", + " * Zdefiniowanie metod oceny testu\n", + " * Zdefiniowanie typów błędów (awarie, błędy istotne, błędy nieistotne)\n", + " * Określenie kryteriów pozytywnego zakończenia testów\n", + " * Przykładowo: określenie dopuszczalnej liczby błędów poszczególnego typu\n", + " * Określenie postaci raportu z testów\n", + " \n", + "**Przykład definicji błędów:**\n", + " \"Przykład" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 5.3. Zasoby niezbędne do testów\n", + " * Środowisko testowe\n", + " * Oprogramowanie zastosowane w testowaniu\n", + " * Zespół wykonawców\n", + " * Warunki początkowe, np.:\n", + " * np. wykonane prace instalacyjne lub konfiguracyjne\n", + " * stopień ukończenia prac implementacyjnych\n", + " \n", + "**Przykład oprogramowania zastosowanego w testowaniu:**\n", + "\"Przykład" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 5.4. Specyfikacja testów \n", + "**Specyfikacja testów** to zestaw scenariuszy testowych (przypadków testowych)." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Podsumowanie\n", + " * Testowanie manualne jest wciąż najczęściej stosowaną metodą testowania systemowego i akceptacyjnego.\n", + " * Testowanie automatyczne staje się coraz bardziej popularne; \n", + " * jest pracochłonne w przygotowaniu,\n", + " * ale oszczędza czas samego procesu testowania.\n", + " * Niezależnie od typu testowania, jest to czynność, którą należy starannie zaplanować." ] } ], diff --git a/materiały na PPB (wykład)/09_testowanie_integracyjne_i_systemowe.ipynb b/materiały na PPB (wykład)/09_testowanie_integracyjne_i_systemowe.ipynb index 11b147f..1bab75c 100644 --- a/materiały na PPB (wykład)/09_testowanie_integracyjne_i_systemowe.ipynb +++ b/materiały na PPB (wykład)/09_testowanie_integracyjne_i_systemowe.ipynb @@ -22,7 +22,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -36,7 +35,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -57,7 +55,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -72,7 +69,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -85,7 +81,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -98,7 +93,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -110,21 +104,19 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Raport z testowania funkcjonalnego\n", "Przypadki testowe w testowaniu funkcjonalnym warto tworzyć w takiej formie, aby łatwo można je było rozszerzyć o wyniki testowania - tworząc raport z testowania.\n", "\n", - "**Fragment raportu z testowania funckjonalnego:**\n", + "**Fragment raportu z testowania funkcjonalnego:**\n", "\"Przykład\n", "\n", "W raporcie z testowania można zawrzeć dodatkowe informacje np. o wydajności działania danego przypadku testowego." ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -132,13 +124,12 @@ "Zadaniem **testowania wydajności** jest wykazanie, że system nie daje odpowiedzi w wystarczająco krótkim czasie pod ustalonym obciążeniem produkcyjnym, np. przy dużym wolumenie przetwarzanych danych.\n", "\n", "**Przykładowy fragment raportu z testowania wydajności systemu tłumaczenia:**\n", - "\"Przykład\n", + "\"Przykład\n", "\n", "**Stronę internetową** można bardzo szybko przetestować pod kątem wydajności, korzystając np. z narzędzia dostępnego na stronie https://webspeed.intensys.pl/.\n" ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -160,7 +151,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -169,7 +159,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -179,7 +168,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -190,7 +178,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -201,44 +188,249 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ - "## Strategie testowania integracyjnego" + "## 2.8. Testowanie zgodności z dokumentacją użytkownika\n", + "Jest to próba wykrycia rozbieżności między programem a jego specyfikacją zapisaną w dokumentacji użytkownika.\n", + " * Przy okazji porównuje się dokumentację użytkownika z pierwotnymi celami projektowymi.\n", + " * Ten typ testowania stosowany jest również w testowaniu akceptacyjnym." ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ - "## Środowisko testowania systemowego" + "## 2.9. Testowanie procedury instalacyjnej\n", + "Celem jest wykazanie istnienia defektów poprzez wywołanie błędów w trakcie procedury instalacyjnej." ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ - "## Testowanie manualne: \n", - "### Testowanie eksploracyjne\n", - "### Testowanie sesyjne\n", - "### Testowanie akceptacyjne" + "## 2.10. Testowanie odporności (resilience testing)\n", + "Zadaniem **testowania odporności** jest postawienie pod znakiem zapytania odporności systemu na awarie. \n", + " * Testowanie polega na umyślnym „zasianiu” w kodzie programu różnorakich błędów.\n", + " * Odporność na awarie mierzy się przy pomocy MTTR (mean time to recovery).\n", + " * Celem testowania jest wskazanie, że łączny czas przestojów przekracza limit określony w celach projektowych." ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ - "## Testowanie automatyczne\n", - "### Testowanie oparte na nagrywaniu\n", - "### Testowanie oparte na słowach kluczowych\n", - "### Testowanie oparte na zachowaniu" + "# 3. Testowanie akceptacyjne\n", + "## Cele testowania akcpetacyjnego\n", + " * Sprawdzenie kompletności systemu i jego prawidłowego działania;\n", + " * Sprawdzanie zgodności zachowania funkcjonalnego i niefunkcjonalnego systemu ze specyfikacją;\n", + " * Spełnienie wymagań wynikających z obowiązujących przepisów prawa lub norm/standardów;\n", + " * Wykrycie defektów.\n", + " \n", + " ## Kto i kiedy wykonuje testowanie akceptacyjne?\n", + "* Testowanie akceptacyjne wykonywane jest przez: \n", + " * właścicieli produktów (przedstawicieli wykonawców);\n", + " * wyznaczonych przedstawicieli strony zamawiającej;\n", + " * operatorów systemów (np. pełniących rolę administratora);\n", + " * użytkowników końcowych.\n", + "* Testowanie akceptacyjne jest zazwyczaj ostatnim etapem sekwencyjnego cyklu życia oprogramowania.\n", + "* W iteracyjnych modelach wytwarzania oprogramowania testowanie akceptacyjne może odbywać się na zakończenie każdej iteracji (np. sprintu). \n", + "\n", + "## Typy testowania akceptacyjnego\n", + " * Testowanie akceptacyjne przez użytkownika\n", + " * Testowanie produkcyjne\n", + " * Testowanie akceptacyjne zgodności \u000b", + "z umową i zgodności \u000b", + "z przepisami prawa\n", + " * Testy alfa i testy beta" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3.1. Testowanie akceptacyjne przez użytkownika\n", + "Ma na celu sprawdzenie, czy system nadaje się do użytkowania przez przyszłych odbiorców: \n", + " * czy spełni ich potrzeby, \n", + " * czy wypełni postawione wymagania,\n", + " * wykona proces biznesowy z minimalną liczbą problemów, minimalnymi kosztem i ryzykiem." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3.2 Produkcyjne testy akceptacyjne\n", + "Są to testy systemu przez operatorów lub administratorów, które mogą obejmować:\n", + " * testowanie mechanizmów tworzenia kopii zapasowych i odtwarzania danych;\n", + " * instalowanie, odinstalowywanie i aktualizowanie oprogramowania;\n", + " * usuwanie skutków awarii;\n", + " * zarządzanie użytkownikami;\n", + " * wykonywanie czynności pielęgnacyjnych;\n", + " * wykonywanie czynności związanych z ładowaniem i migracją danych;\n", + " * sprawdzanie, czy występują podatności zabezpieczeń;\n", + " * wykonywanie testów wydajnościowych." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3.3. Testowanie akceptacyjne zgodności z umową i zgodności z przepisami prawa!\n", + "**Testowanie zgodności z umową** to weryfikowanie zgodności działania z kryteriami akceptacji zapisanymi w umowie. \n", + "\n", + "**Testowanie zgodności z przepisami prawa** sprawdza zgodność działania z ustawami, rozporządzeniami czy normami bezpieczeństwa. \n", + " * Wykonywane jest często przez niezależnych testerów pod nadzorem." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3.4. Testy alfa i testy beta\n", + "**Testowanie alfa** jest wykonywane w siedzibie wykonawcy.\n", + " * Wykonują je potencjalni lub obecni klienci, i/lub operatorzy bądź niezależni testerzy. \n", + " \n", + "**Testowanie beta** wykonują obecni lub potencjalni klienci we własnych lokalizacjach. \n", + " * Celem może być wykrywanie błędów związanych z warunkami i środowiskiem (środowiskami), w których system będzie używany." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 4. Testowanie automatyczne\n", + "**Automatyzacja testowania** polega na zastąpienia testera oprogramowaniem, które:\n", + "* Steruje testem,\n", + "* Porównuje wyniki z oczekiwaniami,\n", + "* Raportuje błędy." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4.1. Podejścia do testowania automatycznego\n", + "\n", + "### Code-driven testing (testowanie sterowane kodem)\n", + " * Testowane są publiczne interfejsy do klas (modułów, bibliotek) poprzez podanie różnorakich danych wejściowych i walidacji wyników.\n", + " * Jest to poziom testów jednostkowych.\n", + "\n", + "### Graphical user interface testing (testowanie graficznego interfejsu użytkownika)\n", + " * Generowane są zdarzenia interfejsu takie jak: kliknięcia myszką czy naciśnięcie klawiszy i obserwowane są zmiany w interfejsie użytkownika. \n", + " * Jest to poziom testów systemowych.\n", + " \n", + "#### Testowanie za pomocą makr, np. Macro Express (https://www.macros.com/)\n", + "1. Nagrywamy makro realizujące ciąg zdarzeń (kliknięć, klawiszy itp.),\n", + "2. przygotowujemy zestaw plików graficznych, które obrazują kolejne oczekiwane wyglądy interfejsu,\n", + "3. podczas testowania każdorazowo porównujemy obrazy interfejsu z obrazami oczekiwanymi.\n", + "\n", + "#### Testowanie za pomocą oprogramowania, np. Selenium\n", + "(http://tynecki.pl/pdf/Automating-functional-tests-using-Python-and-Selenium-Piotr-Tynecki.pdf)\n", + "* Opracowujemy sekwencję zdarzeń (kliknięć, klawiszy itp.).\n", + "* Sprawdzamy powodzenie testowanej operacji (np. sprawdzamy, czy istnieje na stronie poszukiwany element).\n", + "\n", + "#### Zalety automatycznego testowania GUI\n", + "* Może być stosowane do każdego oprogramowania z graficznym interfejsem użytkownika.\n", + "* Znakomicie wkomponowuje się w paradygmat „continous integration”.\n", + "\n", + "#### Wady automatycznego testowania GUI\n", + "* Przygotowanie przypadków testowych jest czasochłonne.\n", + "* Każda najmniejsza zmiana interfejsu powoduje konieczność opracowania nowego zestawu testowego.\n", + "* W scenariuszach zawarte są się często operacje nieistotne z punktu widzenia testowania." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 5. Plan testów\n", + "**Plan testów** to dokument opisujący organizację procesu testowania. \n", + " * Dotyczy zazwyczaj testowania systemowego.\n", + " * Plan testów składa się z następujących elementów:\n", + " * Zakres testów\n", + " * Strategia testowania\n", + " * Zasoby niezbędne do testów\n", + " * Specyfikacja testów" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 5.1. Zakres testów\n", + " * Identyfikacja testowanego produktu (co testujemy?)\n", + " * Określenie wymagań (właściwości), które testujemy\n", + " * Określenie wymagań (właściwości), których nie testujemy" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 5.2. Metodologia testowania\n", + " * Określenie typów testowania, które przeprowadzimy.\n", + " * Określenie typów testowania, których nie przeprowadzimy.\n", + " * Zdefiniowanie metod oceny testu\n", + " * Zdefiniowanie typów błędów (awarie, błędy istotne, błędy nieistotne)\n", + " * Określenie kryteriów pozytywnego zakończenia testów\n", + " * Przykładowo: określenie dopuszczalnej liczby błędów poszczególnego typu\n", + " * Określenie postaci raportu z testów\n", + " \n", + "**Przykład definicji błędów:**\n", + " \"Przykład" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 5.3. Zasoby niezbędne do testów\n", + " * Środowisko testowe\n", + " * Oprogramowanie zastosowane w testowaniu\n", + " * Zespół wykonawców\n", + " * Warunki początkowe, np.:\n", + " * np. wykonane prace instalacyjne lub konfiguracyjne\n", + " * stopień ukończenia prac implementacyjnych\n", + " \n", + "**Przykład oprogramowania zastosowanego w testowaniu:**\n", + "\"Przykład" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 5.4. Specyfikacja testów \n", + "**Specyfikacja testów** to zestaw scenariuszy testowych (przypadków testowych)." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Podsumowanie\n", + " * Testowanie manualne jest wciąż najczęściej stosowaną metodą testowania systemowego i akceptacyjnego.\n", + " * Testowanie automatyczne staje się coraz bardziej popularne; \n", + " * jest pracochłonne w przygotowaniu,\n", + " * ale oszczędza czas samego procesu testowania.\n", + " * Niezależnie od typu testowania, jest to czynność, którą należy starannie zaplanować." ] } ], diff --git a/materiały na PPB (wykład)/obrazy/definicje błędów.png b/materiały na PPB (wykład)/obrazy/definicje błędów.png new file mode 100644 index 0000000000000000000000000000000000000000..3afd3d89432fac8b7058f1918dd1d2c8726b2ed2 GIT binary patch literal 51748 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 literal 0 HcmV?d00001