Jak zrobić testów jednostkowych I wytrwałości?

głosy
43

Jako nowicjusz w praktykowaniu Test-Driven Development, często kończy się w rozterce, jak do jednostki testowej wytrwałości do bazy danych.

Wiem, że technicznie będzie to próba integracji (nie test jednostki), ale chcę, aby dowiedzieć się najlepsze strategie dla następujących elementów:

  1. zapytań testowych.
  2. Testowanie wkładki. Skąd mam wiedzieć, że wkładka że poszło nie tak, jeśli to się nie powiedzie? Mogę przetestować go poprzez włożenie i zapytań, ale skąd mam wiedzieć, że zapytanie nie było źle?
  3. Testowanie aktualizacje i usuwa - tak samo jak wkładek testowych

Jakie są najlepsze praktyki dla nich robi?


Jeśli chodzi o testowanie SQL: Zdaję sobie sprawę, że może to być zrobione, ale jeśli mogę użyć mapowania O / R jak NHibernate, przywiązuje niektóre brodawki nazewnictwa w aliasów wykorzystywane do zapytań wyjściowych, a jako że jest nieco nieprzewidywalny nie jestem pewien mogę za to przetestować.

Należy po prostu, porzucić wszystko i po prostu zaufać NHibernate? Nie jestem pewien, że jest ostrożny.

Utwórz 05/08/2008 o 10:43
źródło użytkownik
W innych językach...                            


10 odpowiedzi

głosy
16

Spójrz w bloku DB. Jest to biblioteka Java, ale nie musi być C # równoważne. Pozwala przygotować bazę danych ze zbioru danych, aby wiedzieć, co jest w bazie danych, można współpracować z DB jednostki, aby zobaczyć, co jest w bazie danych. Można go uruchomić na wielu systemach bazodanowych, dzięki czemu można korzystać z rzeczywistej konfiguracji bazy danych lub użyć czegoś innego, jak HSQL w Java (Java Database implementację z in opcją pamięci).

Jeśli chcesz sprawdzić, czy kod jest przy użyciu bazy danych poprawnie (który najprawdopodobniej należy robić), to jest do zrobienia, aby odizolować każdy test i zapewnienia bazy danych został oczekiwano dane przygotowane.

Odpowiedział 11/08/2008 o 10:40
źródło użytkownik

głosy
15

Jak powiedział Mike Kamień , DBUnit jest świetne do poruszania bazę do znanego stanu przed uruchomieniem swoich testów. Gdy testy są zakończone, DBUnit można umieścić bazę danych z powrotem do stanu, w jakim znajdował się przed prowadził badania.

DBUnit (Java)

DbUnit.NET

Odpowiedział 25/08/2008 o 14:22
źródło użytkownik

głosy
4

Robisz testów jednostkowych przez wyśmianie się połączenie z bazą danych. W ten sposób można budować scenariusze gdzie konkretne zapytania w przepływie wywołanie metody uda lub nie. I zazwyczaj budować makiety moje oczekiwania tak, że rzeczywisty tekst kwerendy jest ignorowany, bo naprawdę chcę, aby przetestować odporność na uszkodzenia metody i jak obsługuje się - specyfika SQL są nieistotne dla realizacji tego celu.

Oczywiście to oznacza, że test nie będzie faktycznie zweryfikować, że metoda działa , ponieważ SQL mogą być błędne. To gdzie testy integracyjne kopać. Do tego spodziewam ktoś inny będzie mieć bardziej dokładną odpowiedź, a ja dopiero się uporać z tymi siebie.

Odpowiedział 05/08/2008 o 10:47
źródło użytkownik

głosy
3

Napisałem post tutaj dotycząca testów jednostkowych warstwy danych , która obejmuje dokładnie ten problem. Przepraszamy za haniebną) (wtyczki, ale artykuł jest zbyt długi, aby opublikować tutaj.

Mam nadzieję, że pomaga - to bardzo dobrze dla mnie w ciągu ostatnich 6 miesięcy na 3 aktywnych projektów.

Pozdrowienia,

Rob G

Odpowiedział 13/08/2008 o 00:23
źródło użytkownik

głosy
2

W przypadku projektów opartych JDBC, ministrant ramy można stosować: http://acolyte.eu.org . Pozwala to makieta dostęp do danych, które chcesz testów, korzystając z JDBC abstrakcji, bez konieczności zarządzania konkretną DB testową.

Odpowiedział 09/07/2014 o 10:20
źródło użytkownik

głosy
2

Dla NHibernate, Zdecydowanie opowiadają po prostu drwi się z NHibernate APIdo testów jednostkowych - zaufaj bibliotekę zrobić dobry uczynek. Jeśli chcesz się upewnić, że dane faktycznie idzie do DB, zrobić test integracji.

Odpowiedział 05/08/2008 o 12:20
źródło użytkownik

głosy
2

Problem doznałem podczas testowania jednostka wytrwałości, zwłaszcza bez ORM, a tym samym wyśmianie bazy danych (połączenia), jest to, że tak naprawdę nie wiem, czy Twoje zapytania sukces. To może być to, że Twoje zapytania są specjalnie zaprojektowane dla konkretnej wersji bazy danych i odnieść sukces tylko z tą wersją. Nigdy się tego dowiedzieć, jeśli mock bazy danych. Więc moim zdaniem, testowanie jednostkowe wytrwałość jest tylko ograniczone zastosowanie. Zawsze należy dodać testy uruchomione przed docelowej bazy danych.

Odpowiedział 05/08/2008 o 11:29
źródło użytkownik

głosy
1

I zazwyczaj stworzyć repozytorium i używać, aby uratować moje podmiot, a następnie pobrać nową. Potem twierdzić, że pobierana jest równa zapisane.

Odpowiedział 27/08/2008 o 22:17
źródło użytkownik

głosy
1

testy jednostkowe technicznie z wytrwałością nie są testy jednostkowe są one testy integracyjne.

Z C # za pomocą MbUnit, wystarczy użyć funkcji przywracania i atrybuty SqlRestoreInfo

    [TestFixture]
    [SqlRestoreInfo(<connectionsting>, <name>,<backupLocation>]
    public class Tests
    {

        [SetUp]
        public void Setup()
        {

        }

        [Test]
        [RollBack]
        public void TEST()
        {
           //test insert. 
        }
    }

To samo można zrobić w NUnit, excpet nazwy atrybutów różnią Slighty.

Jeśli chodzi o sprawdzenie, czy zapytanie było succeful, zazwyczaj trzeba wykonać go z drugim zapytaniem, czy baza danych została zmieniona zgodnie z oczekiwaniami.

Odpowiedział 05/08/2008 o 12:27
źródło użytkownik

głosy
1

Chciałbym również mock bazy danych i sprawdzić, czy pytania są zgodne z oczekiwaniami. Istnieje ryzyko, że test sprawdza złego sql, ale byłoby to wykryte w testach integracyjnych

Odpowiedział 05/08/2008 o 11:19
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more