【问题标题】:cakephp + phpunit + gitlab continuous integrationcakephp + phpunit + gitlab 持续集成
【发布时间】:2020-01-29 19:07:19
【问题描述】:

我正在为我在 cakephp + phpunit + gitlab-ci 中的测试寻求帮助。

我这样定义我的测试/夹具:public $import = ['model' => 'MyModel']; 以避免必须重新定义夹具中的表架构,并且代码不同步/错误。

我知道它的作用是寻找 live db 并使用该信息在 test db 中生成表,但是如果没有 live db 怎么办?

我正在尝试在 gitlab / 持续集成环境中自动化我的测试,它们为您提供了一个 mysql 容器带有单个数据库 来运行您的测试。如果我有一个单独的数据库,我将无法同时拥有主连接和测试数据库,对吧?

我正在考虑创建一个 create-db-for-tests.sql 并导入该脚本但我知道使用夹具运行测试会删除该表,因此我需要在每次测试中一次又一次地创建它.

我无法使用 gitlab mysql 服务并在测试容器中安装 mysql 以拥有 2 个数据库,就像在 dev 中一样,但我也需要用一些脚本填充另一个数据库,这与定义数据库结构相同在固定装置。

我该如何解决这个问题?

任何帮助将不胜感激。

【问题讨论】:

    标签: mysql cakephp phpunit gitlab gitlab-ci


    【解决方案1】:

    读完你的问题后,我的脑海里浮现出一些东西。

    1. 如果您没有实时数据库,则可能有两种可能性: 您可能有暂存数据库,或者您的应用程序没有数据库。
    2. 根据您关于如果我有单个数据库的第二个问题,我会说不。因为,您可以有两个连接。

    例如

     public $default = array(
        'datasource' => 'Database/Mysql',
        'persistent' => false,
        'host' => 'localhost',
        'login' => 'root',
        'password' => 'root',
        'database' => 'foge',
        'prefix' => '',
        'encoding' => 'utf8mb4',
    );
    
    public $test = array(
        'datasource' => 'Database/Mysql',
        'persistent' => false,
        'host' => 'localhost',
        'login' => 'root',
        'password' => 'root',
        'database' => 'test_foge',
        'prefix' => '',
        'encoding' => 'utf8mb4',
    );
    

    在创建fixture 时,您将主要定义两件事:如何创建表(哪些字段是表的一部分),以及最初将哪些记录填充到表中。

    我想,你可以用这个来填充你的脚本。因为这是mysql命令。但是,老实说,我以前没有尝试过。

    mysql -u jenkins -pcakephp_jenkins -e 'DROP DATABASE IF EXISTS test_foge; CREATE DATABASE test_foge; CREATE TABLE users; CREATE Table posts';

    最后一个是你可以在运行之前填充数据,我猜你已经知道了。

    class ArticleFixture extends CakeTestFixture {
    
        public $fields = array(
            'id' => array('type' => 'integer', 'key' => 'primary'),
            'title' => array('type' => 'string', 'length' => 255, 'null' => false),
            'body' => 'text',
            'published' => array('type' => 'integer', 'default' => '0', 'null' => false),
            'created' => 'datetime',
            'updated' => 'datetime'
        );
    
        public function init() {
            $this->records = array(
                array(
                    'id' => 1,
                    'title' => 'First Article',
                    'body' => 'First Article Body',
                    'published' => '1',
                    'created' => date('Y-m-d H:i:s'),
                    'updated' => date('Y-m-d H:i:s'),
                ),
            ); 
            parent::init();
         }
    }
    

    作为我个人的观点,在每次构建之前删除并重新创建数据库也是一个好主意。这使您免受连锁故障的影响,其中一个损坏的构建会导致其他构建失败。

    【讨论】:

      猜你喜欢
      • 2019-11-28
      • 2019-10-31
      • 2013-05-13
      • 1970-01-01
      • 2011-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-17
      相关资源
      最近更新 更多