TDD …, как?

Оболочка Файловой системы (FS) включает в себя различные подобные оболочке команды, которые напрямую взаимодействуют с распределенной файловой системой Hadoop (HDFS), а также с другими файловыми системами, которые поддерживает Hadoop, такими как Local FS, HFTP FS, S3 FS и другие. Оболочка FS вызывается:

bin/hadoop fs 

Все команды оболочки FS принимают в качестве аргументов пути URI. Формат URI: схема: // полномочие / путь. Для HDFS схема - hdfs, а для локальной FS - файловая. Схема и полномочия являются необязательными. Если не указан, используется схема по умолчанию, указанная в конфигурации. Файл или каталог HDFS, например / parent / child, можно указать как

hdfs: // namenodehost / parent / child

blockquote>

или просто как

/ parent / child

blockquote>

(учитывая, что для вашей конфигурации задано значение hdfs: // namenodehost).

Большинство команд в оболочке FS ведут себя как соответствующие команды Unix .

Вы не можете найти некоторые обычные команды оболочки, такие как -head, но доступны -tail и -cat. Тонкие различия в одних и тех же командах можно найти здесь для отдельных команд .

9
задан sivabudh 10 April 2009 в 19:01
поделиться

4 ответа

Проблема в TDD заключается в «дизайне для тестируемости»

Во-первых, у вас должен быть интерфейс для написания тестов.

Чтобы попасть туда, вы должны иметь общее представление о том, что ваши тестируемые единицы:

  1. Какой-то класс, который построен функцией.

  2. Некоторая функция, которая читает из сокета и выдает класс.

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

В-третьих, вы начинаете писать свои тесты - зная, что они скомпилируются, но не получатся.

На этом пути вы можете начать ломать голову о твоя функция. Как вы настраиваете сокет для своей функции? Это боль в шее.

Тем не менее, интерфейс, который вы описали выше, не является законом, это просто хорошая идея. Что если ваша функция взяла массив байтов и создала объект класса? Это намного, намного проще для тестирования.

Итак, вернитесь к шагам, измените интерфейс, напишите нерабочий класс и функцию, теперь напишите тесты.

Теперь вы можете заполнить класс и функцию до все ваши тесты пройдены.

Когда вы закончите этот тест, все, что вам нужно сделать, это подключить настоящий сокет. Вы доверяете библиотекам сокетов? (Подсказка: Вы должны) Не так много, чтобы проверить здесь. Если вы не доверяете библиотекам сокетов, теперь вы должны предоставить источник данных, которые вы можете запускать контролируемым образом. Это большая боль.

6
ответ дан 4 December 2019 в 11:44
поделиться

Ваш раскол звучит разумно. Я бы посчитал две зависимости входными и выходными. Можете ли вы сделать их менее зависимыми от конкретного производственного кода? Например, вы можете заставить его читать из общего потока данных вместо сокета? Это облегчило бы передачу тестовых данных.

Создание возвращаемого значения было бы труднее смоделировать, и не может ли это быть проблемой в любом случае - достаточно ли проста логика для фактического заполнения результирующего объекта (после синтаксического анализа)? Например, это просто установка тривиальных свойств? Если это так, я не стал бы пытаться представить там фабрику и т. Д. - просто введите некоторые данные испытаний и проверьте результаты.

5
ответ дан 4 December 2019 в 11:44
поделиться

Во-первых, начните думать «тесты», множественное число, а не «тест», единственное число. Вы должны ожидать, чтобы написать больше, чем один.

Во-вторых, если у вас есть умственный блок, рассмотрите возможность начать с более простой задачи. Уменьшайте сложность до тех пор, пока это не станет действительно простым, затем переходите к более существенной работе.

Например, предположим, что у вас уже есть байтовый массив с двоичными данными, поэтому вам даже не нужно думать о сокетах. Все, что вам нужно написать, это что-то, что берет байт [] и возвращает экземпляр вашего объекта. Можете ли вы написать тест для этого?

Если у вас все еще есть умственный блок, опустите его еще на одну отметку. Предположим, что ваш байтовый массив все равно будет содержать только значения по умолчанию. Так что вам даже не нужно беспокоиться о разборе, просто возможность вернуть экземпляр вашего объекта со всеми значениями по умолчанию. Можете ли вы написать тест для этого?

Я представляю что-то вроде:

public void testFooReaderCanParseDefaultFoo() {
  FooReader fr = new FooReader();
  Foo myFoo = fr.buildFoo();
  assertEquals(0, myFoo.bar());
}

Это круто, верно? Вы только тестируете конструктор Foo. Но затем вы можете перейти на следующий уровень:

public void testFooReaderGivenBytesBuildsFoo() {
  FooReader fr = new FooReader();
  byte[] fooData = {1};
  fr.consumeBytes(fooData);
  Foo myFoo = fr.buildFoo();
  assertEquals(1, myFoo.bar());
}

И так далее ...

4
ответ дан 4 December 2019 в 11:44
поделиться

Разработка через тестирование? Итак, это означает, что вы должны начать с написания теста в первую очередь.

Напишите тест, который содержит код типа «как вы хотите использовать свой класс». Этот класс или метод, который вы собираетесь тестировать с помощью этого теста, еще даже не существует.

Например, вы могли бы сначала написать тест, подобный этому:

[Test]
public void CanReadDataFromSocket()
{
     SocketReader r = new SocketReader( ... ); // create a socketreader instance which takes a socket or a mock-socket in its constructor

     byte[] data = r.Read();

     Assert.IsTrue (data.Length > 0);
}

Например; Я просто делаю пример здесь. Затем, как только вы сможете читать данные из сокета, вы можете начать думать о том, как вы будете их анализировать, и написать тест, в котором вы используете класс 'Parser', который берет прочитанные вами данные, и выводит экземпляр вашего класса данных. и т.д ...

1
ответ дан 4 December 2019 в 11:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: