fbpx

Testy z bazą danych – założenia

Opublikowane przez Jerzy Wickowski w dniu

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.



Czy to był wartościowy artykuł? Zapisz się, a wyślę Ci dwa ebooki o czystym kodzie oraz będę informował Cię o nowych postach

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 :)

Dodaj komentarz

Twój adres email nie zostanie opublikowany.

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.


    Zapisz się

    Wyślę Ci dwa dokumenty mówiące o jakości kodu. Dodatkowo będę Cię informował o nowych postach i nowościach.