Подтвердить что ты не робот

Рекомендации по тестированию базы данных с помощью PHPUnit

PHPUnit собственное руководство имеет некоторые еще неписанные разделы, озаглавленные "Операции" и "Рекомендации по тестированию базы данных".

Каковы наилучшие методы тестирования базы данных с помощью PHPUnit, особенно в MySQL?

4b9b3361

Ответ 1

Когда я делаю тестирование базы данных с помощью PHPUnit, я загружаю мой дамп MySQL в начале первого пакета, который содержит любую информацию, которую я предполагаю быть верной во всех тестах. Когда запускается каждый тест, я использую метод setupDatabase. Этот метод удаляет все строки из таблиц, которые, как я знаю, изменился, тогда он загружает плоский набор данных XML, содержащий данные, которые мне нужны, чтобы сохранить true. После этого я запускаю любой код, который я тестирую. Наконец, я использую набор простых методов для выбора строк из базы данных, чтобы утверждать, что внесенные изменения были выполнены правильно.

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

Zend Framework имеет интересную библиотеку для PHPUnit, которая позволяет тестировать сравнить таблицу базы данных с плоским набором данных XML, но у меня не было шанс использовать его еще.

Ответ 2

Некоторые неупорядоченные мысли:

Хорошо иметь светильники (с или без структуры db), загруженные в db в startUp() каждого теста. Это может произойти, т.е. из файлов JSON или XML, по одному для каждой таблицы. Если вы соединяете его с функциями, такими как getNthFixture ($ sTable, $nIndex) или countFixtures ($ sTable), вы можете легко протестировать свои запросы. Более того, вы можете использовать [LINQ] [1] для получения ожидаемых результатов от набора светильников с небольшой или никакой разницей между запросом БД и светильников. Мне очень легко адаптироваться на раннем этапе прототипирования/разработки, когда структура db меняется очень часто. Добавление утверждения для прямого сравнения результата запроса LINQ с результатом запроса db делает создание тестов чистым удовольствием;)

Другие подсказки: db следует повторно инициализировать перед каждым методом тестирования, а не перед тестовым случаем. В идеале вы должны сбросить базу и перестроить ее из полного набора светильников.

И, если можно, попробуйте сделать тесты, которые работают с разными базами данных (некоторые вещи, конечно, не переносимы, но большинство есть). Используйте как минимум sqlite в стороне от mysql/postgres/other_big_rdbm.

Если вы тестируете фреймворк или другую сложную систему, вы, вероятно, должны макетировать доступ к базе данных Singleton. Если некоторые жестко закодированные вещи захоронены глубоко в не очень гибкой форме, это может быть боль, скажем, шеи.

Хорошей идеей является регистрация всех запросов, которые не прошли тест, и/или отображать их в сообщениях об ошибках. Также для сообщений об ошибках db. Если вы тестируете большие базы данных, когда производительность вызывает беспокойство, попробуйте одновременно регистрировать медленные запросы.

Более магический и, возможно, немного сложнее, состоит в том, чтобы автоматизировать тестирование, индексируются ли все столбцы, используемые в где /have/join. Возможно, что-то, что должно принадлежать объединенному Php/Database Code Sniffer (tm) вместо единичных тестов, и не очень просто реализовать, но когда-то оно значительно улучшает качество кода.

Еще один хороший совет, исходя из грустного личного опыта: всегда добавляйте тесты для наборов символов, особенно если вы работаете со многими языками. Мир ISO-8859-1 очень мал;)

[1]: http://phplinq.codeplex.com/ LINQ