Я намагаюся практикувати TDD, використовуючи його для розробки такого простого, як Bit Vector. Я випадково використовую Swift, але це мовно-агностичне питання.
Моє BitVector
- це struct
зберігання синглів UInt64
і презентує API, який дозволяє вам ставитися до нього як до колекції. Деталі не мають великого значення, але це досить просто. Високі 57 біт - це біти зберігання, а нижні 6 - це "рахувати" біти, що говорить вам, скільки бітів для зберігання насправді зберігають міститься значення.
Поки що у мене є кілька дуже простих можливостей:
- Ініціалізатор, який створює порожні бітові вектори
count
властивість типуInt
isEmpty
властивість типу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
потребують громадських членів, щоб зробити значущі тести.