https://docs.python.org/3/library/doctest.html
Podstawowym sposobem umieszczania kodu samosprawdzającego moduł Pythona jest wykorzystanie zmiennej __name__. Bardziej zaawansowane narzędzia testujące oferują moduły doctest i unittest z biblioteki standardowej. Moduł unittest2 to backport nowych możliwości z Pythona 2.7 do Pythona 2.4-2.6. Moduły nose i pytest to dodatkowe narzędzia do pisania testów z lekką składnią.
def average(values):
"""Oblicza średnią arytmetyczną listy liczb.
>>> average([20, 30, 70])
40.0
"""
return sum(values, 0.0) / len(values)
if __name__ == "__main__":
import doctest
doctest.testmod() # automatyczne sprawdzanie wbudowanych testów
# Sprawdzanie przykładów podanych w pliku tekstowym.
# Zawartość pliku jet traktowana jako jeden wielki docstring.
import doctest
doctest.testfile("example.txt")
Moduł 'pytest' należy do biblioteki standardowej od Pythona 3.6.
# Przykładowy plik z testami test_sample.py ('test' w nazwie pliku).
def inc(x):
return x + 1
def test_answer(): # 'test' w nazwie funkcji
assert inc(3) == 5 # intentional error, 'assert' is used
# Testy uruchamiamy w powłoce systemu operacyjnego poleceniem 'pytest',
# tak działa 'discovery mode'.
Moduł służy do testowania czasu wykonania małych kawałków kodu. Do testowania większych bloków kodu: profile, pstats.
Głównym elementem modułu jest klasa Timer(stmt="pass", setup="pass").
Metoda repeat(self, repeat=3, number=1000000) -
wywołanie timeit() kilka razy (zwraca listę wyników).
Metoda timeit(self, number=1000000) -
najpierw następuje pojedyncze wykonanie poleceń z setup,
a potem number wykonań stmt.
import timeit # help(timeit) # Często przydaje się średnik do rozdzielania poleceń. t1 = timeit.Timer(stmt="t=a ; a=b ; b=t", setup="a=1 ; b=2") t2 = timeit.Timer(stmt="(a,b) = (b,a)", setup="a=1 ; b=2") print(t1.timeit()) # domyślnie milion wykonań print(t2.timeit()) print(t2.repeat(5)) # zwraca listę 5 wyników print(min(t2.repeat(10))) # to jest zwykle miarodajne, a nie średnia
import timeit # Można budować polecenia wielowierszowe. s = """\ pierwszy wiersz drugi wiersz """ t = timeit.Timer(stmt=s) print(t.timeit())
import random
import timeit
def mysort(L, left, right):
L[left: right+1] = sorted(L[left: right+1])
lista = list(range(1000))
random.shuffle(lista)
t1 = timeit.Timer(stmt="mysort(lista, 0, len(lista)-1)",
setup="from __main__ import mysort, lista")
print(t1.timeit(1)) # pojedyncze wykonanie
# Od Pythona 2.6 można przekazywać obiekty callable bez argumentów.
import random
import timeit
def mysort(L, left, right):
L[left: right+1] = sorted(L[left: right+1])
lista = list(range(1000))
random.shuffle(lista)
t1 = timeit.Timer(lambda: mysort(lista, 0, len(lista)-1))
print(t1.timeit(1)) # pojedyncze wykonanie
Typ Enum został dodany do Pythona 3.4 (PEP 0435 -- Adding an Enum type to the Python standard library).
from enum import Enum
# from enum import IntEnum # można porównywać z int
class Color(Enum):
red = 1
green = 2
blue = 3
for c in Color:
print(c)
# Color.red
# Color.green
# Color.blue