Ярко выраженный провал теста... Я думаю, вы можете опустить часть -db-, если вам нужно слово немного короче и вы чувствуете такую склонность.
Test-DB-Acle — это PHP-библиотека, упрощающая написание простых и кратких тестов для уровня базы данных.
Я убежден, что написание тестов должно быть максимально простым для разработчика, а также их должно быть максимально легко читать, чтобы их могли освоить другие разработчики.
Это означает, что любые тестовые данные в тесте должны относиться только к сценарию тестирования. Однако в большинстве таблиц базы данных есть ненулевые столбцы, которые требуют ввода фиктивных данных, которые просто вносят в тест когнитивный шум.
Test-Db-Acle стремится снять это бремя с разработчика. Среда тестирования не делает никаких предположений о том, как работают классы уровня вашей базы данных. Если они используют ORM, например Doctrine, хранимые процедуры или прямой SQL, принцип всегда один и тот же, в какой-то момент код взаимодействует с данными в таблицах БД. , и нам нужно это проверить.
Установка через композитор
отключает проверку внешнего ключа в базе данных
автоматически обрабатывает ненулевые столбцы
автоматически обрезает столбцы даты/времени в MySQL при утверждении значений в таблицах БД - полезно для вставленных меток времени (в Sqlite эти столбцы должны быть указаны)
практически все компоненты можно обменивать и заменять нестандартными вариантами.
в настоящее время поддерживает Mysql и Sqlite
Не зависит от платформы, не делает никаких предположений, например, используются ли ORM, и его следует легко адаптировать для других платформ модульного тестирования.
В настоящее время поддерживаются базы данных MySql (и расширение MariaDB) и Sqlite.
Архитектура должна позволять добавлять дополнительные базы данных.
Эту библиотеку можно использовать с PHPUnit «из коробки». Его должно быть довольно легко использовать с другими средами тестирования, используя предоставленные признаки и делегируя метод 'assertEquals' эквивалентному методу (например, я помню, что в SimpleTest это было 'assertEqual').
Я предоставил простой TestDbAclePhpUnitAbstractTestCase, а также TestDbAclePhpUnitTraitsDatabaseHelperTrait, если вы используете PHP 5.4 и не против использовать черты.
Хорошо, если честно, тестирование уровня базы данных является дорогостоящим и замедляет тестирование, и, где это возможно, любые зависимости от базы данных должны быть имитированы. Но иногда нам просто необходимо это сделать, и будем надеяться, что в хорошо структурированном приложении это можно свести к минимуму.
Существует множество инструментов и подходов (например, DBUnit или использование фабричных методов в модульных тестах), помогающих при тестировании базы данных, каждый из которых имеет свои сильные стороны. Этот подход мне подходит, потому что:
Мне не нужно беспокоиться о нулевых столбцах или ограничениях внешнего ключа.
Я предоставляю минимальный набор данных для своих тестов.
Я вижу тестовые данные в виде сетки над тестами и снова при подтверждении данных в базе данных.
Поэтому я создал собственное решение.
###Итак, как это работает и как это выглядит? Покажи мне пример!###
Идея состоит в том, чтобы использовать текстовую строку «значения, разделенные вертикальной чертой», назовем ее PSV — как в CSV, но с каналами — для настройки тестовых приспособлений следующим образом:
(Формат PSV очень похож на формат, используемый превосходной платформой Behat BDD (https://github.com/Behat/Behat))
$dbTablesToSetup="[table_name]id |date |name |value |dependent_table_id10 |2001-01-01 |foo |900 |60[dependent_table]id |name20 |Bar60 |Baz";//используйте это, если не хотите используйте предоставленные черты или абстрактные тестовые примеры $testDbAcle = TestDbAcleTestDbAcle::create($pdo);$testDbAcle->runCommand(new TestDbAcleCommandsSetupTablesCommand($dbTablesToSetup));//используйте это, если вы расширили свой тестовый пример из TestDbAclePhpUnitAbstractTestCase или используете TestDbAclePhpUnitTraitsDatabaseHelperTrait:$this->setupTables($dbTablesToSetup);
Сама платформа знает, какие столбцы в таблице не поддерживают NULL, и вставляет значения по умолчанию... Фактически, давайте предположим, что таблица table_name имеет 30 столбцов, каждый из которых не равен NULL....
Кроме того, в фоновом режиме могут иметь место различные ограничения внешнего ключа. Test-Db-Acle временно отключает проверки внешних ключей, поэтому нам не нужно беспокоиться об этом или о том, в каком порядке мы вставляем тестовые данные.
###А как насчет настоящего теста.....?### Во-первых, если вы используете PHP5.4, вы можете использовать версию типажей:
класс SampleTest расширяет PHPUnit_Framework_TestCase реализует TestDbAclePhpUnitAbstractTestCaseInterface {use TestDbAclePhpUnitTraitsDatabaseHelperTrait; /** * Этот метод необходимо реализовать, он должен возвращать объект PDO, который будет использоваться в настройках базы данных * * @return Pdo */public function ProvidePdo() {return new Pdo("mysql:dbname=my_db_tests;host=localhost",'myTestUser', 'myTestPassword'); } /* * Пример теста */public function test_AddressService() {$this->setupTables(" [адрес] адрес_id |компания 1 |я 3 |вы [пользователь] user_id |имя 10 |Джон 20 |Мэри "); $this->setAutoIncrement('адрес', 100); $this->addressService->addEntry("them");$this->assertTableStateContains(" [адрес] адрес_id |компания 1 |я 3 |вы 100 |их [пользователь] user_id |имя 10 |Джон 20 |Мэри ", array(), «Все работает»); } }
Если вы не используете типажи, вы можете использовать AbstractTestCase
, однако в этом случае вы не сможете использовать свои собственные базовые тестовые классы.
класс SampleTest расширяет TestDbAclePhpUnitAbstractTestCase { protected $addressService;function Setup(){parent::Setup();$this->addressService = new ServicesAddressService(); }/** * Этот метод необходимо реализовать, он должен возвращать объект PDO, который будет использоваться в настройках базы данных * * @return Pdo */public function ProvidePdo() {return new Pdo("mysql:dbname=my_db_tests;host=localhost",'myTestUser', 'myTestPassword'); }функция test_AddressService() {$this->setupTables(" [адрес] адрес_id |компания 1 |я 3 |вы [пользователь] user_id |имя 10 |Джон 20 |Мэри "); $this->setAutoIncrement('адрес', 100); $this->addressService->addEntry("them");$this->assertTableStateContains(" [адрес] адрес_id |компания 1 |я 3 |вы 100 |их [пользователь] user_id |имя 10 |Джон 20 |Мэри ", array(), «Все работает»); } }
Хорошо, очевидно, что ServicesAddressService здесь не существует (эй, ведь это прежде всего тест, верно?), и пример довольно простой.
В реальной жизни я бы поместил метод getPdo в общий базовый тестовый класс проекта, и его можно было бы получить совсем иначе, чем здесь. Но это пример.
Как видите, setupTables может настроить несколько таблиц одновременно, а AssertTableStateContains также может проверять состояние различных таблиц одновременно.
Подобно тому, как setupTables может настраивать таблицы, которые имеют гораздо больше столбцов, чем указано, AssertTableStateContains только сравнивает и утверждает значения указанных столбцов.
Самый простой способ установки Test-Db-Acle — использовать композитор (подробнее здесь: http://packagist.org), и я настоятельно рекомендую использовать этот подход, хотя вы также можете разархивировать пакет в папку и включить автозагрузку для его вручную в любой форме, которую вы пожелаете (используется соглашение об именах psr-0)
Чтобы использовать с композитором, добавьте это в файл композитора.json:
"require": { "test-db-acle/test-db-acle" : "dev-master" }, "repositories" : [ { "type": "git", "url": "https://github.com/malteriesch/test-db-acle.git" } ]
Если хотите, вы также можете использовать https://packagist.org/packages/test-db-acle/test-db-acle.
Вклад (и критика) более чем приветствуются...!
###Как запустить тесты Test-Db-Acle### Чтобы запустить тесты, вам нужно будет создать пустую базу данных на выбранном вами сервере MySql, скопироватьtests/Functional/config.php.dist вtests/ Functional/config.php и заполните данные своей базы данных. Тогда, надеюсь, все тесты запустятся. (На самом деле база данных необходима только для функционального дымового теста)
Синтаксис PSV
АннотацияTestCase
Расширение и настройка TestDbAcle
Журнал изменений