Architektura warstwowa (eng. Layered Architecture) to popularny wzorzec przy tworzeniu oprogramowania, który opiera się na rozdzieleniu interfejsu użytkownika, logiki i persystencji danych na osobne warstwy.

Możliwość podzielenia projektu na warstwy sprawia, że przetestowanie każdej z osobna jest nie tylko prostsze, ale również szybsze i co ważne dokładniejsze niż w przypadku testowania aplikacji jako całość.

Jeśli testy w projekcie nie opierają się na rozbiciu, wtedy nie wykorzystujemy pełnego potencjału jaki niesie to podejście. To tak jak korzystać z urządzeń elektrycznych, bez podłączania ich do prądu.

Jednak nie da się ukryć, że podział na warstwy pociąga za sobą również pewne koszty.

Pierwszym z nich jest fakt, że biznesowe szczegóły są rozłożone na wszystkie warstwy. W praktyce oznacza to, że chcąc zrozumieć dowolną funkcjonalność w projekcie, konieczne jest przejście przez każdą z warstw z osobna.

Drugim kosztem są możliwe negatywne konsekwencje wprowadzania zmian w projekcie. W omawianym podejściu, górne warstwy są zależne od dolnych, a więc jeśli dokonamy zmiany w dolnej warstwie, to ta zmiana może spowodować kaskadowe wprowadzenie modyfikacji we wszystkich górnych warstwach skończywszy na warstwie prezentacji.