Я большой поклонник TDD и использую его для подавляющего большинства моего развития в эти дни. Одна ситуация, с которой я сталкиваюсь несколько чаще, и никогда не находила того, что, по моему мнению, было «хорошим» ответом, похоже на следующий (надуманный) пример.Разработка интерфейса с TDD
Предположим, у меня есть интерфейс, как это (написание в Java, но на самом деле, это относится к любому языку OO):
public interface PathFinder {
GraphNode[] getShortestPath(GraphNode start, GraphNode goal);
int getShortestPathLength(GraphNode start, GraphNode goal);
}
Теперь предположим, что я хочу, чтобы создать три реализации этого интерфейса. Назовем их DijkstraPathFinder
, DepthFirstPathFinder
и AStarPathFinder
.
Вопрос в том, как мне разработать эти три реализации с использованием TDD? Их публичный интерфейс будет таким же, и, по-видимому, я бы написал те же тесты для каждого, так как результаты getShortestPath() и getShortestPathLength() должны быть согласованными между всеми тремя реализациями.
Мой выбор кажутся:
Написать один набор тестов против
PathFinder
, как я код первой реализации. Затем напишите две другие версии «blind» и убедитесь, что они проходят тестыPathFinder
. Это не кажется правильным, потому что я не использую TDD для разработки вторых двух классов реализации.Разработка каждого класса реализации в тестовом режиме. Это не кажется правильным, потому что я буду писать те же тесты для каждого класса.
Объедините две техники выше; теперь у меня есть набор тестов против интерфейса и набор тестов для каждого класса реализации, что приятно, но тесты все те же, что не очень приятно.
Это похоже на довольно распространенную ситуацию, особенно при реализации шаблона стратегии, и, разумеется, различия между реализациями могут быть не просто сложной по времени. Как другие справляются с этой ситуацией? Есть ли образец для тестовой разработки против интерфейса, о котором я не знаю?
У меня все еще есть проблемы. Я принял подход к тестированию двух одинаковых классов, а затем рефакторинг к общему интерфейсу. При добавлении третьего класса я вырезал-n-вставил тесты и сделал каждый компиляцию и по очереди стал зеленым, добавив интерфейс к классу. Это подвержено ошибкам, если мой cut-n-вставка идет не так, но это не моя проблема. Теперь я нахожусь в ситуации, когда я могу использовать тесты для добавления функциональности интерфейса из одного класса, но эта функциональность не будет иметь никаких тестов для поддержки в других классах. Я должен помнить, чтобы скопировать тесты. Это не кажется правильным? – tenpn
вынул мой комментарий на новый вопрос: http://stackoverflow.com/questions/1340712/how-to-tdd-functionality-in-a-base-mixin-class-from-one-of-many-leaf- классы – tenpn