Это похоже на проблему курицы и яйца.
Вы можете записать функцию записи в какое-то хранилище данных, но никогда не узнаете, что сохранили ее правильно без проверенной функции чтения.
Вы можете сделать функцию чтения прочитанной из хранилища данных, но как поместить вещи в это хранилище данных для чтения без проверенной функции записи?
РЕДАКТИРОВАТЬ:
Я подключаюсь и выполняю транзакции с базой данных SQL для сохранения и загрузки объектов для использования. Нет смысла тестировать функции доступа, предоставляемые БД, но я обертываю такие функции БД для сериализации / десериализации объектов. Я хочу быть уверен, что я пишу и читаю правильные вещи в и из БД правильно.
Это не то же самое, что добавить / удалить, как упоминает @snowman. Я хочу знать, что написанное мной содержимое корректно, но для этого требуется хорошо протестированная функция чтения. Когда я читаю, я хочу быть уверенным, что мое чтение правильно создало объект, равный тому, что было написано; но для этого требуется хорошо протестированная функция записи.
Ответы:
Начните с функции чтения.
В настройках теста : создайте базу данных и добавьте данные теста. либо через скрипты миграции, либо из резервной копии. Поскольку это не ваш код, он не требует теста в TDD
В тесте : создайте экземпляр своего хранилища, укажите на свою тестовую базу данных и вызовите метод Read. Убедитесь, что тестовые данные возвращены.
Теперь у вас есть полностью протестированная функция чтения, вы можете перейти к функции записи, которая может использовать существующее чтение для проверки своих собственных результатов.
источник
Я часто просто пишу, а потом читаю. например (псевдокод)
Добавлено позже
Помимо того, что это решение является «prgamatic» и «достаточно хорошим», можно утверждать, что другие решения проверяют не то, что нужно . Проверка соответствия строк или операторов SQL не является ужасной идеей, я сделал это сам, но он проверяет побочный эффект и хрупок. Что если вы измените заглавные буквы, добавите поле или обновите номер версии в ваших данных? Что если ваш драйвер SQL переключает порядок вызовов для повышения эффективности, или ваш обновленный сериализатор XML добавляет дополнительное пространство или изменяет версию схемы?
Теперь, если вы должны очень строго придерживаться какой-либо официальной спецификации, тогда я согласен, что проверка мелких деталей уместна.
источник
Не. Не тестируйте модуль ввода / вывода. Это пустая трата времени.
Модульная проверка логики. Если есть много логики, которую вы хотите протестировать в коде ввода / вывода, вы должны реорганизовать свой код, чтобы отделить логику того, как вы делаете ввод / вывод, и что вы делаете, что вы делаете, от реального бизнеса ввода / вывода. (что почти невозможно проверить).
Чтобы уточнить, если вы хотите протестировать HTTP-сервер, вы должны сделать это с помощью двух типов тестов: интеграционные тесты и модульные тесты. Модульные тесты вообще не должны взаимодействовать с I / O. Это медленно и создает много ошибок, которые не имеют ничего общего с правильностью вашего кода. Модульные тесты не должны зависеть от состояния вашей сети!
Ваш код должен отделиться:
Первые два связаны с логикой и решениями и требуют юнит-тестов. Последнее не предполагает принятия многих, если вообще каких-либо решений, и может быть чудесно протестировано с помощью интеграционного тестирования.
На самом деле это просто хороший дизайн, но одна из причин этого заключается в том, что он облегчает тестирование.
Вот некоторые примеры:
источник
Я не знаю, является ли это стандартной практикой или нет, но она прекрасно работает для меня.
В моих реализациях метода чтения и записи, не связанных с базой данных, я использую свои специфичные для типа
toString()
иfromString()
методы в качестве деталей реализации.Они могут быть легко проверены в изоляции:
Для реальных методов чтения-записи у меня есть один интеграционный тест, который физически читает и пишет в одном тесте
Кстати: что-то не так, если один тест проверяет чтение / запись вместе?
источник
Известные данные должны быть отформатированы известным способом. Самый простой способ реализовать это - использовать постоянную строку и сравнить результат, как описано в @ k3b.
Вы не ограничены постоянными, хотя. Может быть целый ряд свойств записанных данных, которые можно извлечь с помощью анализатора другого типа, такого как регулярные выражения или даже специальные тесты, ищущие функции данных.
Что касается чтения или записи данных, может быть полезно иметь файловую систему в памяти, которая позволяет запускать ваши тесты без возможности вмешательства со стороны других частей системы. Если у вас нет доступа к хорошей файловой системе в памяти, используйте временное дерево каталогов.
источник
Используйте внедрение зависимости и насмешки.
Вы не хотите тестировать драйвер SQL и не хотите проверять, работает ли ваша база данных SQL в сети и правильно ли она настроена. Это было бы частью интеграционного или системного теста. Вы хотите проверить, отправляет ли ваш код операторы SQL, которые он должен отправлять, и интерпретирует ли ответы так, как он должен.
Поэтому, когда у вас есть метод / класс, который должен что-то делать с базой данных, не имейте этого соединения с базой данных самостоятельно. Измените его так, чтобы объект, который представляет соединение с базой данных, передавался ему.
В вашем рабочем коде передайте реальный объект базы данных.
В ваших модульных тестах передавайте фиктивный объект, который ведет себя так, как будто настоящая база данных фактически не связывается с сервером базы данных. Просто проверьте, получает ли он SQL-операторы, которые он должен получить, а затем отвечает жестко закодированными ответами.
Таким образом, вы можете протестировать уровень абстракции базы данных, даже не нуждаясь в реальной базе данных.
источник
Если вы используете объектный реляционный сопоставитель, обычно есть связанная библиотека, которая может использоваться для проверки правильности работы ваших сопоставлений путем создания агрегата, его сохранения и перезагрузки из нового сеанса с последующей проверкой состояния относительно оригинальный объект.
NHibernate предлагает тестирование характеристик устойчивости . Его можно настроить для работы с хранилищем в памяти для быстрых юнит-тестов.
Если вы следуете простейшей версии шаблонов Repository и Unit of Work и тестируете все свои сопоставления, вы можете рассчитывать на то, что все работает очень хорошо.
источник