Вместо списка, возможно, вы могли бы управлять Map<ParentClass, Set<ChildClass>>
?
Ключом вашей карты был бы родительский класс, а значением был бы набор его дочерних элементов.
Таким образом, вы будете перебирать все дочерние элементы, и для каждого из них вы просто будете вызывать что-то вроде map.get(parent).add(child);
. Очевидно, до этого вы убедитесь, что если карта еще не содержит этого родительского элемента, вы инициализируете его набор дочерних пустой набор:
if (!map.containsKey(parent)) {
map.put(parent, new HashSet());
}
В конце вы можете выполнить итерацию по карте и отобразить размер каждого набора значений для каждого ключа ...
HTH!
На моем текущем проекте мы используем немного инструмента поколения для создания скелетных модульных тестов на различные объекты и средства доступа, он обеспечивает довольно последовательный подход для каждой модульной единицы работы, которая должна быть протестирована и создает великолепное место для разработчиков для проверения их реализаций от (т.е. класс модульного теста добавляется, когда остальная часть объектов и других зависимостей добавляется по умолчанию).
Структура (шаблонных) тестов следует за довольно предсказуемым синтаксисом, и шаблон допускает реализацию module/object-specific наращивания/слезы вниз (мы также используем базовый класс для всех тестов к encapsule некоторая логика).
Мы также создаем экземпляры объектов (и присвойте значения данных тестирования) в статических функциях так, чтобы объекты могли создаваться программно и использоваться в рамках различных сценариев тестирования и через тестовые классы, который оказывается очень полезным.
Читайте книга как Искусство Поблочного тестирования определенно поможет.
Тесты записи перед написанием кода (т.е.: Разработка через тестирование). Если по некоторым причинам Вы неспособны к тестам записи прежде, запишите им, поскольку Вы пишете код. Удостоверьтесь, что все тесты перестали работать первоначально. Затем спуститесь по списку и зафиксируйте каждого поврежденный в последовательности. Этот подход будет вести для лучше кодирования и лучшие тесты.
Если у Вас есть время на Вашей стороне, то можно даже рассмотреть запись тестов, упущение об этом в течение недели и затем написания фактического кода. Таким образом, Вы предприняли шаги далеко от проблемы и видите проблему более ясно теперь. Наши мозги обрабатывают задачи по-другому, если они происходят из внешних или внутренних источников, и это повреждение делает это внешним источником.
И после этого, не волнуйтесь об этом слишком много. Модульные тесты предлагают Вам проверку работоспособности и стабильную землю для положения на - это - все.
Насколько политика идет, читает ответ Kent Beck на Так, особенно:
протестировать как можно меньше для достижения данного уровня уверенности
Запишите прагматические модульные тесты на хитрые части Вашего кода и не теряйте сайт того, что это - программа, которую Вы тестируете, это важно не модульные тесты.
У меня есть рубиновый сценарий, который генерирует тестовые тупики для "коричневого" кода, который не был создан с TDD. Это пишет мой сценарий сборки, настраивает, включает/использования и пишет установку/разрушение для инстанцирования тестового класса в тупике. Помогает запуститься с последовательной начальной точки без всей скуки ввода, когда я взламываю в коде, написанном в Dark Times.
Одна практика, которую я нашел очень полезными, является идеей сделать Ваш набор тестов изоморфным к коду протестированный. Это означает, что тесты расположены в том же порядке как строки кода, которые они тестируют. Это делает очень легким взять часть кода и набора тестов для того кода, посмотреть на них бок о бок и шаг через каждую строку кода, чтобы проверить, что существует соответствующий тест. Я также нашел, что простое действие осуществления изоморфизма как это вынуждает меня думать тщательно о протестированном коде, таком как обеспечение, что все возможные ответвления в коде осуществлены тестами, или что все условия цикла тестируются.
Например, учитывая код как это:
void MyClass::UpdateCacheInfo(
CacheInfo *info)
{
if (mCacheInfo == info) {
return;
}
info->incrRefCount();
mCacheInfo->decrRefCount();
mCacheInfo = info
}
Набор тестов для этой функции имел бы следующие тесты в порядке:
test UpdateCacheInfo_identical_info
test UpdateCacheInfo_increment_new_info_ref_count
test UpdateCacheInfo_decrement_old_info_ref_count
test UpdateCacheInfo_update_mCacheInfo