Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database Symfony3为单元测试创建数据库_Database_Symfony_Unit Testing - Fatal编程技术网

Database 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

晚上好:-)

我现在正在学习Symfony(3),我想在课堂上使用test。我已经读到单元测试不应该使用数据库,而应该模拟它的对象

但尽管如此,我还是想在setUp()/KernelTestCase数据库(e.q.MySQL)中创建并读取其文件内容,接下来进行测试(simple-unittests),并在tearDown()处清除

是否可以使用转储的MySQL文件执行此操作

做这件事最好的方法是什么

我宁愿从ORM类中读取准备好的(转储的)类似SQL的文件,然后读取“更新:模式”。将文件放入Symfony3的何处?如何读取和创建数据库内容


请。帮帮我。

我已经用了很多年了:

  • 使用
  • 发射测试
重复!这对我来说是最有效的,因为您只加载一次测试数据不是用于每次测试。当然,您必须更仔细地考虑您的测试场景

例如,考虑一个积垢测试:

测试1

  • 检查列表是否有1项(由夹具加载)
测试2

  • 创建一个项目
  • 检查列表是否有2项
测试3

  • 删除元素
  • 检查列表中是否有1项
所以测试必须严格按照这个顺序执行。如果在每个测试之间加载夹具,则不必考虑顺序,但这会使测试速度变慢

我觉得加载一次fixture更好,因为它将像用户通常做的那样:创建、删除、更新项目。。。因此,您可以检查每个操作之间是否没有副作用

我的加载脚本:

#!/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!