Kurs języka Python. Wykład 11. Marcin Młotkowski. 4 stycznia Kontrola poprawności podczas biegu programu. 2 Testowanie oprogramowania

Podobne dokumenty
Kurs rozszerzony języka Python

Programowanie w Ruby

Testowanie aplikacji. Kurs języka Ruby

Spis treści. Funkcje. 1 Funkcje 1.1 Zadanie Zadanie Zadanie Zadanie Zadanie Zadanie Zadanie 7

Spis treści. Dekoratory. 1 Dekoratory 1.1 Zadanie Zadanie Zadanie Zadanie 4

Podstawy programowania w Pythonie

Zaawansowany kurs języka Python

Programowanie obiektowe

Python. Wprowadzenie. Jolanta Bachan

Zaawansowany kurs języka Python

Programowanie w Ruby

Testowanie II. Celem zajęć jest zapoznanie studentów z oceną jakości testów przy wykorzystaniu metryk pokrycia kodu testami (ang. code coverage).

Kurs rozszerzony języka Python

Zaawansowany kurs języka Python

Programowanie w Ruby

Sphinx - system dokumentacji dla Pythona

GNU GProf i GCov. przygotował: Krzysztof Jurczuk Politechnika Białostocka Wydział Informatyki Katedra Oprogramowania ul. Wiejska 45A Białystok

Kurs języka Python. Wątki

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

Język Python. Język Python 1/35

MS Visual Studio 2005 Team Suite - Performance Tool

Ćwiczenie 5. Python 3: Programowanie obiektowe i dziedziczenie

Kurs rozszerzony języka Python

Wstęp do programowania

Zaawansowane aplikacje WWW - laboratorium

rozdział 4: ZMIENNE I INSTRUKCJE

Wykład 7: Pakiety i Interfejsy

Język Python (3) Język Python (3) 1/35

Dekoratora używa się wstawiając linijkę zaczynającą się przed definicją dekorowanego obiektu (klasy czy funkcji).

Instrukcja 10 Laboratorium 13 Testy akceptacyjne z wykorzystaniem narzędzia FitNesse

Programowanie w języku Python. Grażyna Koba

Wprowadzenie do Python

Wstęp do programowania

Kurs rozszerzony języka Python

Testowanie II. Cel zajęć. Pokrycie kodu

Zaawansowany kurs języka Python

Testy aplikacji webowych

Pisząc kod w Pythonie na pewno już nie raz coś poszło nie tak i Shell wypisał komunikat o błędzie podobny do poniższego:

Laboratorium Wstawianie skryptu na stroną: 2. Komentarze: 3. Deklaracja zmiennych

Programowanie w Ruby

Testowanie I. Celem zajęć jest zapoznanie studentów z podstawami testowania ze szczególnym uwzględnieniem testowania jednostkowego.

Język Python (2) Język Python (2) 1/36

Podstawy programowania w Pythonie

Podstawy. Jan Koprowski Politechnika Gdańska, FTiMS Informatyka Stosowana

INTERNETOWE BAZY DANYCH materiały pomocnicze - wykład X

EPI: Interfejs Graficzny 2011/2012 Laboratorium nr 2 Programowanie obiektowe

Wstęp do programowania

Jeśli chcesz łatwo i szybko opanować podstawy C++, sięgnij po tę książkę.

Materiały do laboratorium MS ACCESS BASIC

Podstawy programowania: Python. Wprowadzenie. Jolanta Bachan

Języki i metody programowania

Wstęp do Pythona. Janusz Szwabiński. Python w obliczeniach numerycznych (C) 2005 Janusz Szwabiński p.1/36

Programowanie obiektowe

Środowisko programisty

DIAGRAMY SYNTAKTYCZNE JĘZYKA TURBO PASCAL 6.0

Podstawy bioinformatyki 2017/18

Kurs WWW. Paweł Rajba.

Programowanie w Ruby

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Sposoby wykrywania i usuwania błędów. Tomasz Borzyszkowski

