База данных
Установка
Если вы используете Codeception, установленный с помощью Composer, установите этот модуль с помощью следующей команды:
composer require --dev codeception/module-db
В качестве альтернативы, вы можете включить Db модуль в файле конфигурации набора тестов и выполнить
codecept init upgrade4
Этот модуль был включён в Codeception 2 и 3, но с версии 4 его необходимо устанавливать отдельно.
Некоторые модули поставляются с файлами PHAR.
Предупреждение. Использование файла PHAR и Composer в одном проекте может привести к неожиданным ошибкам.
Описание
Доступ к базе данных.
Самая важная функция этого модуля — очистка базы данных перед каждым тестом. Этот модуль также предоставляет действия для проверки базы данных, например, seeInDatabase()
Для того, чтобы ваша база данных была заполнена данными, вам нужен исходный дамп SQL. Просто поместите дамп в директорию tests/_data (по умолчанию) и укажите путь в конфигурации. В следующий раз после очистки базы данных все ваши данные будут восстановлены из дампа. Не забудьте включить CREATE TABLE операторы в дампе.
Поддерживаемые и протестированные базы данных:
- MySQL
- SQLite (т.е. просто один файл)
- PostgreSQL
Также доступны:
- MS SQL
- Oracle
Подключение выполняется с помощью драйверов базы данных, которые хранятся в пространстве имён Codeception\Lib\Driver. Проверьте драйверы, если у вас возникнут проблемы с загрузкой дампов и очисткой баз данных.
Конфигурация
- dsn обязательно - PDO DSN
- user обязательно - имя пользователя для доступа к базе данных
- password обязательно - пароль
- dump - путь к дампу базы данных
- populate: false - загружать ли дамп перед запуском набора тестов
- cleanup: false - загружать ли дамп перед каждым тестом
- reconnect: false - переподключаться ли модулю к базе данных перед каждым тестом
- waitlock: 0 - время ожидания блокировки (в секундах), которое должна использовать сессия базы данных для DDL-операторов
- ssl_key - путь к ключу SSL (специфично для MySQL, см. @see http://php.net/manual/de/ref.pdo-mysql.php#pdo.constants.mysql-attr-key)
- ssl_cert - путь к сертификату SSL (специфично для MySQL, см. @see http://php.net/manual/de/ref.pdo-mysql.php#pdo.constants.mysql-attr-ssl-cert)
- ssl_ca - путь к сертификату уполномоченной организации SSL (специфично для MySQL, см. @see http://php.net/manual/de/ref.pdo-mysql.php#pdo.constants.mysql-attr-ssl-ca)
- ssl_verify_server_cert - отключает проверку CN сертификата (специфично для MySQL, см. @see http://php.net/manual/de/ref.pdo-mysql.php)
- ssl_cipher - список одного или нескольких допустимых шифров для использования в шифровании SSL (специфично для MySQL, см. @see http://php.net/manual/de/ref.pdo-mysql.php#pdo.constants.mysql-attr-cipher)
- databases - включить больше конфигураций баз данных и переключаться между ними в тестах.
- initial_queries - список запросов, которые должны быть выполнены сразу после инициализации подключения к базе данных, например, создание базы данных, если она не существует, или подготовка набора символов базы данных
Пример
modules:
enabled:
- Db:
dsn: 'mysql:host=localhost;dbname=testdb'
user: 'root'
password: ''
dump: 'tests/_data/dump.sql'
populate: true
cleanup: true
reconnect: true
waitlock: 10
ssl_key: '/path/to/client-key.pem'
ssl_cert: '/path/to/client-cert.pem'
ssl_ca: '/path/to/ca-cert.pem'
ssl_verify_server_cert: false
ssl_cipher: 'AES256-SHA'
initial_queries:
- 'CREATE DATABASE IF NOT EXISTS temp_db;'
- 'USE temp_db;'
- 'SET NAMES utf8;'
Пример с несколькими дампами
modules:
enabled:
- Db:
dsn: 'mysql:host=localhost;dbname=testdb'
user: 'root'
password: ''
dump:
- 'tests/_data/dump.sql'
- 'tests/_data/dump-2.sql'
Пример с несколькими базами данных
modules:
enabled:
- Db:
dsn: 'mysql:host=localhost;dbname=testdb'
user: 'root'
password: ''
databases:
db2:
dsn: 'mysql:host=localhost;dbname=testdb2'
user: 'userdb2'
password: ''
Пример с Sqlite
modules:
enabled:
- Db:
dsn: 'sqlite:relative/path/to/sqlite-database.db'
user: ''
password: ''
SQL дамп данных
Есть два способа загрузки дампа в вашу базу данных:
Загрузчик
Рекомендуемый подход — настройка populator, внешней команды для загрузки дампа. Параметры команды, такие как хост, имя пользователя, пароль, база данных, могут быть получены из конфигурации и вставлены в заполнитель:
Для MySQL:
modules:
enabled:
- Db:
dsn: 'mysql:host=localhost;dbname=testdb'
user: 'root'
password: ''
dump: 'tests/_data/dump.sql'
populate: true # run populator before all tests
cleanup: true # run populator before each test
populator: 'mysql -u $user -h $host $dbname < $dump' Для PostgreSQL (используя pg_restore)
modules:
enabled:
- Db:
dsn: 'pgsql:host=localhost;dbname=testdb'
user: 'root'
password: ''
dump: 'tests/_data/db_backup.dump'
populate: true # run populator before all tests
cleanup: true # run populator before each test
populator: 'pg_restore -u $user -h $host -D $dbname < $dump' Имена переменных берутся из конфигурации и DSN, имеющего формат keyword=value, поэтому вы должны ожидать наличия переменной с именем ключевого слова со всем значением внутри неё.
Элементы PDO dsn для поддерживаемых драйверов:
- MySQL: PDO_MYSQL DSN
- SQLite: PDO_SQLITE DSN - используйте относительный путь от корня проекта
- PostgreSQL: PDO_PGSQL DSN
- MSSQL: PDO_SQLSRV DSN
- Oracle: PDO_OCI DSN
Дамп
Модуль Db сам может загружать SQL дамп без использования внешних инструментов, используя текущее подключение к базе данных. Этот подход независим от системы, однако он медленнее, чем использование загрузчика, и может иметь проблемы с парсингом (см. ниже).
Укажите путь к файлу SQL в опции конфигурации dump.
modules:
enabled:
- Db:
dsn: 'mysql:host=localhost;dbname=testdb'
user: 'root'
password: ''
populate: true # load dump before all tests
cleanup: true # load dump for each test
dump: 'tests/_data/dump.sql' Для парсинга SQL файла базы данных, он должен соответствовать этому спецификации:
- Комментарии разрешены.
- В
dump.sqlмогут содержаться многострочные операторы. - Разделитель, в данном случае точка с запятой, должен находиться на той же строке, что и последний оператор:
-- Add a few contacts to the table. REPLACE INTO `Contacts` (`created`, `modified`, `status`, `contact`, `first`, `last`) VALUES (NOW(), NOW(), 1, 'Bob Ross', 'Bob', 'Ross'), (NOW(), NOW(), 1, 'Fred Flintstone', 'Fred', 'Flintstone'); -- Remove existing orders for testing. DELETE FROM `Order`;
Генерация запросов
seeInDatabase, dontSeeInDatabase, seeNumRecords, grabFromDatabase и grabNumRecords методы принимают массивы в качестве критериев. Условие WHERE генерируется с использованием ключа элемента в качестве имени поля и значения элемента в качестве значения поля.
Пример:
<?php
$I->seeInDatabase('users', ['name' => 'Davert', 'email' => 'davert@mail.com']); Сгенерирует:
SELECT COUNT(*) FROM `users` WHERE `name` = 'Davert' AND `email` = 'davert@mail.com'
Начиная с версии 2.1.9, в условии можно использовать LIKE, как показано здесь:
<?php
$I->seeInDatabase('users', ['name' => 'Davert', 'email like' => 'davert%']); Сгенерирует:
SELECT COUNT(*) FROM `users` WHERE `name` = 'Davert' AND `email` LIKE 'davert%'
Также доступны сравнения с NULL, как показано здесь:
<?php
$I->seeInDatabase('users', ['name' => null, 'email !=' => null]); Сгенерирует:
SELECT COUNT(*) FROM `users` WHERE `name` IS NULL AND `email` IS NOT NULL
Публичные свойства
- dbh - содержит подключение PDO
- driver - содержит драйвер подключения
Действия
Подключен ли к базе данных
Убедитесь, что вы подключены к нужной базе данных.
<?php
$I->seeNumRecords(2, 'users'); //executed on default database
$I->amConnectedToDatabase('db_books');
$I->seeNumRecords(30, 'books'); //executed on db_books database
//All the next queries will be on db_books -
param$databaseKey @throws ModuleConfigException
Отсутствует в базе данных
Эффект противоположен ->seeInDatabase
Утверждает, что в базе данных нет записей со значениями заданных столбцов. Укажите имя таблицы и значения столбцов.
<?php
$I->dontSeeInDatabase('users', ['name' => 'Davert', 'email' => 'davert@mail.com']); Не проходит, если такой пользователь найден.
Также можно использовать выражения сравнения:
<?php
$I->dontSeeInDatabase('posts', ['num_comments >=' => '0']);
$I->dontSeeInDatabase('users', ['email like' => 'miles%']); Поддерживаемые операторы: <, >, >=, <=, !=, like.
-
param string$table -
param array$criteria
Получить столбец из базы данных
Извлекает все значения из столбца в базе данных. Укажите имя таблицы, желаемый столбец и критерии.
<?php
$mails = $I->grabColumnFromDatabase('users', 'email', array('name' => 'RebOOter')); -
param string$table -
param string$column -
param array$criteria return array
Получить значение из базы данных
Извлекает значение одного столбца из базы данных. Укажите имя таблицы, желаемый столбец и критерии.
<?php
$mail = $I->grabFromDatabase('users', 'email', array('name' => 'Davert')); Также можно использовать выражения сравнения:
<?php
$post = $I->grabFromDatabase('posts', ['num_comments >=' => 100]);
$user = $I->grabFromDatabase('users', ['email like' => 'miles%']); Поддерживаемые операторы: <, >, >=, <=, !=, like.
-
param string$table -
param string$column -
param array$criteria -
return mixedВозвращает значение одного столбца или false
Получить количество записей
Возвращает количество строк в базе данных
-
param string$table Имя таблицы -
param array$criteria Критерии поиска [Необязательно] return int
Добавить в базу данных
Вставляет SQL запись в базу данных. Эта запись будет удалена после теста.
<?php
$I->haveInDatabase('users', array('name' => 'miles', 'email' => 'miles@davis.com'));
?> -
param string$table -
param array$data -
return integer$id
Выполнить в базе данных
Может использоваться с обратным вызовом, если вы не хотите изменять текущую базу данных в своём тесте.
<?php
$I->seeNumRecords(2, 'users'); //executed on default database
$I->performInDatabase('db_books', function($I) {
$I->seeNumRecords(30, 'books'); //executed on db_books database
});
$I->seeNumRecords(2, 'users'); //executed on default database Список действий можно динамически создать с помощью Codeception\Util\ActionSequence:
<?php
$I->performInDatabase('db_books', ActionSequence::build()
->seeNumRecords(30, 'books')
); В качестве альтернативы можно использовать массив:
$I->performInDatabase('db_books', ['seeNumRecords' => [30, 'books']]); Выберите синтаксис, который вам нравится больше, и используйте его.
Действия, выполненные из массива или ActionSequence, будут выводить отладочную информацию о действиях и добавлять имя действия к исключению при сбое.
-
param$databaseKey -
param \Codeception\Util\ActionSequence|array|callable$actions @throws ModuleConfigException
Найти в базе данных
Утверждает, что существует строка со значениями заданных столбцов. Укажите имя таблицы и значения столбцов.
<?php
$I->seeInDatabase('users', ['name' => 'Davert', 'email' => 'davert@mail.com']); Не проходит, если такого пользователя не найдено.
Также можно использовать выражения сравнения:
<?php
$I->seeInDatabase('posts', ['num_comments >=' => '0']);
$I->seeInDatabase('users', ['email like' => 'miles@davis.com']); Поддерживаемые операторы: <, >, >=, <=, !=, like.
-
param string$table -
param array$criteria
Утвердить количество записей
Утверждает, что заданное количество записей было найдено в базе данных.
<?php $I->seeNumRecords(1, 'users', ['name' => 'davert']) ?>
-
param int$expectedNumber Ожидаемое количество -
param string$table Имя таблицы -
param array$criteria Критерии поиска [Необязательно]
Обновить в базе данных
Обновляет SQL запись в базе данных.
<?php
$I->updateInDatabase('users', array('isAdmin' => true), array('email' => 'miles@davis.com'));
?> -
param string$table -
param array$data -
param array$criteria
© 2011 Michael Bodnarchuk and contributors
Licensed under the MIT License.
https://codeception.com/docs/modules/Db