Jest wiele powodów. Eric Lippert wielokrotnie twierdził, że powodem tego feature X
nie jest C #, ponieważ po prostu nie ma tego w budżecie. Projektanci języków nie mają nieskończonej ilości czasu ani pieniędzy na wdrożenie różnych rozwiązań, a każda nowa funkcja wiąże się z kosztami utrzymania. Utrzymanie tak małego języka, jak to tylko możliwe, nie jest tylko łatwiejsze dla projektantów języków - jest także łatwiejsze dla każdego, kto pisze alternatywne implementacje i narzędzia (np. IDE). Dodatkowo, gdy coś jest implementowane pod względem języka, a nie jego części, otrzymujesz przenośność za darmo. Jeśli testowanie jednostkowe jest implementowane jako biblioteka, wystarczy napisać go tylko raz i będzie on działał w dowolnej zgodnej implementacji języka.
Warto zauważyć, że D ma obsługę testowania jednostkowego na poziomie składni . Nie wiem, dlaczego postanowili to wrzucić, ale warto zauważyć, że D ma być „językiem programowania systemów na wysokim poziomie”. Projektanci chcieli, aby był on wykonalny dla tego rodzaju niebezpiecznego, niskiego poziomu kodu, do którego tradycyjnie używano C ++, a błąd w niebezpiecznym kodzie jest niezwykle kosztowny - niezdefiniowane zachowanie. Sądzę więc, że mieli dla nich sens dodatkowy wysiłek na wszystko, co pomaga zweryfikować, czy jakiś niebezpieczny kod działa. Na przykład możesz wymusić, aby tylko niektóre zaufane moduły mogły wykonywać niebezpieczne operacje, takie jak niesprawdzony dostęp do tablicy lub arytmetyka wskaźnika.
Szybki rozwój był również dla nich priorytetem, tak bardzo, że uczyniono z niego cel projektowy, który kod D kompiluje wystarczająco szybko, aby był użyteczny jako język skryptowy. Pomaga w tym testowanie jednostek pieczenia bezpośrednio na język, dzięki czemu można uruchomić testy, przekazując kompilatorowi dodatkową flagę.
Myślę jednak, że świetna biblioteka do testowania jednostek nie tylko znajduje jakieś metody i je uruchamia. Weźmy na przykład QuickCheck Haskella , który pozwala przetestować takie rzeczy jak „dla wszystkich x i y f (x, y) == f (y, x)
”. QuickCheck jest lepiej opisany jako generator testów jednostkowych i pozwala testować rzeczy na wyższym poziomie niż „dla tego wejścia, oczekuję tego wyjścia”. QuickCheck i Linq nie różnią się tak bardzo - oba są językami specyficznymi dla domeny. Zamiast więc dodawać obsługę testów jednostkowych do języka, dlaczego nie dodać funkcji niezbędnych do tego, aby DSL były praktyczne? Skończysz nie tylko testowaniem jednostkowym, ale także lepszym językiem.