Podstawy Informatyki. Algorytmy i ich poprawność

Kurs języka Python Wykład 8. Przetwarzanie tekstu Wyrażenia regularne Biblioteka urllib Parsowanie html'a XML

Wstęp do programowania

SQL w 24 godziny / Ryan Stephens, Arie D. Jones, Ron Plew. Warszawa, cop Spis treści

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

D:\DYDAKTYKA\ZAI_BIS\_Ćwiczenia_wzorce\04\04_poprawiony.doc 2009-lis-23, 17:44

Metaprogramowanie w Ruby

Wstęp do informatyki. stęp do informatyki Polecenia (cz.2)

Języki i techniki programowania Ćwiczenia 2

METODY PROGRAMOWANIA

Ada95 przetwarzanie rozproszone

Ada95 przetwarzanie rozproszone

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Programowanie obiektowe zastosowanie języka Java SE

Podstawy bioinformatyki 2017/18

WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Katalog książek cz. 3: Web Service

Python jest interpreterem poleceń. Mamy dwie możliwości wydawania owych poleceń:

Python wprowadzenie. Warszawa, 24 marca PROGRAMOWANIE I SZKOLENIA

Wprowadzenie do programowania w języku Visual Basic. Podstawowe instrukcje języka

Python wstęp do programowania dla użytkowników WCSS

Funkcje są prawdopodobnie najważniejszą częścią każdego poważnego programu (w każdym języku programowania).

Python podstawy programowania

Wyjątki. try - except

Wykład 4: Klasy i Metody

Język PL/SQL Procedury i funkcje składowane

Podstawy programowania. Python wykład 6

Podstawy języka C++ Maciej Trzebiński. Praktyki studenckie na LHC IFJ PAN. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. M. Trzebiński C++ 1/16

Wprowadzenie do metodologii modelowania systemów informacyjnych. Strategia (1) Strategia (2) Etapy Ŝycia systemu informacyjnego

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Redis, skrypty w języku Lua

Laboratorium z przedmiotu: Inżynieria Oprogramowania INP002017_ Laboratorium 11 Testy akceptacyjne z wykorzystaniem narzędzia FitNesse

Database Connectivity

Programowanie poprzez testy z wykorzystaniem JUnit

Podstawy wykorzystania bibliotek DLL w skryptach oprogramowania InTouch

Programowanie i projektowanie obiektowe

Programowanie i projektowanie obiektowe

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Aplikacje WWW - laboratorium

Transkrypt:

Wykład 11. 4 stycznia 2010 1 Kontrola poprawności podczas biegu programu 2 3 4

Asercje Asercja to formuła logiczna; Asercji używa się do kontrolowania czy np. wartość zmiennej ma odpowiedni typ lub mieści się w pożądanym zakresie; Do kontroli używa się instrukcji assert wyrażenie W przypadku niespełnienia wyrażenia zgłaszany jest wyjątek AssertionError

Przykład użycia asercji def dodaj(x, y): assert type(x) == type(1) assert type(y) == type(1) return x + y >>> dodaj( dwa, dwa ) Traceback (most recent call last): File "asercje.py", line 14, in <module> print dodaj("dwa", "dwa") File "asercje.py", line 6, in dodaj assert type(x) == type(1) AssertionError

Przykład użycia asercji def dodaj(x, y): assert type(x) == type(1) assert type(y) == type(1) return x + y >>> dodaj( dwa, dwa ) Traceback (most recent call last): File "asercje.py", line 14, in <module> print dodaj("dwa", "dwa") File "asercje.py", line 6, in dodaj assert type(x) == type(1) AssertionError

Uwagi Asercje spowalniają działanie programu.

Wyłączanie asercji Asercje są sprawdzane w zależności od zmiennej logicznej debug ; domyślna wartość: True; zmiennej debug nie można modyfikować w czasie wykonywania programu W przypadku uruchomienia programu z opcją -O (optymalizacja) wartością debug jest False.

Inne wykorzystanie debug if debug : print dodaj(2,2) print dodaj( dwa, dwa )

