Dlaczego piszemy fałszywe obiekty podczas pisania testów jednostkowych?

11

Obecnie piszemy przypadki testów jednostkowych w naszym projekcie. Implementacje metod bazodanowych istnieją i działają dobrze. W takim przypadku dlaczego musimy pisać fałszywe obiekty? Czy jest jakiś konkretny powód? Dlaczego nie mogę bezpośrednio przetestować implementacji DAO?

Vinoth Kumar CM
źródło

Odpowiedzi:

6

Nie powinieneś kpić z połączeń do bazy danych, ponieważ to zniweczy cel. To, co POWINIENEŚ robić, to na przykład połączenia do DAO z, powiedzmy, warstwy usług. Wyśmiewanie pozwala testować metody w izolacji.

Załóżmy, że masz symulację restauracji z architekturą taką jak ta:

Cook <=> Server <=> Customer

Chcesz przetestować każdą warstwę niezależnie. Tutaj Serverjest twoja warstwa usług i Cookmożna ją traktować jako DAO. To, Serverco chcesz kpić podczas testowania Customer, i Cookto, co chcesz kpić podczas testowania Server. Te Cooktesty jednostkowe, jednak należy upewnić się, że realizacja wraca hamburger hamburger kiedy kazano i nie gumową oponę.

Tyler Treat
źródło
3
Nie zgadzam się ze stwierdzeniem, że nie powinieneś wyśmiewać połączeń z bazą danych, ponieważ to by pomogło. ponieważ wydaje się to zbyt ogólne. Jak mówią inni poniżej, musisz przetestować wszystko w izolacji. Jeśli testowaną jednostką jest dostęp do bazy danych, na pewno Twój komentarz jest poprawny. Jeśli testowaną jednostką nie jest dostęp do bazy danych, pierwsze zdanie jest niepoprawne. Zgadzam się ze wszystkim, co mówisz. +0. :-)
Peter K.
6

Testowanie businesslogic razem z bazą danych jest w porządku. ale testy te nazywane są testami integracji, nawet jeśli używasz nunit lub junit lub phpunit do ich wykonania.

Unittest to testy spezializowane, w których ważne jest testowanie w izolacji (tj. Logika biznesowa bez bazy danych). Egzekwowanie / udawanie / ogłuszenie są używane do wymuszenia tej izolacji.

k3b
źródło
2

Po prostu: testowanie rzeczywistej zawartości DAO, a nie zawartości bazy danych.

Załóżmy, że twoja klasa DAO Person ma metodę getByName (). Piszesz test i wywołujesz Person.getByName („John Smith”). Załóżmy, że test się nie powiedzie, ponieważ ktoś usunął rekord Johna z bazy danych. Teraz każde oprogramowanie CI i twoi przełożeni / recenzenci mogą twierdzić, że twoje oprogramowanie jest wadliwe, podczas gdy w rzeczywistości tak nie jest. Jeśli wyśmiewasz DB, możesz udowodnić, że DAO działa, jeśli ma poprawny wiersz z właściwej tabeli.

Jeśli naprawdę chcesz przetestować samą bazę danych, tj .: jeśli wykonanie określonej metody DAO spowoduje umieszczenie danych w określonym stanie, jest to również możliwe. Co więcej, jest to naprawdę pomocne w przypadku zwariowanych modeli danych (EAV, zagnieżdżony zestaw drzew), w których nie można oczekiwać, że baza danych zapewni kuloodporność. Spójrz na DBUnit, aby ułatwić Ci życie.

Jacek Prucia
źródło
1

Innym powodem jest uniknięcie czasu wykonywania poleceń bazy danych. Może to nie wydawać się dużo, ale narzut związany z konfigurowaniem i rozrywaniem połączeń ostatecznie się zsumuje i najprawdopodobniej znacznie wydłuży całkowity czas uruchomienia zestawu testowego w porównaniu z użyciem próbnych obiektów.

Jeremy
źródło
0

Aby wyizolować testowaną klasę. Albo jeśli test się nie powiedzie, skąd wiesz, że problem dotyczy testowanej klasy lub jednej z jej zależności.

Craig
źródło
Czy bezpośrednio wywołujesz i testujesz metody implantacji DAO?
Vinoth Kumar CM