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