Database Symfony3为单元测试创建数据库
晚上好:-) 我现在正在学习Symfony(3),我想在课堂上使用test。我已经读到单元测试不应该使用数据库,而应该模拟它的对象 但尽管如此,我还是想在setUp()/KernelTestCase数据库(e.q.MySQL)中创建并读取其文件内容,接下来进行测试(simple-unittests),并在tearDown()处清除 是否可以使用转储的MySQL文件执行此操作 做这件事最好的方法是什么 我宁愿从ORM类中读取准备好的(转储的)类似SQL的文件,然后读取“更新:模式”。将文件放入Symfony3的何处?如何读取和创建数据库内容Database Symfony3为单元测试创建数据库,database,symfony,unit-testing,Database,Symfony,Unit Testing,晚上好:-) 我现在正在学习Symfony(3),我想在课堂上使用test。我已经读到单元测试不应该使用数据库,而应该模拟它的对象 但尽管如此,我还是想在setUp()/KernelTestCase数据库(e.q.MySQL)中创建并读取其文件内容,接下来进行测试(simple-unittests),并在tearDown()处清除 是否可以使用转储的MySQL文件执行此操作 做这件事最好的方法是什么 我宁愿从ORM类中读取准备好的(转储的)类似SQL的文件,然后读取“更新:模式”。将文件放入Sy
请。帮帮我。我已经用了很多年了:
- 使用
- 发射测试
- 检查列表是否有1项(由夹具加载)
- 创建一个项目
- 检查列表是否有2项
- 删除元素
- 检查列表中是否有1项
#!/bin/bash
echo "##########################################################################"
echo "# Refresh data model, reload all reference data, load fixtures, #"
echo "# validate schema for the dev env. #"
echo "##########################################################################"
php bin/console doctrine:database:create --if-not-exists --env=dev
php bin/console doctrine:schema:drop --force --env=dev
php bin/console doctrine:schema:create --env=dev
php bin/console doctrine:schema:validate --env=dev
php bin/console doctrine:fixtures:load -n --env=dev
echo -e " --> DONE\n"
或者,如果要为SQL文件加载数据库,请使用:
php bin/console doctrine:database:import db.sqb --env=dev
而不是“加载装置”命令
然后,启动测试:
./bin/simple-phpunit --debug --verbose $1
$1
是一个参数,用于指定要加载的测试套件。(主、前端、API、后端…),您可以在phpunit.xml.dist
文件中对其进行参数设置。(您可以省略它以运行所有测试)我的解决方案是:
这会将所有SQL文件加载到MySQL测试数据库中(在'parameters\u TEST.yml'
和processing TEST中定义),并在下一次测试之前和下一次测试中删除所有数据库表。。。正如@tokeen.com所说,使用命令php-bin/console-doctor:database:import…
。谢谢你的帮助
// tests/AppBundle/Repository/BotsDbTest.php
<?php
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use Symfony\Component\Finder\Finder;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\Yaml\Parser;
class BotsDbTest extends KernelTestCase
{
private $doctr;
private $db_cred;
private $db;
/**
* {@inheritDoc}
*/
protected function setUp()
{
$kernel = self::bootKernel();
$this->doctr = $kernel->getContainer()
->get('doctrine')
->getManager();
// for tests with loaded content
$this->db = new \AppBundle\Wiks\BotsDb();
// https://symfony.com/doc/current/bundles/extension.html
// get DB credientals from "parameters_test.yml":
$configDirectories = array( 'app/config' );
$locator = new FileLocator( $configDirectories );
$yamlUserFiles = $locator->locate( 'parameters_test.yml', null, false );
// https://davidegan.me/parse-yaml-in-php-using-symfony-yaml/
$yaml = new Parser();
$yaml_array = $yaml->parse( file_get_contents( $yamlUserFiles['0'] ) );
// needen DB is the second in Symfony - as database2 in file "parameters_test.yml":
$prefix_db = 'database2';
// looking for all keys with suffix: eq: 'database2_host'
$needed_sufix = [ 'host', 'port', 'name', 'user', 'password' ];
$this->db_cred = array();
foreach ( $yaml_array[ 'parameters' ] as $key => $value ) {
if ( strpos( $key, $prefix_db ) !== false ) {
foreach ( $needed_sufix as $needed_key ) {
if ( strpos( $key, $needed_key ) !== false ) {
$this->db_cred[ $needed_key ] = $value;
}
}
}
}
if ( count( $this->db_cred ) == count( $needed_sufix ) ) {
// check is all found
/*Array (
[host] => 127.0.0.1
[port] =>
[name] => db_name
[user] => user_name
[password] => ***
) */
$finder = new Finder();
// find and put into mysql all files as prepared content to tests
$finder->files()->name('*.sql');
foreach ( $finder->in( array( 'tests/dbcontent' ) ) as $file ) {
$shell_command = 'mysql --user='.$this->db_cred['user'].' --password='.$this->db_cred['password'];
$shell_command .= ' '.$this->db_cred['name'].'< '.$file->getRealPath();
shell_exec( $shell_command );
}
}
}
/**
* {@inheritDoc}
*/
protected function tearDown()
{
parent::tearDown();
// remoove DB content ( all tabels ):
$shell_command = 'mysqldump --user='.$this->db_cred['user'].' --password='.$this->db_cred['password'].' ';
$shell_command .= '--add-drop-table --no-data '.$this->db_cred['name'].' | ';
$shell_command .= 'grep -e \'^DROP \| FOREIGN_KEY_CHECKS\' | ';
$shell_command .= 'mysql --user='.$this->db_cred['user'].' --password='.$this->db_cred['password'].' '.$this->db_cred['name'];
shell_exec( $shell_command );
$this->doctr->close();
$this->doctr = null; // avoid memory leaks
}
/** tests, tests, tests...
*
*/
public function test_getBots()
{
$res = $this->db->getBots( $this->doctr );
$this->assertEquals(5, count( $res ));
[...]
//tests/AppBundle/Repository/BotsDbTest.php
超级,downwote比Help更简单谢谢你的回答。我必须重新考虑我对考试的看法。起初,我打算简单地从先前准备好的转储文件.sql加载MySQL数据库。问题是,我不知道,如何使用从Symfony DB credientals中挑选的。。。我的类执行对一些表内容的分析,这样(下载prepared.sql进行测试)似乎是最佳选择。还可以使用doctor:database:import
命令从SQL文件导入数据库。请使用doctor:database:import
指出简短的解决方案…我找不到任何东西…我可以理解…但是:-(运行:php bin/console doctor:database:import db.SQL--env=dev
(用数据库的sql脚本替换db.sql)。非常感谢!!!这项工作!!!wiks@asus:/var/www/sfproject\u v1$php bin/console原则:数据库:导入测试/dbcontent/wiks\u通信\u 5tbl.sql--env=dev处理文件“/var/www/sfproject\u v1/tests/dbcontent/wiks\u通信\u 5tbl.sql”…OK!