2008-10-28 11 views
12

Jaka jest najlepsza praktyka w testowaniu interfejsu API, który zależy od danych z bazy danych? Na jakie problemy muszę zwracać uwagę w środowisku "Ciągłej integracji", które uruchamia testy jednostek w ramach procesu budowania? Chodzi mi o to, czy wdrożysz swoją bazę danych jako część skryptów budujących (może uruchomić twój instalator), czy też powinienem iść na dane zakodowane na stałe [użyj testów MSTest opartych na sterowaniu danymi z XML]?Testy danych sterowane danymi

Rozumiem, że mogę sfałszować warstwę danych dla warstwy Business Logic, ale co, gdybym miał problemy z instrukcjami SQL w DAL? Muszę trafić w bazę danych, prawda?

Cóż ... to jest torrent pytań:) ... Myśli?

Odpowiedz

5

O ile to możliwe, powinieneś wyszydzić kod, aby uniknąć trafienia w bazę danych, ale wydaje mi się, że masz rację co do potrzeby przetestowania kodu SQL w dowolnym miejscu. Jeśli piszesz testy, które trafiają do bazy danych, kluczową wskazówką do unikania bólu głowy jest upewnienie się, że twoja konfiguracja dostaje dane do znanego stanu, zamiast polegać na tym, że już są odpowiednie dane.

I oczywiście nigdy nie testuj w oparciu o bieżącą bazę danych! Ale to jest oczywiste :)

+0

Proste usunięcie wszystkich danych w metodzie SetUp i wykonanie ręcznie dostosowanego SQL jako pierwszego kroku w testowych przypadkach testowania bazy danych, prawda? – Kasper

+0

@Kasper - Zakłada, że ​​masz już skonfigurowaną bazę danych [idealnie, uruchamiając skrypty SQL z kompilacji] ... Kiedy masz zbyt wiele urządzeń testowych, najlepszym sposobem, jak sądzę, jest skonfigurowanie bazy danych z danymi początkowymi . –

0

Jedną z rzeczy, którą zrobiłem, było stworzenie statycznych metod, które zwróciły dane testowe o znanym stanie. Następnie użyłbym "fałszywego" DAL, aby zwrócić te dane, tak jakbym faktycznie dzwonił do bazy danych. Jeśli chodzi o testowanie procedury sql/stored, przetestowałem ją za pomocą SQL Management Studio. YMMV!

+0

Co jeśli SQL jest generowany dynamicznie - np. różne klauzule WHERE itp.? – andygeers

3

Dobrym pomysłem jest automatyczne wyczyszczenie testowej bazy danych, a następnie zapełnienie jej danymi przewodów testowych, które zostaną uznane za dostępne dla wszystkich testów wymagających połączenia z bazą danych. Baza danych musi zostać zresetowana przed każdym testem w celu właściwego odizolowania - test, który powoduje błędy, może spowodować fałszywe niepowodzenia w następnych testach i stanie się nieprzyjemny, jeśli testy będą wykonywane w określonej kolejności, aby uzyskać spójne wyniki.

Możesz wyczyścić i wypełnić bazę danych narzędziami (DBUnit, DBUnit.NET, inne) lub po prostu utworzyć własne klasy narzędziowe, aby zrobić to samo.

Tak jak powiedziałeś, inne warstwy powinny być w wystarczającym stopniu oddzielone od klas, które faktycznie trafiają do bazy danych, więc potrzeba jakiegokolwiek rodzaju bazy danych biorącej udział w testowaniu jest ograniczona do testów przeprowadzanych na małym podzbiorze twojej bazy kodów. Twoje komponenty dostępu do bazy danych mogą być wyśmiewane/skrótowe dla wszystkiego, co zależy od nich.

5

Jak wspomniano, użyj szyderstwa do symulacji wywołań DB w testach jednostkowych, chyba że chcesz bez końca przeplatać swoje testy i dane. Testowanie instrukcji sql sugeruje więcej integration test. Uciekaj oddzielnie od testów jednostkowych, są to 2 różne bestie.

+0

Andrew, nie jestem pewien ... Czy mówisz, że DAL nie może/nie powinien być testowany w jednostce, ale testowany podczas integracji? –

+0

Jeśli wyrzuciłeś swój własny DAL, powinieneś bezwzględnie go przetestować. Chodzi mi o to, że testowanie jednostkowe będzie znacznie czystsze przy użyciu makr, a nie rzeczywistych wywołań baz danych. To może nie być możliwe w twoim przypadku, ale jeśli możesz udawać, że to wszystko robisz. –