Я намагаюся практикувати TDD, використовуючи його для розробки такого простого, як Bit Vector. Я випадково використовую Swift, але це мовно-агностичне питання.
Моє BitVector- це structзберігання синглів UInt64і презентує API, який дозволяє вам ставитися до нього як до колекції. Деталі не мають великого значення, але це досить просто. Високі 57 біт - це біти зберігання, а нижні 6 - це "рахувати" біти, що говорить вам, скільки бітів для зберігання насправді зберігають міститься значення.
Поки що у мене є кілька дуже простих можливостей:
- Ініціалізатор, який створює порожні бітові вектори
countвластивість типуIntisEmptyвластивість типуBool- Оператор рівності (
==). Примітка: це оператор рівності значень, схожий наObject.equals()Java, а не оператор еталонної рівності, як==у Java.
Я натрапляю на купу циклічних залежностей:
Тест одиниці, який тестує мій ініціалізатор, повинен перевірити, що щойно побудований
BitVector. Це можна зробити одним із трьох способів:- Перевірка
bv.count == 0 - Перевірка
bv.isEmpty == true - Перевірте це
bv == knownEmptyBitVector
Метод 1 спирається на
countметод 2, наisEmptyякий покладається (на який він покладаєтьсяcount, тому немає сенсу використовувати його), метод 3 спирається на==. У будь-якому випадку, я не можу перевірити свій ініціалізатор ізольовано.- Перевірка
Тест на
countнеобхідність оперувати чимось, що неминуче тестує мої ініціалізаториРеалізація
isEmptyпокладається наcountРеалізація
==покладається наcount.
Мені вдалося частково вирішити цю проблему, ввівши приватний API, який будує a BitVectorз існуючого бітового шаблону (як a UInt64). Це дозволило мені ініціалізувати значення, не тестуючи жодних інших ініціалізаторів, щоб я міг "завантажувати ремінь" вперед.
Щоб мої одиничні тести справді були тестовими одиницями, я вважаю, що роблю купу хак, які суттєво ускладнюють мій прод і тестовий код.
Як саме ви обходите подібні питання?
BitVector- це ідеально розмір одиниці для тестування одиниць і негайно вирішує ваші проблеми, якіBitVectorпотребують громадських членів, щоб зробити значущі тести.