Gdy właściwość jest zdefiniowana w produkcyjnej bazie danych (lub klonie do testowania), nie jest to test jednostkowy . Test jednostkowy sprawdza jednostkę pracy i nie wymaga określonego stanu zewnętrznego do pracy. Zakłada się, że Offer1
baza danych jest zdefiniowana jako oferta tylko dla mężczyzn. To jest stan zewnętrzny. Jest to więc bardziej test integracyjny , w szczególności test systemowy lub test akceptacyjny . Zauważ, że testy akceptacyjne często nie są wykonywane skryptami (nie są uruchamiane w ramach testów, ale wykonywane ręcznie przez ludzi).
Gdy właściwość jest zdefiniowana w modelu domeny z if
instrukcją, ten sam test jest testem jednostkowym. I może być kruche. Ale prawdziwym problemem jest to, że kod jest kruchy. Zasadniczo kod będzie bardziej odporny, jeśli zachowanie biznesowe można skonfigurować, a nie na stałe. Ponieważ wdrożenie w pośpiechu w celu naprawienia małego błędu kodowania powinno być rzadkie. Ale wymagania biznesowe zmieniające się bez powiadomienia to tylko wtorek (coś, co dzieje się co tydzień).
Do uruchomienia testu możesz użyć szkieletu testu jednostkowego. Jednak ramy testów jednostkowych nie ograniczają się do uruchamiania testów jednostkowych. Mogą również przeprowadzać testy integracyjne.
Gdybyś pisał test jednostkowy, stworzyłbyś jedno person
i offer1
od podstaw, bez polegania na stanie bazy danych. Coś jak
[Fact]
public void ReturnsFalseWhenGivenAPersonWithAGenderOfFemale()
{
var personId = Guid.NewGuid();
var gender = "F";
var person = new Person(personId, gender);
var id = Guid.NewGuid();
var offer1 = new Offer1(id, "ReturnsFalseWhenGivenAPersonWithAGenderOfFemale");
offer1.markLimitedToGender("M");
Assert.False(offer1.IsEligible(person));
}
Pamiętaj, że nie zmienia się to w zależności od logiki biznesowej. Nie twierdzenie, że offer1
odrzuca kobiety. To offer1
rodzaj oferty, która odrzuca kobiety.
Możesz utworzyć i skonfigurować bazę danych w ramach testu. W języku C # przy użyciu NUnit lub JUnit w Javie można ustawić bazę danych w Setup
metodzie. Prawdopodobnie twoja struktura testu ma podobne pojęcie. W tej metodzie można wstawiać rekordy do bazy danych za pomocą SQL.
Jeśli trudno jest napisać kod, który zastępuje testową bazę danych produkcyjną bazą danych, brzmi to jak słabość testowania w aplikacji. Do testowania lepiej byłoby użyć czegoś takiego jak wstrzyknięcie zależności, które pozwala na podstawienie. Następnie możesz napisać testy, które są niezależne od obecnych reguł biznesowych.
Zaletą tego jest to, że właścicielowi firmy (niekoniecznie właścicielowi firmy, a bardziej osobie odpowiedzialnej za ten produkt w hierarchii korporacyjnej) często łatwiej jest bezpośrednio skonfigurować reguły biznesowe. Ponieważ jeśli masz tego rodzaju ramy techniczne, łatwo jest zezwolić właścicielowi firmy na skorzystanie z interfejsu użytkownika (UI) w celu skonfigurowania oferty. Właściciel firmy wybierze ograniczenie w interfejsie użytkownika i wyda markLimitedToGender("M")
połączenie. Następnie, gdy oferta zostanie utrwalona w bazie danych, będzie ją przechowywać. Ale nie musisz przechowywać oferty, aby z niej skorzystać. Twoje testy mogą więc stworzyć i skonfigurować ofertę, która nie istnieje w bazie danych.
W systemie zgodnie z opisem właściciel firmy musiałby przesłać zapytanie do grupy technicznej, która wydałaby odpowiedni kod SQL i zaktualizowałaby testy. Lub grupa techniczna musi edytować kod i testy (lub testy, a następnie kod). To wydaje się dość ciężkie podejście. Możesz to zrobić. Ale twoje oprogramowanie (nie tylko testy) byłoby mniej kruche, gdybyś nie musiał tego robić.
TL; DR : możesz pisać testy w ten sposób, ale lepiej jest pisać oprogramowanie, abyś nie musiał tego robić.