Fake fixture 数据生成器
fzaninotto/faker是一个PHP扩展,它可以生成需要种类的假数据:名称、电话、地址,以及随机字符串和数字等等。它可以帮助你生成需要随机记录,用于性能和逻辑测试。你可以通过写自己的formatters和generators来扩展你支持的类型集合。
在Yii2应用骨架中,yiisoft/yii2-faker wrapper被包含在composer.json文件的require-dev部分中,这部分用于测试代码(第十一章,测试)。这个wrapper为控制台应用和测试环境提供FixtureController控制台。
准备
按照官方指南http://www.yiiframework.com/doc-2.0/guide-start-installation.html的描述,使用Composer包管理器创建一个新的应用。
如何做…
- 打开目录tests/codeception/templates并添加fixture模板文件users.txt:
<?php
/**
* @var $faker \Faker\Generator
* @var $index integer
*/
return [
    'name' => $faker->firstName,
    'phone' => $faker->phoneNumber,
    'city' => $faker->city,
    'about' => $faker->sentence(7, true),
    'password' => Yii::$app->getSecurity()->generatePasswordHash('password_' . $index),
    'auth_key' => Yii::$app->getSecurity()->generateRandomString(),
];
- 运行测试控制台yii命令:
php tests/codeception/bin/yii fixture/generate users --count=2
- 
    确认migration生成。 
- 
    检查 tests/codeception/fixtures是否包含新的users.php文件,以及自动生成的数据:
return [
    [
        'name' => 'Isadore',
        'phone' => '952.877.8545x190',
        'city' => 'New Marvinburgh',
        'about' => 'Ut quidem voluptatem itaque veniam voluptas dolores.',
        'password' => '$2y$13$Fi3LOl/sKlomUH.DLgqBkOB/uCLmgCoPPL1KXiW0hffnkrdkjCzAC',
        'auth_key' => '1m05hlgaAG8zfm0cyDyoRGMkbQ9W6hj1',
    ],
    [
        'name' => 'Raleigh',
        'phone' => '1-655-488-3585x699',
        'city' => 'Reedstad',
        'about' => 'Dolorem quae impedit tempore libero doloribus nobis dicta tempora facere.',
        'password' => '$2y$13$U7Qte5Y1jVLrx/pnhwdwt.1uXDegGXuNVzEQyUsb65WkBtjyjUuYm',
        'auth_key' => 'uWWJDgy5jNRk6KjqpxS5JuPv0OHearqE',
    ],
],
使用你自己的数据类型
- 使用你自定义生成逻辑创建你自己的provider:
<?php
namespace tests\codeception\faker\providers;
use Faker\Provider\Base;
class UserStatus extends Base
{
    public function userStatus()
    {
        return $this->randomElement([0, 10, 20, 30]);
    }
}
- 在/tests/codeception/config/config.php文件中添加provider到provider列表中:
return [
    'controllerMap' => [
        'fixture' => [
            'class' => 'yii\faker\FixtureController',
            'fixtureDataPath' => '@tests/codeception/fixtures',
            'templatePath' => '@tests/codeception/templates',
            'namespace' => 'tests\codeception\fixtures',
            'providers' => [
                'tests\codeception\faker\providers\UserStatus',
            ],
        ],
    ],
// ...
];
- 添加status字段到你的fixture模板文件中:
<?php
/**
 * @var $faker \Faker\Generator
 * @var $index integer
 */
return [
    'name' => $faker->firstName,
    'status' => $faker->userStatus,
];
- 使用控制台命令生成fixture:
php tests/codeception/bin/yii fixture/generate users --count=2
- 检查fixtures/users.php生成的代码是否包含你的自定义值:
return [
    [
        'name' => 'Christelle',
        'status' => 30,
    ],
    [
        'name' => 'Theo',
        'status' => 10,
    ],
];
工作原理…
yii2-faker扩展包含一个控制台生成器(它使用你的模板来生成fixture数据文件),并给了你一个准备好的原始Faker对象实例。你可以生成所有或者指定的fixtures,并且你可以在控制台参数中传递自定义数值或者语言。
注意
如果你的测试使用这些fixtures的话,小心已存在的测试文件,因为自动生成会完全覆盖旧数据。
参考
- 源代码以及关于扩展的更多信息,参考:
- https://github.com/yiisoft/yii2-faker/tree/master/docs/guide
- http://www.yiiframework.com/doc-2.0/ext-faker-index.html
- 欲了解更多关于原始库的信息,参考:
- https://github.com/fzaninotto/Faker
- 第十一章,测试