Есть много причин. Эрик Липперт много раз заявлял, что причина feature X
не в C #, а в том, что его нет в бюджете. Языковые дизайнеры не имеют бесконечного количества времени и денег для реализации, и каждая новая функция связана с затратами на обслуживание. Сохранение языка как можно меньшего размера не просто легче для разработчиков языка, но и для любого, кто пишет альтернативные реализации и инструменты (например, IDE). Кроме того, когда что-то реализовано с точки зрения языка, а не его части, вы получаете Портативность бесплатно. Если модульное тестирование реализуется как библиотека, вам нужно написать ее только один раз, и она будет работать в любой соответствующей реализации языка.
Стоит отметить, что D имеет поддержку на уровне синтаксиса для модульного тестирования . Я не знаю, почему они решили добавить это, но стоит отметить, что D предназначен для «языка системного программирования высокого уровня». Дизайнеры хотели, чтобы он был жизнеспособным для небезопасного низкоуровневого кода, для которого традиционно используется C ++, а ошибка в небезопасном коде невероятно дорогая - неопределенное поведение. Поэтому я полагаю, что им было бы целесообразно приложить дополнительные усилия ко всему, что поможет вам проверить, работает ли какой-нибудь небезопасный код. Например, вы можете принудить, чтобы только определенные доверенные модули могли выполнять небезопасные операции, такие как непроверенный доступ к массиву или арифметика указателя.
Быстрая разработка также была для них приоритетом, настолько, что они поставили перед собой цель разработки, чтобы D-код компилировался достаточно быстро, чтобы его можно было использовать в качестве языка сценариев. Выпекание юнит-тестов прямо на языке, так что вы можете запустить свои тесты, просто передав дополнительный флаг компилятору, это поможет.
Тем не менее, я думаю, что отличная библиотека модульного тестирования делает гораздо больше, чем просто находит некоторые методы и запускает их. Взять, к примеру, QuickCheck на Haskell , который позволяет вам проверять такие вещи, как «для всех x и y f (x, y) == f (y, x)
». QuickCheck лучше описать как генератор модульных тестов и позволяет вам тестировать вещи на более высоком уровне, чем «для этого входа, я ожидаю этот вывод». QuickCheck и Linq не так уж сильно отличаются - они оба являются предметно-ориентированными языками. Так что вместо того, чтобы связывать поддержку модульного тестирования с языком, почему бы не добавить функции, необходимые для практической реализации DSL? В результате вы получите не только модульное тестирование, но и лучший язык.