Мне было поручено внести небольшое изменение в кодовую базу без тестов, и я впервые пытаюсь реализовать изменение с использованием TDD, но я борюсь с разницей между реализацией тестирования и поведением. Система, над которой я работаю, отображает настраиваемые пользователем элементы списка. Пользователь может вносить изменения в поведение элементов списка через глобальную систему предпочтений, управляемую XML DAO:
class Preference {
boolean getX();
boolean getY();
}
Мне было поручено добавить Z в этот DAO, я реализовал это изменение и добавил тесты вобеспечить сериализацию и десериализацию значения, как я и ожидал.
Следующий класс элементов списка должен затем получить значение Z:
class ListItemA extends ListItem {
private boolean Z;
ListItemA(boolean Z){
this.Z = Z;
}
OpenAction getOpenAction(){
OpenAction action = new OpenAction();
if(Z){
action.addValue('Filter', true);
}
return action;
}
}
Я также написал тесты, чтобы убедиться, что возвращаемое действие отражает поле Z. Связь между этими двумя аспектами заключается в том, где я борюсь, существует класс контроллера, который вызывается при рендеринге элементов списка:
class Controller {
private Preference preference;
Controller(Preference preference){
this.preference = preference;
}
List<ListItem> getListItems(State state){
// a bunch condition statements concerning the state
List<ListItem> items = new List();
if(state.items.includes('ListItemA')){
ListItemA item = new ListItemA();
}
return items;
}
}
Когда создается экземпляр ListItemA, мне теперь нужно передать getZ () из поля настроекно TDD говорит, что я не могу сделать это изменение без неудачного теста.
Я мог бы смоделировать предпочтение, смоделировать состояние, сгенерировать список и затем написать тот же тест, чтобы убедиться, что OpenAction отражает значение Z, но похоже, что я тестирую реализацию и пишу хрупкий тест. Кроме того, в тесте ListItem будет много дублированного тестового кода, поскольку они делают одно и то же утверждение. Другой альтернативой может быть отказ от теста ListItem и добавление всех утверждений в тесте Controller, но похоже, что я тестирую другую систему.
Мои вопросы:
Как провести грань между тестированием реализации и написанием слишком широких тестов?
Как бы вы подошли к тестированию этой ситуации?
Я переоцениваю?
Я подхожу к изменениям в этой унаследованной системе через TDD, согласно только что законченной книге «Эффективная работа в устаревшем коде», соответствует ли описанный выше метод процессу, которым я должен бытьпредпринять при приближении к такой системе?
Есть ли какие-нибудь хорошие статьи, книги или ресурсы, о которых я могу прочитать, чтобы углубить мое понимание этой области?
Как мне поступитьо тестировании устаревшей системы на рабочем месте с культурой отсутствия тестирования? У меня нет своих собственных систем для работы, как я могу получить опыт?