Как выполнить модульное тестирование анализатора электронных таблиц? - PullRequest
2 голосов
/ 01 ноября 2010

У меня есть класс DeliveryScheduleParser, который читает электронную таблицу и разбирает ее на несколько объектов, которые в конечном итоге попадают в объект клиента, который возвращается методом getClient() в классе DeliveryScheduleParser.

public class DeliveryScheduleParser {

    private final HashMap<String, Integer> _headerColumnNumbers;
    private final File _file;
    private HSSFSheet sheet;
    private Client client;

    public DeliveryScheduleParser(File file) {
        this._file = file;
        sheet = getSheet(_file);
        _headerColumnNumbers = getHeaderMap(sheet);
        parseSheet();
    }

    public Client getClient(){
        return client;
    }

    // Other private methods here
}

Метод parseSheet() внутри этого класса в основном выполняет всю работу и вызывает только некоторые статические Sanitizer методы, которые тестируются отдельно.

Мой вопрос в основном состоит в том, что было бы лучшим способом убедиться, что клиентский объект правильно заполнен правильными объектами, и что эти объекты в свою очередь также заполнены правильными объектами (есть много ArrayLists вложенные в другие ArrayLists).

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

Ответы [ 2 ]

0 голосов
/ 11 января 2012

Поскольку ваш класс, кажется, анализирует реальные файлы в объектном мире, я бы порекомендовал написать интеграционные тесты - тесты, в которых ваш класс работает с реальными файлами.Модульные тесты для типов, использующих синтаксический анализатор, могут полагаться на роль / интерфейс (и имитировать его).

Вы также можете эквивалентно управляемым данными / параметризованным тестам для запуска одного и того же теста на разных входах (вэто дело)

В идеале ответственность за разбор должна быть в одном типе / классе.Он должен принимать входные данные и создавать другой тип (структура данных / объект) в качестве выходных данных.

0 голосов
/ 11 января 2012

Полагаю, этот сценарий состоит из двух наборов тестов.

  1. У вас должен быть интерфейс, называемый клиентом.Вы должны посмеяться над этим и посмотреть, правильно ли ваш DeliveryScheduleParser взаимодействует с ним.Поэтому сначала смейтесь над своим Клиентом и протестируйте ваш DeliveryScheduleParser.
  2. Теперь определите свои ожидания от Клиента и запишите свои тесты один за другим.Затем реализуйте свой класс, который реализует клиентский интерфейс (например, ClientImpl).

Для насмешек вы можете использовать Mockito или любую среду для имитации.

Таким образом, чтобы "убедиться, что клиентский объект правильно заполнен нужными объектами", вы должны проверить Client, но не сразу DeliveryScheduleParser.На самом деле ваш DeliveryScheduleParser должен быть соавтором и взаимодействовать с Client.

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

Для ArrayList взаимодействий вы можете использовать интерфейс List и макетЭто.

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

Я бы хотел быть более конкретным, но надеюсь, что это поможет ...

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