Wprowadzenie do testowania Test jednostkowy(ang. unit test) Test sprawdzający poprawność pojedynczego elementu oprogramowania: metody, klasy czy procedury. Zestaw testów (ang. test suite) Implementuje się zestawy testów, które można uruchomić automatycznie. Testy regresyjne Testy przeprowadzane po wprowadzeniu zmian do dobrze działającego kodu.

Wprowadzenie do testowania Test jednostkowy(ang. unit test) Test sprawdzający poprawność pojedynczego elementu oprogramowania: metody, klasy czy procedury. Zestaw testów (ang. test suite) Implementuje się zestawy testów, które można uruchomić automatycznie. Testy regresyjne Testy przeprowadzane po wprowadzeniu zmian do dobrze działającego kodu.

Wprowadzenie do testowania Test jednostkowy(ang. unit test) Test sprawdzający poprawność pojedynczego elementu oprogramowania: metody, klasy czy procedury. Zestaw testów (ang. test suite) Implementuje się zestawy testów, które można uruchomić automatycznie. Testy regresyjne Testy przeprowadzane po wprowadzeniu zmian do dobrze działającego kodu.

Testy jednostkowe Testy jednostkowe można traktować jako specyfikację klasy bądź modułu.

Testowanie Co jest testowane: czy poprawne dane dają poprawny wynik; czy niepoprawne dane dają oczekiwany (np. niepoprawny wynik) lub wyjątek.

Narzędzia do testowania w Pythonie PyUnit PyDoc

Zadanie Napisać funkcję decapitalize z argumentem typu string i zwracającą string Unifikacja imienia i nazwiska do postaci Imie Nazwisko, np. decapitalize( JAN KOWALSKI ): Jan Kowalski Kontrola typu, gdy argument nie jest typu string, zgłaszany jest wyjątek ArgumentNotStringError

PyUnit Testy są zebrane w odrębnym pliku (plikach) Można wskazywać, jakie testy mają być wykonane

Implementacja class ArgumentNotStringError(Exception): pass def decapitalize(nazwisko): """ Zamiana napisów (imion i nazwisk) pisanych wielkimi literami """

Unittest Implementacja import unittest import types class TestDeCapitalize(unittest.TestCase):

Zamiana na poprawną postać znanewartosci = [ ("jan KoWaLski", "Jan Kowalski"), ("claude levi-strauss", "Claude Levi-Strauss"), ("JeRzy august MniSzEch", "Jerzy August Mniszech") ] class TestdeCapitalize def testprosty(self): """Proste sprawdzenia""" for zly, dobry in self.znanewartosci: res = decapitalize(zly) self.assertequal(dobry, res)

Test na identyczność definicja danych listanazwisk = [ "Benedykt Polak", "Fryderyk Joliot-Curie"] def testident(self): """Nie zamieni poprawnych nazwisk""" for nazw in self.listanazwisk: self.assertequal(nazw, decapitalize(nazw), "Zmiana poprawnego nazwiska!")

Niepoprawne wyniki psuj = [ ("SpYtko z MeLsztyna", "Spytko z Melsztyna"), ("SkaRbiMIr Z rodu AwDańców", "Skarbimir z rodu Awdańców"), ] def testzly(self): """Nie radzi sobie""" for zly, dobry in self.psuj: res = decapitalize(zly) self.assertnotequal(dobry, res)

Przypomnienie class ArgumentNotStringError(Exception): pass def decapitalize(nazwisko): """ Zamiana napisów (imion i nazwisk) pisanych wielkimi literami """ if type(nazwisko)!= types.stringtype: raise ArgumentNotStringError Metoda testująca def testdziedzina(self): self.assertraises(argumentnotstringerror, decapitalize, 10)

Podsumowanie testy.py import unittest, types import testowany_modul class TestdeCapitalize(unittest.TestCase): def testprosty(self):... def testident(self):... def testdziedzina(self):... if name == " main ": unittest.main()

Uzupełnienie Metoda TestDeCapitalize.setUp(self) Inicjowanie wstępne wykonywane przed każdym testem (zakładanie baz danych i tabel, tworzenie plików/tabel z przykładowymi danymi). Metoda TestDeCapitalize.tearDown(self) sprzątanie wykonywane po każdym teście (usuwanie tymczasowych plików etc).

Uzupełnienie Metoda TestDeCapitalize.setUp(self) Inicjowanie wstępne wykonywane przed każdym testem (zakładanie baz danych i tabel, tworzenie plików/tabel z przykładowymi danymi). Metoda TestDeCapitalize.tearDown(self) sprzątanie wykonywane po każdym teście (usuwanie tymczasowych plików etc).

Uruchomienie python testy.py -v testdziedzina ( main.testy)... ok Nie zamieni poprawnych nazwisk... ok Proste sprawdzenia... ok Nie radzi sobie... ok -------------------------------------------- Ran 5 tests in 0.001s OK

Zarządzanie zestawami testów zestaw_testow.py s1 = TestyDeCapitalize() s2 = modul.innetesty() alltests = unittest.testsuite([s1, s2]) unittest.texttestrunner(verbosity=3).run(alltests)

Testowanie za pomocą pakietu doctest Przypomnnienie print modul. doc help(modul)

Testy w komentarzach def decapitalize(nazwisko): """ Zamiana napisów (nazwisk) pisanych wielkimi literami. Przykłady: >>> [decapitalize(n) for n in [ Kaz WieLki, Stefan Batory ]] [ Kaz Wielki, Stefan Batory ] >>> decapitalize( Henryk Walezy ) Henryk Walezy >>> decapitalize(2) Traceback (most recent call last):... ArgumentNotStringError """

Uruchomienie testów if name == " main ": import doctest doctest.testmod()

doctest wynik Trying: [decapitalize(n) for n in [ KazImieRz WieLki, Stefan Batory ]] Expecting: [ Kazimierz Wielki, Stefan Batory ] ok Trying: decapitalize( Henryk Walezy ) Expecting: Henryk Walezy ok

Trying: decapitalize(2) Expecting: Traceback (most recent call last):... ArgumentNotStringError ok

2 items had no tests: main main.argumentnotstringerror 1 items passed all tests: 3 tests in main.decapitalize 3 tests in 3 items. 3 passed and 0 failed. Test passed.

Pomiar wydajności fragmentu kodu Klasa timeit.timer import timeit t = timeit.timer(stmt= [6,5,4,3,2,1].sort() ) print czas %.2f sec % t.timeit() Python 2.6 import timeit print czas %.2f sec % timeit.timeit(stmt= [6,5,4,3,2,1].sort() )

Pomiar wydajności fragmentu kodu Klasa timeit.timer import timeit t = timeit.timer(stmt= [6,5,4,3,2,1].sort() ) print czas %.2f sec % t.timeit() Python 2.6 import timeit print czas %.2f sec % timeit.timeit(stmt= [6,5,4,3,2,1].sort() )

Pomiar wydajności całego programu Z linii poleceń $ python -m timeit [3,2,1].sort() Wynik 1000000 loops, best of 3: 0.483 usec per loop

Profilowanie Profilowanie dostarcza informacji o czasie wykonywania poszczególnych funcji, liczbie wywołań etc.

Przykład profilowania Wywołanie $ python -m profile my_doctest.py Wynik 19287 function calls (19035 primitive calls) in 0.350 CPU sec ncalls tottime percall cumtime percall filename:lineno(function) Ordered by: standard name 1 0.000 0.000 0.010 0.010 :0( import ) 3 0.000 0.000 0.000 0.000 :0(_getframe) 1 0.000 0.000 0.000 0.000 :0(allocate_lock) 1436 0.000 0.000 0.000 0.000 :0(append) 4 0.000 0.000 0.000 0.000 :0(callable)

pdb Wywołanie $ python -m pdb mymodule.py (pdb) help (pdb)