【问题标题】:load fixture data for acceptance tests - Codeception为验收测试加载夹具数据 - Codeception
【发布时间】:2018-02-03 12:48:54
【问题描述】:

希望每个人都做得很好。

我有问题。在我的 Yii2 应用程序的代码接收中运行验收测试之前,我需要将我的固定装置加载到数据库中。 这是它的详细信息。

目标: 在数据库中加载夹具,以便我可以对它们进行验收测试。

问题: 尽管我尽了最大的努力,但我仍然无法实现这种影响

以下是我要与您分享的数据:

common\modules\myCustomModule\tests\acceptance\models\DashboardCest ```

class ResumeDashboardCest
{
    public function _before(AcceptanceTester $I)
    {
        $I->haveFixtures([
            'country' => [
                'class' => CountryFixture::className(),
                'dataFile' => codecept_data_dir() . 'country_data.php',
            ],
            'region' => [
                'class' => RegionFixture::className(),
                'dataFile' => codecept_data_dir() . 'region_data.php',
            ],
            'city' => [
                'class' => CityFixture::className(),
                'dataFile' => codecept_data_dir() . 'city_data.php',
            ],
            'user_group' => [
                'class' => UserGroupFixture::className(),
                'dataFile' => codecept_data_dir() . 'user_group.php',
            ],
            'user' => [
                'class' => UserFixture::className(),
                'dataFile' => codecept_data_dir() . 'user.php',
            ],
            'status' => [
                'class' => StatusFixture::className(),
                'dataFile' => codecept_data_dir() . 'status_data.php',
            ],
            'resume' => [
                'class' => ResumeFixture::className(),
                'dataFile' => codecept_data_dir() . 'resume_data.php'
            ],
        ]);
        //    initialize the module first

        // fill in the login page before performing my main test
        $I->amGoingTo("Login in My Application");

        $I->amOnPage(Url::toRoute('/site/login'));
        $I->fillField('#loginform-username', 'admin');
        $I->fillField('#loginform-password', 'gulabmehak');

        $I->click('.btn-success'); // The login button
        $I->wait(3);    //  wait for 3 seconds meanwhile bakend processing is complete
        $I->dontSee('Incorrect username or password.');
    }

    // my test function
    public function load_HomePage(AcceptanceTester $I)
    {
        $I->amOnPage( Url::toRoute('/'.\Yii::$app->params['ModuleName'].'/resume/index') );

        $I->see(T::t('main', 'My Resumes'));
        $I->see(T::t('main', 'My Resumes'), 'ul.breadcrumb li.active');
    }
}

这是国家/地区的固定装置 common\modules\myCustomModule\tests\fixtures\CountryFixture

class CountryFixture extends \yii\test\ActiveFixture
{
    public $modelClass = 'common\modules\location\models\Country';    // the model for this belongs to another module

    public function beforeLoad() {
        parent::beforeLoad();
        $this->db->createCommand()->setSql('SET FOREIGN_KEY_CHECKS = 0')->execute();
    }

    public function afterLoad() {
        parent::afterLoad();
        $this->db->createCommand()->setSql('SET FOREIGN_KEY_CHECKS = 1')->execute();
    }
}

其余的夹具文件也是如此,但为了方便起见,我已经删除了它们。

这里是数据(夹具数据)文件: common\modules\myCustomModule\tests\data\country_data.php

<?php
return [
    [
        'name' => 'Pakistan',
        'iso' => 'PK',
        'status' => 1,
    ],
    [
        'name' => 'China',
        'iso' => 'CH',
        'status' => 1,
    ],
    [
        'name' => 'United States of America',
        'iso' => 'US',
        'status' => 1,
    ],
    [
        'name' => 'Saudi Arabia',
        'iso' => 'SA',
        'status' => 1,
    ],
    [
        'name' => 'Japan',
        'iso' => 'JP',
        'status' => 1,
    ],
];

以防万一您需要我的配置: common\modules\myCustomModule\tests\acceptance.suite.yml

class_name: AcceptanceTester
modules:
    enabled:
        - WebDriver
        - Yii2:
           part:
              [init, orm, fixtures]
    config:
        db:
          populate: false
          cleanup: false

        WebDriver:
            url: 'http://localhost/myProject/'
            browser: phantomjs
            window_size: 1920x1310
            capabilities:
              webStorageEnabled: true

代码识别:2.2.9 Yii2应用版本:2.0.12 作曲家:1.4.2 我也在使用 PhantomJs 进行测试

如有任何问题,请告诉我。 保持祝福。

【问题讨论】:

  • 为了通过其他方式,我尝试使用yiiframework.com/doc-2.0/… 直接加载固定装置,但仍然一无所获。我在 github 上开始了一个线程,直到现在,它没有帮助 github.com/Codeception/Codeception/issues/4099
  • 框架特定模块用于功能测试,而不是验收测试
  • 我想测试我的网页。为此,我需要编写验收测试
  • 但是您不能使用该模块来加载夹具。您将不得不找到另一种方法来更新数据库。 Codeception 提供了使用转储恢复完整数据库的能力。如果您想要更多控制权,您可以编写自己的 sql 插入或更新查询并使用我在此处发布的函数运行它们:stackoverflow.com/questions/44499975/…

标签: automated-tests yii2-advanced-app codeception acceptance-testing


【解决方案1】:

好吧,我根据我在https://github.com/Codeception/Codeception/issues/4099 开始的线程找到了一个解决方案

我只是在验收测试中加载了固定装置,就像在 mu 单元测试中一样

这是我在 _before() 方法之前放置在 Cest 文件中的方法

public function _fixtures()
{
    return [
        'country' => [
            'class' => CountryFixture::className(),
            'dataFile' => codecept_data_dir() . 'country_data.php',
        ],
        'region' => [
            'class' => RegionFixture::className(),
            'dataFile' => codecept_data_dir() . 'region_data.php',
        ],
        'city' => [
            'class' => CityFixture::className(),
            'dataFile' => codecept_data_dir() . 'city_data.php',
        ],
        'user_group' => [
            'class' => UserGroupFixture::className(),
            'dataFile' => codecept_data_dir() . 'user_group.php',
        ],
        'user' => [
            'class' => UserFixture::className(),
            'dataFile' => codecept_data_dir() . 'user.php',
        ],
        'status' => [
            'class' => StatusFixture::className(),
            'dataFile' => codecept_data_dir() . 'status_data.php',
        ],
        'resume' => [
            'class' => ResumeFixture::className(),
            'dataFile' => codecept_data_dir() . 'resume_data.php'
        ],
    ];
}

有趣的是,我看不到设备正在加载到我的数据库中,但我可以在这里做的是检查我的 cest 文件,以在运行我的测试方法之前了解数据是否存储在 db 中。

我将此代码放在我的 _before() 方法中

    $I->seeRecord(UserModel::className(), ['username'=>'admin', 'email'=>'admin@offneo.com']);
    $I->seeRecord(CountryModel::className(), ['name'=>'Pakistan', 'iso'=>'PK']);
    $I->seeRecord(ResumeModel::className(), ['title'=>'Second Resume', 'created_at'=>'2017-08-15 10:06:06']);

以上几行证实了我的数据库中已加载了固定装置。现在我可以随意放置其余代码进行验收测试了。

这可能会对某人有所帮助。 保持祝福。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-01
    • 2011-06-07
    • 2016-11-03
    • 2019-03-06
    • 1970-01-01
    • 2014-08-17
    • 2017-03-25
    • 2013-06-10
    相关资源
    最近更新 更多