Юнит-тесты - стратегии "белого ящика" и "черного ящика"
Я обнаружил, что когда я пишу модульные тесты, особенно для методов, которые не возвращают значение, я в основном пишу тесты в режиме белого ящика. Я мог бы использовать отражение для чтения личных данных, чтобы проверить, находится ли оно в надлежащем состоянии после выполнения метода и т.д...
этот подход имеет много ограничений, наиболее важным из которых является
- Вы должны изменить свои тесты, если вы переделываете метод, даже если API остается прежним
- Это неправильно с точки зрения сокрытия информации (инкапсуляции) - тесты - это хорошая документация для нашего кода, поэтому тот, кто ее прочитает, может получить некоторую ненужную информацию о реализации
Но если метод не возвращает значение и оперирует частными данными, то начинать тестирование очень сложно (почти невозможно), как с помощью парадигмы тестирования черного ящика.
Итак, есть идеи для хорошего решения этой проблемы?
2 ответа
Тестирование белого ящика означает, что вам необходимо вытащить часть проводки на столе, чтобы подключить свои инструменты. Материал, который я нашел полезным:
1) Одна монолитная последовательность кода, которую я унаследовал и не хотел переписывать, я смог применить, поместив переменную класса состояния, а затем установив состояние по мере прохождения каждого шага. Затем я проверил с другими данными и сопоставил ожидаемое состояние с фактическим состоянием.
2) Создайте макеты для любых вызовов методов тестируемого метода. Проверьте, чтобы макет был назван так, как ожидалось.
3) Сделать необходимые свойства в protected
вместо private
и создать подкласс, который я на самом деле тестировал. Подкласс позволил мне проверить состояние.
Я мог бы использовать отражение для чтения личных данных, чтобы проверить, находится ли оно в надлежащем состоянии после выполнения метода
Это действительно может быть большой проблемой для обслуживания вашего набора тестов
вместо этого в.Net вы могли бы использовать модификатор внутреннего доступа, чтобы вы могли использовать InternalsVisibleToAttribute в своей библиотеке классов, чтобы сделать ваши внутренние типы видимыми для вашего проекта модульного теста.
Внутреннее ключевое слово является модификатором доступа для типов и членов типов. Внутренние типы или элементы доступны только внутри файлов в одной сборке
Это не решит все трудности тестирования, но может помочь