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包管理器创建一个新的应用。

如何做…

  1. 打开目录tests/codeception/templates并添加fixture模板文件users.txt
  1. <?php
  2. /**
  3. * @var $faker \Faker\Generator
  4. * @var $index integer
  5. */
  6. return [
  7. 'name' => $faker->firstName,
  8. 'phone' => $faker->phoneNumber,
  9. 'city' => $faker->city,
  10. 'about' => $faker->sentence(7, true),
  11. 'password' => Yii::$app->getSecurity()->generatePasswordHash('password_' . $index),
  12. 'auth_key' => Yii::$app->getSecurity()->generateRandomString(),
  13. ];
  1. 运行测试控制台yii命令:
  1. php tests/codeception/bin/yii fixture/generate users --count=2
  1. 确认migration生成。

  2. 检查tests/codeception/fixtures是否包含新的users.php文件,以及自动生成的数据:

  1. return [
  2. [
  3. 'name' => 'Isadore',
  4. 'phone' => '952.877.8545x190',
  5. 'city' => 'New Marvinburgh',
  6. 'about' => 'Ut quidem voluptatem itaque veniam voluptas dolores.',
  7. 'password' => '$2y$13$Fi3LOl/sKlomUH.DLgqBkOB/uCLmgCoPPL1KXiW0hffnkrdkjCzAC',
  8. 'auth_key' => '1m05hlgaAG8zfm0cyDyoRGMkbQ9W6hj1',
  9. ],
  10. [
  11. 'name' => 'Raleigh',
  12. 'phone' => '1-655-488-3585x699',
  13. 'city' => 'Reedstad',
  14. 'about' => 'Dolorem quae impedit tempore libero doloribus nobis dicta tempora facere.',
  15. 'password' => '$2y$13$U7Qte5Y1jVLrx/pnhwdwt.1uXDegGXuNVzEQyUsb65WkBtjyjUuYm',
  16. 'auth_key' => 'uWWJDgy5jNRk6KjqpxS5JuPv0OHearqE',
  17. ],
  18. ],

使用你自己的数据类型

  1. 使用你自定义生成逻辑创建你自己的provider:
  1. <?php
  2. namespace tests\codeception\faker\providers;
  3. use Faker\Provider\Base;
  4. class UserStatus extends Base
  5. {
  6. public function userStatus()
  7. {
  8. return $this->randomElement([0, 10, 20, 30]);
  9. }
  10. }
  1. /tests/codeception/config/config.php文件中添加provider到provider列表中:
  1. return [
  2. 'controllerMap' => [
  3. 'fixture' => [
  4. 'class' => 'yii\faker\FixtureController',
  5. 'fixtureDataPath' => '@tests/codeception/fixtures',
  6. 'templatePath' => '@tests/codeception/templates',
  7. 'namespace' => 'tests\codeception\fixtures',
  8. 'providers' => [
  9. 'tests\codeception\faker\providers\UserStatus',
  10. ],
  11. ],
  12. ],
  13. // ...
  14. ];
  1. 添加status字段到你的fixture模板文件中:
  1. <?php
  2. /**
  3. * @var $faker \Faker\Generator
  4. * @var $index integer
  5. */
  6. return [
  7. 'name' => $faker->firstName,
  8. 'status' => $faker->userStatus,
  9. ];
  1. 使用控制台命令生成fixture:
  1. php tests/codeception/bin/yii fixture/generate users --count=2
  1. 检查fixtures/users.php生成的代码是否包含你的自定义值:
  1. return [
  2. [
  3. 'name' => 'Christelle',
  4. 'status' => 30,
  5. ],
  6. [
  7. 'name' => 'Theo',
  8. 'status' => 10,
  9. ],
  10. ];

工作原理…

yii2-faker扩展包含一个控制台生成器(它使用你的模板来生成fixture数据文件),并给了你一个准备好的原始Faker对象实例。你可以生成所有或者指定的fixtures,并且你可以在控制台参数中传递自定义数值或者语言。

注意

如果你的测试使用这些fixtures的话,小心已存在的测试文件,因为自动生成会完全覆盖旧数据。

参考