Asercja () – predykat (forma zdaniowa w danym języku, która zwraca prawdę lub fałsz), umieszczony w pewnym miejscu w kodzie. Asercja wskazuje, że programista zakłada, że ów predykat jest w danym miejscu prawdziwy. W przypadku gdy predykat jest fałszywy asercja powoduje skutki zdefiniowane przez dany język lub zmienne środowiskowe programu. Może to być przykładowo jego przerwanie z odpowiednim wyjątkiem lub zalogowanie informacji.
Istotną własnością asercji, która odróżnia ją od wyjątków, jest założenie (choć nie zawsze wymuszane technicznie), że sprawdzany predykat nie może wystąpić i jej wykonanie dowodzi niepoprawność programu.
Historia asercji w oprogramowaniu sięga lat 50. XX wieku, gdy Alan Turing zauważył istotę weryfikacji poprawności programu komputerowego. Zautomatyzowanie tego procesu zostało zaproponowane i wprowadzone w drugiej połowie lat 60. XX wieku. Koncepcja asercji jest związana z rozwojem formalnych metod weryfikacji programów (zob. asercja (logika)). W 1969 roku Hoare opisał system logiczny wykorzystujący tzw. trójki Hoare'a do formułowania i dowodzenia własności programów.
Zastosowania
W programowaniu kontraktowym Asercje są jednym z podstawowych mechanizmów programowania kontraktowego. W tym ujęciu służą do formalnego wyrażania założeń dotyczących działania programu (na przykład niezmienników).
W testowaniu oprogramowania Asercja ma szczególne zastosowanie w trakcie testowania tworzonego oprogramowania, może być wykorzystywana np. dla sprawdzenia luk lub jego odporności na błędy. Asercje są powszechnie stosowane w testach jednostkowych do sprawdzania, czy uzyskany rezultat odpowiada oczekiwanemu..
Podstawową zaletą stosowania asercji jest możliwość sprawdzenia, w którym fragmencie kodu źródłowego programu nastąpił błąd lub błędne dane wejściowe. Inną zaletą jest również funkcja dokumentacyjna asercji, ponieważ opisują one założenia autora kodu wprost w jego kodzie źródłowym. Badania przeglądowe wskazują, że głównym problemem programistów w użyciu asercji jest poprawne zdefiniowanie , czyli punktu odniesienia, określającego poprawność oprogramowania, a tym samym treść asercji.
Warto zaznaczyć, że asercje są równie istotne i potrzebne na dalszych etapach cyklu życia oprogramowania – wdrożenia i utrzymania.
Przykłady użycia asercji Asercja z wiadomością błędu w języku Python:def calculate_area(radius): assert radius > 0, "Promień musi być większy od 0." return 3.14 * radius * radius
# poniższe wywołanie spowoduje błąd z wiadomością błędu zdefiniowaną powyżej print(calculate_area(-5))Przykład asercji w języku Java:
int totalUsers = countNumberOfUsers(); // przed kontynuacją wykonania zakładamy, że istnieje choć jeden użytkownik assert(totalUsers > 0) Niektóre biblioteki mogą udostępniać własne mechanizmy asercji. Przykładowo framework Jest dla języka JavaScript udostępnia funkcję expect:test('the best flavor is grapefruit', () => { expect(bestLaCroixFlavor()).toBe('grapefruit'); });
Implementacja asercji W języku Python asercja sprowadza się do poniższego uproszczenia:
if __debug__: if not expression: raise AssertionErrorW Pythonie instrukcje assert mogą zostać wyłączone przy uruchomieniu interpretera z opcją -O, na co wskazuje warunkowa zmienna __debug__ w powyższym przykładzie.
Natomiast język Java w uproszczony sposób definiuje asercje następująco:public class Assert { public static void true(bool condition, string message) { if (!condition) throw new AssertionException(message);
public static void notNull(object o) { if (o == null) throw new NullReferenceException();
public static void cantReach(string message) { throw new UnreachableCodeException(message);
public static void impossibleException(Throwable e, string message) { throw new UnreachableCodeException(e, message);
Linki zewnętrzne
Zbiór przykładowych implementacji, używających asercji w różnych językach
Przypisy
Kategoria:Analiza programów