Testy z bazą danych – założenia
Poprzednio przedstawiłem próby napisania testów jednostkowych do kodu używającego bazy danych. Opisałem dwa podejścia, które okazały się całkowitą klapą oraz trzecie, dające całkiem dobre perspektywy. W związku z tym napisałem mechanizm pozwalający na odpalanie testów na bazie danych, którego wstępne wymagania znajdują się poniżej.
Założenia
Oto założenia, jakie mi przyświecały podczas pisania mechanizmu do testowania oraz których będę się trzymał podczas jego rozwoju.
- Automatyczne przygotowywanie bazy — Żaden test nie powinien się martwić o istnienie bazy danych. Powinna ona być dostępna dla niego zawsze, bez problemu. Powinno być przeźroczyste, czy jest tworzona, kopiowana, czy wyczarowywana.
- Automatyczne czyszczenie bazy — Żaden test nie powinien posiadać logiki odpowiedzialnej za czyszczenie bazy. Podobnie jak z tworzeniem bazy, powinno to się dziać automatycznie. Bez konieczności pisania ani jednej linii kodu. Nawet w sytuacji niepowodzenia testu.
- Otwartość na optymalizacje — Jeżeli powyższe dwa punkty uda się spełnić, to możliwa będzie zmiana podejścia tworzenia/usuwania bazy danych bez konieczności modyfikacji istniejących testów.
- Równoległość — Testy integracyjne na bazie danych zazwyczaj trwają długo. Zatem chciałbym, aby była możliwość odpalania wielu z nich w tym samym czasie.
Przykładowy kod testu
Poniżej jest przykładowy test operujący na bazie danych. Poniższa klasa testowa musi dziedziczyć po klasie bazowej i interfejsie IDIsposable (chociaż mam nadzieje, że ta konieczność zostanie zmieniona przy kolejnych wersjach XUnita). Dzięki temu w teście jest dostępna właściwość `context’, zapewniająca dostęp do istniejącej i gotowej do działania bazy danych.
public class DeviceRegisterTest : IsTableBusyDatabaseTest, IDisposable { [Fact] public void Register_new_device() { DeviceRegister deviceRegister = new DeviceRegister(context); Guid deviceGuid = deviceRegister.Register(); deviceGuid.Should().NotBeEmpty(); context.Devices.Count(x => x.Guid == deviceGuid).Should().Be(1); } }
Jak uważasz, czy kod testu wygląda czysto? Czy jest tam jakaś nadmiarowość? Jeżeli masz jakieś sugestie lub uwagi to zapraszam do dyskusji. Jeżeli jesteś zainteresowany co kryje się głębiej to już zapraszam do następnej części. Jeżeli zastanawia się geneza tego rozwiązania to zapraszam do poprzedniej części.
2 Komentarze
Mateusz Rus · 2020-01-11 o 14:07
Podoba mi się taki prosty i krótki styl pisania! Oby tak dalej :)
Pozdrawiam, Mateusz.
Jerzy Wickowski · 2020-01-13 o 11:41
Cześć @Mateusz.
Dziękuję ślicznie za miłe słowa.
Pozdrawiam :)