Какой ваш первый тест TDD при создании надежного импортера файлов? - PullRequest
2 голосов
/ 18 апреля 2011

В последнее время я много читал о TDD, но видел только небольшие примеры.

Теперь я должен начать с (не большого, но более чем одного класса) средства импорта файлов, которое должно быть надежным, поэтому он должен проверить, присутствует ли файл (на FTP-сервере), если он не не перепланировать себя, не падать, когда файл поврежден, повторно запускается и т. д .: импортер, который можно запустить и не нужно проверять на наличие файлов журнала каждый день.

Итак, когда я начинаю создавать такую ​​программу, с чего начать с TDD?

Это на самом низком уровне, например, реализация GetFile () или Reschedule () и затем мой путь вверх, или я сначала создаю «Контроллер» и сначала разрешаю один, потому что я не установил никакого теста файл и детализация всех функций?

Ответы [ 3 ]

2 голосов
/ 18 апреля 2011

Хорошо - начнем с самого начала.Первый приятно проверяемый функционал - «он должен проверить, присутствует ли файл на FTP-сервере».Я могу вспомнить как минимум два теста для этого: файл присутствует и файл отсутствует .Это два теста.Как насчет сервера нет ?Что тогда должно произойти?Ну, проверь это тоже.Когда вы описываете, что должен делать ваш аппарат, на английском языке, как вы сделали в вопросе, переведите описание в тесты.Тогда проверь все это.Порядок, в котором вы пишете тесты, не имеет (большого) значения - в конце вы захотите проверить каждый бит (и если вы действительно следуете TDD, каждый бит будет протестирован еще до того, как этот бит был даже написан).

2 голосов
/ 18 апреля 2011

Поскольку основной задачей импортера файлов является импорт файла (да?), Который должен быть вашим первым портом вызова. Напишите тест, чтобы убедиться, что вы можете получить файл.

Лично я бы набросал, что вы хотите реализовать с использованием UML, прежде чем приступить к программированию. Это поможет вам определить, что вам нужно написать.

1 голос
/ 19 апреля 2011

Полагаю, я бы начал с того, что пытался достичь. Так, например, если бы я писал какое-то программное обеспечение для личных финансов, я бы начал с чего-то вроде:

@Test
public void importsTransactionsFromQuicken() {
   List transactions = new QuickenImporter().importFrom("filename.qfx");
   assertSomeStuffAbout(transactions);
}

Теперь, когда у вас все получится, вы можете выполнить рефакторинг и макет обработки файлов, чтобы избежать некоторого ввода-вывода. Это, вероятно, вытеснит абстракцию для чтения файла.

Затем начните искать другие сценарии. Например, вы даете поврежденные файлы в качестве примера. Ну, что должно произойти в случае повреждения файла?

@Test
public void logsAndRemovesCorruptFiles() {
   File cf = new CorruptFile();
   Logger ls = new LogSpy();

   // Note, this might be the refactored interface for after mocking out I/O
   QuickenImporter qi = new QuickenImporter(cf, ls);
   List transactions = qi.import();

   assertEmptyList(transactions);
   assertFileWasDeleted(cf);
   assertCorruptLogEntryWasWritten(ls);
}

Вы можете видеть, что я провел некоторый рефакторинг, в том числе инжекцию в конструктор и т. Д., Но тесты действительно пропустили следующий шаг. Что касается функции «Переназначить», то, похоже, она нарушает принцип единой ответственности, поэтому она может принадлежать другому классу, например, классу ImportScheduler. Если это так, я знаю, что я хочу, чтобы поведение импортера было, когда он не может найти файл, поэтому я проведу еще один тест:

@Test
public void doesntReturnAnyTransactionsWhenFileNotPresent() {
   QuickenImporter qi = new QuickenImporter(new NonExistentFile(), NULL_LOGGER);
   List transactions = qi.import();

   assertEmptyList(transactions);
}

Теперь, чтобы протестировать компонент планирования, я могу написать ImportSchedulerTest с контрольными примерами для обоих условий (когда у меня есть файл, а когда нет).

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...