32
TESTOWANIE OPROGRAMOWANIA „Uważaj na ten program – ja tylko udowodniłem jego poprawność, nie testowałem go” Donald Knuth

TESTOWANIE OPROGRAMOWANIAstaff.uz.zgora.pl/mpatan/materialy/tmp_z/druk10z.pdfTestowanie oprogramowania 32 / 32 1. Testowanie – wstęp 2. Refaktoryzacja 3. Pojęcia związane z testowaniem

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

  • TESTOWANIEOPROGRAMOWANIA

    „Uważaj na ten program – ja tylkoudowodniłem jego poprawność,nie testowałem go”

    Donald Knuth

  • Plan prezentacji

    Testowanie oprogramowania 2 / 32

    1. Testowanie – wstęp2. Refaktoryzacja3. Pojęcia związane z testowaniem4. Programowanie sterowane testami5. Testy jednostkowe

    5.1. JUnit 5.2. CppUnit

    6. Testy integracyjne7. Testy systemowe8. Testy regresyjne9. Pozostałe testy

    10. Hierarchia testów11. Narzędzia wspomagające testowanie12. Źródła i przydatne linki

  • Testowanie – wstęp

    Testowanie oprogramowania 3 / 32

    1. Testowanie – wstęp2. Refaktoryzacja3. Pojęcia związane z testowaniem4. Programowanie sterowane testami5. Testy jednostkowe

    5.1. JUnit 5.2. CppUnit

    6. Testy integracyjne7. Testy systemowe8. Testy regresyjne9. Pozostałe testy

    10. Hierarchia testów11. Narzędzia wspomagające testowanie12. Źródła i przydatne linki

    „Testowanie może wykazać wyłącznie istnienie bugów, nigdy ich brak.”

    Edsger W. Dijkstra

    „Jeśli nie masz ochoty na testowanie swojego produktu, pamiętaj, że twoi klienci też nie będą tego robić”

    autor nieznany

  • Testowanie – wstęp

    Testowanie oprogramowania 4 / 20

    • testowanie kodu na bieżąco wielokrotnie skraca czas potrzebny na usunięcie błędów w oprogramowaniu

    •bez testów ukończenie programu (stworzenie działającej wersji) jest praktycznie niemożliwe

  • Testowanie – wstęp

    Testowanie oprogramowania 5 / 32

    •poprawność – zgodność faktycznego zachowania programu z oczekiwanym

    •wydajność – spełnianie wymagań czasowych

    •niezawodność – odporność na działanie pod wymaganym obciążeniem

    •bezpieczeństwo – odporność na ataki, ochrona danych

    Co można testować?

  • Testowanie – wstęp

    Testowanie oprogramowania 6 / 32

    •black-box testing – spojrzenie na system z zewnętrznego punktu widzenia; system jako „czarna skrzynka”, która ma realizować określone zadania i tylko pod tym kątem jest testowana – np. testy odbioru

    •white-box testing – testowanie obejmujące wgląd we wnętrze programu: testujący przeprowadza test jednocześnie badając kod programu. Wymagane umiejętności programistyczne – np. testy jednostkowe

    Typy testowania ze względu na perspektywę

  • Refaktoryzacja

    Testowanie oprogramowania 7 / 32

    1. Testowanie – wstęp2. Refaktoryzacja3. Pojęcia związane z testowaniem4. Programowanie sterowane testami5. Testy jednostkowe

    5.1. JUnit 5.2. CppUnit

    6. Testy integracyjne7. Testy systemowe8. Testy regresyjne9. Pozostałe testy

    10. Hierarchia testów11. Narzędzia wspomagające testowanie12. Źródła i przydatne linki

    •kluczowa dla skutecznego testowania i poprawiania błędów

    •przeprowadzenie testu to tylko połowa sukcesu - należy jeszcze poprawić błąd

    •dobrze napisany kod ułatwia programowanie przyrostowe („małymi krokami”)

    refaktoryzacja – poprawa jakości kodu bez zmiany jego funkcjonalności

  • Refaktoryzacja

    Testowanie oprogramowania 8 / 32

    „Pierwszy lepszy głupiec potrafi napisać kod zrozumiały dla komputera. Dobrzy programiści piszą kod zrozumiały dla człowieka.”

    Martin Fowler

    „To świetna zabawa, kiedy można rozwikłać zagadkę morderstwa, ale kod nie powinien wymagać rozwikłania. Kod powinien dawać się czytać.”

    Steve McConnell

  • Testowanie – podstawowe pojęcia

    Testowanie oprogramowania 9 / 32

    1. Testowanie – wstęp2. Refaktoryzacja3. Pojęcia związane z testowaniem4. Programowanie sterowane testami5. Testy jednostkowe

    5.1. JUnit 5.2. CppUnit

    6. Testy integracyjne7. Testy systemowe8. Testy regresyjne9. Pozostałe testy

    10. Hierarchia testów11. Narzędzia wspomagające testowanie12. Źródła i przydatne linki

    bug – każde zachowanie programu, które odbiega od oczekiwanego; zadaniem testów jest ich „wyłapywanie”i diagnozowanie

    jednostka – pojedynczy element programu, podlegający testom jednostkowym, np. metoda, funkcja, klasa

    przypadek testowy – zestaw danych, który służy do przetestowania danej jednostki; zawiera dane wejściowe i odpowiadający im poprawny wynik

  • Programowanie sterowane testami(ang. test-driven programming)

    Testowanie oprogramowania 10 / 32

    1. Testowanie – wstęp2. Refaktoryzacja3. Pojęcia związane z testowaniem4. Programowanie sterowane testami5. Testy jednostkowe

    5.1. JUnit 5.2. CppUnit

    6. Testy integracyjne7. Testy systemowe8. Testy regresyjne9. Pozostałe testy

    10. Hierarchia testów11. Narzędzia wspomagające testowanie12. Źródła i przydatne linki

    • testy jako sformalizowany sposóbzapisu wymagań funkcjonalnych

    •najpierw przygotowywany jesttest (klasa testowa, przypadektestowy), a dopiero potemtworzona jest jednostka, która ma za zadanie „przejść” test

    •niezaliczenie testu jest równoznaczne z błędnym kodem (niespełnieniem wymagań)

  • Programowanie sterowane testami(ang. test-driven programming)

    Testowanie oprogramowania 11 / 32

    przygotowanietestu

    kompilacja testu

    przygotowaniejednostki testowanej

    kompilacja testu

    analiza wynikui ewentualne

    poprawki

    BŁĄD

    błąd kompilacji(brak testowanej jednostki)

  • Programowanie sterowane testami(ang. test-driven development)

    Testowanie oprogramowania 12 / 32

    • dodatkowe nakłady pracy bez wyczuwalnych zysków (więcej tworzonego kodu)

    • żmudny proces tworzenia testów

    • bardzo przejrzyście sformułowane wymagania względem systemu

    • zmniejszenie ilości błędów – usterkiwyłapywane „na bieżąco”

    • oszczędności czasowe! (mniej debugowania)• modularność, rozszerzalność kodu

    ZALETY

    WADY

  • Testy jednostkowe

    Testowanie oprogramowania 13 / 32

    1. Testowanie – wstęp2. Refaktoryzacja3. Pojęcia związane z testowaniem4. Programowanie sterowane testami5. Testy jednostkowe

    5.1. JUnit 5.2. CppUnit

    6. Testy integracyjne7. Testy systemowe8. Testy regresyjne9. Pozostałe testy

    10. Hierarchia testów 11. Narzędzia wspomagające testowanie12. Źródła i przydatne linki

    •najniższy poziom testówzorganizowanych

    •poprawność pojedynczychjednostek (klas, funkcji)

    • fragment programu (jednostka) poddawany jest testowi, a wynik działania porównywany jest z wcześniej przygotowanym wynikiem wzorcowym

  • Testy jednostkowe

    Testowanie oprogramowania 14 / 32

    •bardzo elastyczne tworzenie przypadków testowych (można np. stworzyć zestaw testowy, który oczekuje na rzucenie określonego wyjątku)

    • testy zautomatyzowane, wykonywane na bieżąco

    • tworzą swoistą dokumentację – czytając kod testu, można rozpoznać, jaka funkcjonalność jest wymagana od danej jednostki

  • Testy jednostkowe

    Testowanie oprogramowania 15 / 32

    Mock Objects(ang. mock - przedrzeźniać, udawać)

    •obiekty symulujące działanie zewnętrznych, złożonych komponentów

    • testy powinny być odizolowane od zewnętrznych czynników – testowana powinna być wyłącznie jednostka

    •przykład – testując moduł wyświetlania, zamiast łączyć się z bazą przy każdym teście, tworzymy „podróbkę” połączenia, oszczędzając czas

  • Testy jednostkowe

    Testowanie oprogramowania 16 / 32

    Asercje•warunki konieczne do zaliczenia testu

    • jeden test – zero lub więcej asercji; niezaliczenie którejkolwiek asercji to przerwanie testu z wynikiem negatywnym

    Przykłady:

    • assertEquals(a, b) – przechodzi, gdy a == b

    • assertNotNull(a) – przechodzi, gdy a nie jest null

  • JUnit – testy jednostkowe w Javie

    Testowanie oprogramowania 17 / 32

    1. Testowanie – wstęp2. Refaktoryzacja3. Pojęcia związane z testowaniem4. Programowanie sterowane testami5. Testy jednostkowe

    5.1. JUnit 5.2. CppUnit

    6. Testy integracyjne7. Testy systemowe8. Testy regresyjne9. Pozostałe testy

    10. Hierarchia testów11. Narzędzia wspomagające testowanie12. Źródła i przydatne linki

    http://junit.org

    •wspiera zautomatyzowaneprzeprowadzanie testów

    •klasy testowe opisywaneza pomocą annotacji

    •bogata kolekcja pluginów do integracji Junitróżnymi środowiskami użytkownika(Eclipse, NetBeans)

  • JUnit – testy jednostkowe w Javie

    Testowanie oprogramowania 18 / 32

    objectTestResult

    interfaceTestListener

    objectTestFailure

    TestSuite TestCase

    Assert

    BaseTestRunner

    TestRunner

    błędy

    interfaceTest

  • JUnit – testy jednostkowe w Javie

    Testowanie oprogramowania 19 / 32

    PrzykładPrzetestujemy metodę max() z klasy java.lang.Math

    import org.junit.Test;import static org.junit.Assert.assertEquals;public class MyTestClass {

    @Testpublic void testMax() {

    //kod testujący}

    }

  • JUnit – testy jednostkowe w Javie

    Testowanie oprogramowania 20 / 32

    PrzykładTestujemy metodę max() z klasy java.lang.Math

    import org.junit.Test;import static org.junit.Assert.assertEquals;public class MyTestClass {

    @Testpublic void testMax() {

    assertEquals( 3, (int)Math.max(3,6) ); //oblanyassertEquals( 6, (int)Math.max(3,6) ); //zaliczony

    }}

  • CppUnit – testy jednostkowe w C++

    Testowanie oprogramowania 21 / 32

    1. Testowanie – wstęp2. Refaktoryzacja3. Pojęcia związane z testowaniem4. Programowanie sterowane testami5. Testy jednostkowe

    5.1. JUnit 5.2. CppUnit

    6. Testy integracyjne7. Testy systemowe8. Testy regresyjne9. Pozostałe testy

    10. Hierarchia testów11. Narzędzia wspomagające testowanie12. Źródła i przydatne linki

    http://cppunit.sourceforge.net

    •Podobnie jak Junit wspieraautomatyczne przeprowadzanietestów

    •klasy testujące dziedziczą po klasieCppUnit::TestCase i przykrywają metodę wirtualną runTest()

    • rezultat jest obiektem (referencją do obiektu)klasy CppUnit::TestResult

  • CppUnit – testy jednostkowe w C++

    Testowanie oprogramowania 22 / 32

    TestRunner

    Test

    TexTestRunnerTestResult

    TestSuite TestSuite

    TestCaller

    TestFixture

  • CppUnit – testy jednostkowe w C++

    Testowanie oprogramowania 23 / 32

    #include #include class Max_test : public CppUnit::TestCase {public: void runTest() { assert(max(1,2)==1); //sztucznie wprowadzony błąd! assert(max(2,1)==2);};

    PrzykładPrzetestujemy następującą funkcję max():

    int max (int a, int b) {if ( a > b ) {

    return a;}else {

    return b;}

    }Tworzymy klasę testującą:

  • CppUnit – testy jednostkowe w C++

    Testowanie oprogramowania 24 / 32

    PrzykładUruchamiamy test z klasy testującej:

    void main() {CppUnit::TestResult result;Max_test max;max.run( &result );

    }

  • Testy integracyjne

    Testowanie oprogramowania 25 / 32

    1. Testowanie – wstęp2. Refaktoryzacja3. Pojęcia związane z testowaniem4. Programowanie sterowane testami5. Testy jednostkowe

    5.1. JUnit 5.2. CppUnit

    6. Testy integracyjne7. Testy systemowe8. Testy regresyjne9. Pozostałe testy

    10. Hierarchia testów11. Narzędzia wspomagające testowanie12. Źródła i przydatne linki

    •sprawdzanie poprawności współpracy pomiędzy komponentami systemu

    •coraz większe grupy komponentówsą integrowane i testowane podkątem wzajemnej komunikacji (met. iteracyjna),do momentu przetestowania systemu jako całości

    •wykrywa usterki w interfejsach

  • Testy systemowe

    Testowanie oprogramowania 26 / 32

    1. Testowanie – wstęp2. Refaktoryzacja3. Pojęcia związane z testowaniem4. Programowanie sterowane testami5. Testy jednostkowe

    5.1. JUnit 5.2. CppUnit

    6. Testy integracyjne7. Testy systemowe8. Testy regresyjne9. Pozostałe testy

    10. Hierarchia testów11. Narzędzia wspomagające testowanie12. Źródła i przydatne linki

    • testowanie systemu z perspektywyużytkownika końcowego

    •przeprowadzane na kompletnym(w pełni zintegrowanym) systemie

    •badanie pod kątem spełnienia wymagań funkcjonalnych

    • testerzy umyślnie usiłują wywołać błędy, robiąc wszystko, czego tylko można się spodziewać po userze (ang. destructive attitude)

  • Testy regresyjne

    Testowanie oprogramowania 27 / 32

    1. Testowanie – wstęp2. Refaktoryzacja3. Pojęcia związane z testowaniem4. Programowanie sterowane testami5. Testy jednostkowe

    5.1. JUnit 5.2. CppUnit

    6. Testy integracyjne7. Testy systemowe8. Testy regresyjne9. Pozostałe testy

    10. Hierarchia testów 11. Narzędzia wspomagające testowanie12. Źródła i przydatne linki

    „Patch to poprawka do programu, usuwająca stare błędy i dodająca nowe.”

    Prawo Murphy'ego

    „Błędy pojawią się w jednej części działającego programu, kiedy zmienisz drugą, zupełnie z nią niepowiązaną”

    Prawo Murphy'ego

  • Testy regresyjne

    Testowanie oprogramowania 28 / 32

    •polegają na ponownym testowaniu fragmentu programu po wprowadzeniu modyfikacji

    •mają na celu upewnienie się, że wprowadzona poprawka/modyfikacja nie stworzyła nowych bugów w innych częściach programu

    •częstą metodą przeprowadzania jest ponowne uruchomienie wcześniej zaliczonych testów – sprawdzenie, czy nie pojawiają się nowe błędy

  • Pozostałe testy

    Testowanie oprogramowania 29 / 32

    1. Testowanie – wstęp2. Refaktoryzacja3. Pojęcia związane z testowaniem4. Programowanie sterowane testami5. Testy jednostkowe

    5.1. JUnit 5.2. CppUnit

    6. Testy integracyjne7. Testy systemowe8. Testy regresyjne9. Pozostałe testy

    10. Hierarchia testów11. Narzędzia wspomagające testowanie12. Źródła i przydatne linki

    • testowanie stworzonego systemu podkątem współpracy z innymi (system jako komponent)

    Testy integracyjno-systemowe

    • ostateczne testowanie gotowej aplikacji, gotowej do przekazania klientowi

    • klient może dokonać testów odbioru na własną rękę(UAT, ang. User Acceptance Testing)

    Testy odbioru

  • Hierarchia testów

    Testowanie oprogramowania 30 / 32

    testy jednostkowe

    testy integracyjne

    testy integracyjno-systemowe

    testy systemowe

    testy odbioru(developera)

    testy odbioru(klienta)

    poprawki

    testy regresyjne

    BŁĄD

    wykrycie błędu

    testowanie

  • Narzędzia wspomagające testowanie

    Testowanie oprogramowania 31 / 32

    1. Testowanie – wstęp2. Refaktoryzacja3. Pojęcia związane z testowaniem4. Programowanie sterowane testami5. Testy jednostkowe

    5.1. JUnit 5.2. CppUnit

    6. Testy integracyjne7. Testy systemowe8. Testy regresyjne9. Pozostałe testy

    10. Hierarchia testów11. Narzędzia wspomagające testowanie12. Źródła i przydatne linki

    xUnit umowna nazwa bibliotek/frameworków do testów jednostkowych dostępny dla wielu języków

    JIRA, trac, Bugzilla oprogramowanie wspomagające zarządzanie projektem, raportowanie błędów i usterek

    Canoo WebTest, WatiN otwarte narzędzia do efektywnego testowania aplikacji webowych

    JSystem narzędzie do zautomatyzowanego tworzenia testów systemowych

    więcej:

    http://www.opensourcetesting.org/

  • Źródła, dalsze informacje

    http://wazniak.mimuw.edu.pl/ [PL] (kurs Zaawansowane CPP, wykład 4 - „Testowanie”)

    http://en.wikipedia.org/wiki/Software_testing [EN] (bardzo rozbudowany artykuł)

    http://www.testinggeek.com/ [EN] (portal dla testerów)

    http://www.ece.cmu.edu/~koopman/des_s99/sw_testing/ [EN] (artykuł na temat testowania oprogramowania)

    Książki:

    „Software Testing: A Craftsman's Approach” Paul Jorgensen„Sztuka testowania oprogramowania” Glenford J. Myers

    Testowanie oprogramowania 32 / 32

    1. Testowanie – wstęp2. Refaktoryzacja3. Pojęcia związane z testowaniem4. Programowanie sterowane testami5. Testy jednostkowe

    5.1. JUnit 5.2. CppUnit

    6. Testy integracyjne7. Testy systemowe8. Testy regresyjne9. Pozostałe testy

    10. Hierarchia testów11. Narzędzia wspomagające testowanie12. Źródła i przydatne linki

    http://wazniak.mimuw.edu.pl/http://en.wikipedia.org/wiki/Software_testinghttp://www.testinggeek.com/http://www.ece.cmu.edu/~koopman/des_s99/sw_testing/

    TytułSpis treściTestowanie - po co?Slajd 4Slajd 5Slajd 6Slajd 7Slajd 8Slajd 9Slajd 10Slajd 11Slajd 12Slajd 13Slajd 14Slajd 15Slajd 16Slajd 17Slajd 18Slajd 19Slajd 20Slajd 21Slajd 22Slajd 23Slajd 24Slajd 25Slajd 26Slajd 27Slajd 28Slajd 29Slajd 30Slajd 31Slajd 32