Z mojego punktu widzenia oboje macie przewagę i znajdujecie się w „niekorzystnej sytuacji” (sic).
Zaletą jest to, że masz system, w którym czujesz się komfortowo i który działa dla Ciebie. Cieszysz się, że potwierdza to ważność twojego produktu i prawdopodobnie nie znajdziesz wartości biznesowej, próbując zmienić wszystkie swoje testy na coś, co korzysta z innego frameworka. Jeśli możesz przefakturować kod, a testy wykryją zmiany - lub jeszcze lepiej, jeśli możesz zmodyfikować testy, a istniejący kod nie przejdzie testów do czasu, aż zostanie zrefaktoryzowany, oznacza to, że masz wszystkie podstawy. Jednak...
Jedną z zalet posiadania dobrze zaprojektowanego API do testowania jednostek jest to, że w większości współczesnych IDE jest dużo natywnego wsparcia. Nie wpłynie to na hard-core VI i emacs użytkowników, którzy szydzą z użytkowników Visual Studio tam, ale dla tych, którzy używają dobrego IDE, masz możliwość debugowania testów i wykonania ich w obrębie samo IDE. Jest to dobre, jednak istnieje jeszcze większa zaleta w zależności od używanego frameworka, czyli w języku używanym do testowania kodu.
Kiedy mówię język , nie mówię o języku programowania, ale mówię o bogatym zestawie słów owiniętych płynną składnią, dzięki której kod testowy jest czytany jak historia. W szczególności stałem się zwolennikiem korzystania z ram BDD . Moim ulubionym API DotNet BDD jest StoryQ, ale istnieje kilka innych o tym samym podstawowym celu, którym jest wyciągnięcie pojęcia z dokumentu wymagań i zapisanie go w kodzie w podobny sposób, jak jest napisany w specyfikacji. Naprawdę dobre interfejsy API idą jednak jeszcze dalej, przechwytując każdą pojedynczą instrukcję w teście i wskazując, czy instrukcja wykonała się pomyślnie, czy nie. Jest to niezwykle przydatne, ponieważ możesz zobaczyć cały test wykonany bez powrotu wcześniej, co oznacza, że twoje wysiłki debugowania stają się niezwykle wydajne, ponieważ musisz tylko skupić uwagę na częściach testu, które zakończyły się niepowodzeniem, bez konieczności dekodowania całego połączenia sekwencja. Inną miłą rzeczą jest to, że wynik testu pokazuje wszystkie te informacje,
Jako przykład tego, o czym mówię, porównaj następujące:
Korzystanie z zapewnień:
Assert(variable_A == expected_value_1); // if this fails...
Assert(variable_B == expected_value_2); // ...this will not execute
Assert(variable_C == expected_value_3); // ...and nor will this!
Korzystając z płynnego interfejsu API BDD:
(Wyobraź sobie, że kursywa to w zasadzie wskaźniki metod)
WithScenario("Test Scenario")
.Given(*AConfiguration*) // each method
.When(*MyMethodToTestIsCalledWith*, variable_A, variable_B, variable_C) // in the
.Then(*ExpectVariableAEquals*, expected_value_1) // Scenario will
.And(*ExpectVariableBEquals*, expected_value_2) // indicate if it has
.And(*ExpectVariableCEquals*, expected_value_3) // passed or failed execution.
.Execute();
Teraz przyznano, że składnia BDD jest dłuższa i bardziej sformułowana, a te przykłady są strasznie wymyślone, jednak w bardzo złożonych sytuacjach testowych, w których wiele rzeczy zmienia się w systemie w wyniku danego zachowania systemu, składnia BDD oferuje jasne opis tego, co testujesz i jak zdefiniowano konfigurację testu. Możesz pokazać ten kod programistom, a oni natychmiast zrozumieją, co się dzieje. Ponadto, jeśli „zmienna_A” nie przejdzie testu w obu przypadkach, przykład Asserts nie wykona się po pierwszym stwierdzeniu, dopóki problem nie zostanie rozwiązany, podczas gdy interfejs BDD API wykona kolejno każdą metodę wywoływaną w łańcuchu i wskaże, która z nich poszczególne części oświadczenia były błędne.
Osobiście uważam, że to podejście działa znacznie lepiej niż bardziej tradycyjne frameworki xUnit w tym sensie, że językiem testowania jest ten sam język, w którym klienci będą mówić o swoich logicznych wymaganiach. Mimo to udało mi się wykorzystać frameworki xUnit w podobnym stylu, bez potrzeby wymyślania pełnego testowego interfejsu API, aby wesprzeć moje wysiłki, a podczas gdy twierdzenia nadal skutecznie same się zwieją, czytają bardziej czysto. Na przykład:
Korzystanie z Nunit :
[Test]
void TestMyMethod()
{
const int theExpectedValue = someValue;
GivenASetupToTestMyMethod();
var theActualValue = WhenIExecuteMyMethodToTest();
Assert.That(theActualValue, Is.EqualTo(theExpectedValue)); // nice, but it's not BDD
}
Jeśli zdecydujesz się na skorzystanie z interfejsu API do testowania jednostkowego, radzę eksperymentować z dużą liczbą różnych interfejsów API przez chwilę, a także zachować ostrożność i podejście do swojego podejścia. Chociaż ja osobiście opowiadam się za BDD, twoje potrzeby biznesowe mogą wymagać czegoś innego w zależności od okoliczności twojego zespołu. Kluczem jest jednak uniknięcie wtórnego zgadywania istniejącego systemu. Zawsze możesz wesprzeć swoje istniejące testy kilkoma testami wykorzystującymi inny interfejs API, jeśli to konieczne, ale z pewnością nie poleciłbym ogromnego przepisywania testów, aby wszystko było takie samo. Ponieważ przestarzały kod przestaje być używany, możesz łatwo zastąpić go i jego testy nowym kodem, a także przetestować przy użyciu alternatywnego interfejsu API, i to bez konieczności inwestowania w duży wysiłek, który niekoniecznie przyniesie rzeczywistą wartość biznesową. Jeśli chodzi o używanie interfejsu API do testowania jednostkowego,