esit / fakertoolbox
此软件是一款开源CMS Contao的扩展,允许直接在DCAdie中存储测试数据定义。
Requires
- php: ^7.2||^8.0
- contao/conflicts: @dev
- contao/core-bundle: ^4.4
- contao/manager-bundle: ^4.4
- fakerphp/faker: ^1.17
Requires (Dev)
- contao/test-case: ^4.4
- phpunit/phpunit: ^9.5
README
描述
此软件是一款开源CMS Contao的扩展,允许直接在DCAdie中存储测试数据定义,然后可以通过简单的调用Faker来创建单个字段或整个表格行的测试数据。
许可证
在LGPLv3许可下分发。有关更多信息,请参阅LICENSE
文件。
作者
e@sy Solutions IT: Patrick Froch info@easySolutionsIT.de
支持
要求
- php: >=7.2
- contao/core-bundle: >=4.4
安装
安装可以通过Contao Manager轻松完成,搜索esit/fakertoolbox
并安装。
配置
在DCA中有四个条目可以插入到eval
数组中
fakerMethod
fakerMethod
指定Faker用于创建此字段测试数据的Method。提供Faker提供的所有方法。可以在以下位置找到概述:https://github.com/fzaninotto/Faker
示例
$GLOBALS['TL_DCA']['tl_member']['fields']['firstname']['eval']['fakerMethod'] = 'firstName';
当请求字段tl_member.firstname
的测试值时,将创建一个名字。
fakerParameter
使用fakerParameter
可以定义创建方法的参数,例如,可以限制数字范围。
示例
$GLOBALS['TL_DCA']['tl_member']['fields']['id']['eval']['fakerMethod'] = 'numberBetween'; $GLOBALS['TL_DCA']['tl_member']['fields']['id']['eval']['fakerParameter'] = [1, 9999];
当需要为字段tl_member.id
创建测试值时,将返回一个介于1和9999之间的数字。
fakerOptional
使用fakerOptional
可以指定值生成的概率以及作为默认值返回的内容。
示例
$GLOBALS['TL_DCA']['tl_member']['fields']['id']['eval']['fakerMethod'] = 'firstName'; $GLOBALS['TL_DCA']['tl_member']['fields']['id']['eval']['fakerOptional'] = [0.6, ''];
以60%的概率返回一个名字,否则返回一个空字符串。
fakerUnique
如果将fakerUnique
设置为true,则总是返回不同的值。如果由于例如可用元素不足等原因无法实现,则会生成错误(见Modifiers)。
示例
$GLOBALS['TL_DCA']['tl_member']['fields']['id']['eval']['fakerMethod'] = 'numberBetween'; $GLOBALS['TL_DCA']['tl_member']['fields']['id']['eval']['fakerParameter'] = [1, 3]; $GLOBALS['TL_DCA']['tl_member']['fields']['id']['eval']['fakerUnique'] = true;
在此配置中,当无法返回新的1到3之间的数字时(即第4次调用时),将生成错误。
fakerSerial
使用fakerSerial
设置可以创建序列化数据。由于Contao以这种方式表示多重关系,因此在测试中经常遇到。设置必须包含两个数字的数组。第一个指定要生成数据的最低数量,第二个指定最大数量。如果需要生成空数据集,则返回空字符串而不是a:0:{}
,因为这也是Contao的做法。
示例
$GLOBALS['TL_DCA']['tl_member']['fields']['groups']['eval']['fakerMethod'] = 'numberBetween'; $GLOBALS['TL_DCA']['tl_member']['fields']['groups']['eval']['fakerParameter'] = [1, 10]; $GLOBALS['TL_DCA']['tl_member']['fields']['groups']['eval']['fakerSerial'] = [1,5]; // Anzahl der serialisierten Datensätze: [min., max.]
在此示例中,将为每个条目创建1到5个数字,并将它们作为序列化数组返回。这些可以是成员组的ID。
重要的是,不应输入0到5,否则会生成相对较多的空数据集。虽然这会工作,但可以通过fakerOptional
进行更好的配置。
使用
创建工厂
在DCA中设置完设置后,可以简单地生成测试值。首先获取工厂。
$factory = \Contao\System::getContainer()->get('esit_fakertoolbox.services.factories.fakerfactory');
还可以通过依赖注入简单地获取服务。
ContaoFaker
现在可以通过传递所需表来获取实际的 ContaoFaker
。这是一个封装了收集所需信息和实际创建逻辑的包装器,旨在简化使用。
$faker = $factory->getFaker('tl_member');
测试值
要访问测试值,有三种方法。可以简单地通过属性访问来获取单个值。重要的是,只能访问已定义 fakerMethod
的字段。如果访问没有定义 fakerMethod
的字段,将生成错误。
示例
$id = $faker->id;
可以获取整个表行。重要的是,只为那些定义了 fakerMethod
的字段生成值,其他字段将被忽略。
示例
$row = $faker->getRow();
最后,可以获取任意数量的表行,例如填充测试数据库。只需传递所需的数量即可。这里也只为定义了 fakerMethod
的字段创建测试数据。
示例
$rows = $faker->getRows(5);
自定义提供者
可以简单地通过包装器注册自定义提供者。这样就可以生成特殊数据(参见 Faker 内部:理解提供者)。
$factory = \Contao\System::getContainer()->get('esit_fakertoolbox.services.factories.fakerfactory'); $faker = $factory->getFaker('tl_member'); $faker->addProvider(\Esit\Fakertoolbox\Classes\Provider\Internet::class);
\Esit\Fakertoolbox\Classes\Provider\Internet::class
必须被自己的提供者替换。
内置提供者
除了 Faker 提供的提供者外,还为 Contao 提供了特殊提供者。
internetAddress
该提供者返回带有协议的 Internet 地址(例如 https://www.example.org/
)。在 80% 的调用中,地址将以 www
创建。可以指定要使用的协议(例如 https://
或 http://
)。由于 https://
和 http://
是标准协议,因此不需要指定它们,在这种情况下,条目可以省略。
示例
$GLOBALS['TL_DCA']['tl_member']['fields']['website']['eval']['fakerMethod'] = 'internetAddress'; $GLOBALS['TL_DCA']['tl_member']['fields']['website']['eval']['fakerParameter'] = [['https://', 'http://']]; // kann entfallen, da diese Protokolle der Standardfall sind. $GLOBALS['TL_DCA']['tl_member']['fields']['website']['eval']['fakerOptional'] = [0.9, '']; // 10% chance of getting emtpy string
完整示例
扩展 DCA
在此示例中,通过一些测试数据扩展了 tl_member
表的 DCA。
$GLOBALS['TL_DCA']['tl_member']['fields']['id']['eval']['fakerMethod'] = 'numberBetween'; $GLOBALS['TL_DCA']['tl_member']['fields']['id']['eval']['fakerParameter'] = [1, 9999]; $GLOBALS['TL_DCA']['tl_member']['fields']['tstamp']['eval']['fakerMethod'] = 'unixTime'; $GLOBALS['TL_DCA']['tl_member']['fields']['firstname']['eval']['fakerMethod'] = 'firstName'; $GLOBALS['TL_DCA']['tl_member']['fields']['lastname']['eval']['fakerMethod'] = 'lastName'; $GLOBALS['TL_DCA']['tl_member']['fields']['dateOfBirth']['eval']['fakerMethod'] = 'unixTime'; $GLOBALS['TL_DCA']['tl_member']['fields']['company']['eval']['fakerMethod'] = 'company'; $GLOBALS['TL_DCA']['tl_member']['fields']['street']['eval']['fakerMethod'] = 'streetAddress'; $GLOBALS['TL_DCA']['tl_member']['fields']['postal']['eval']['fakerMethod'] = 'postcode'; $GLOBALS['TL_DCA']['tl_member']['fields']['city']['eval']['fakerMethod'] = 'city'; $GLOBALS['TL_DCA']['tl_member']['fields']['state']['eval']['fakerMethod'] = 'state'; $GLOBALS['TL_DCA']['tl_member']['fields']['country']['eval']['fakerMethod'] = 'country'; $GLOBALS['TL_DCA']['tl_member']['fields']['phone']['eval']['fakerMethod'] = 'phoneNumber'; $GLOBALS['TL_DCA']['tl_member']['fields']['mobile']['eval']['fakerMethod'] = 'phoneNumber'; $GLOBALS['TL_DCA']['tl_member']['fields']['mobile']['eval']['fakerOptional'] = [0.4, '']; $GLOBALS['TL_DCA']['tl_member']['fields']['fax']['eval']['fakerMethod'] = 'phoneNumber'; $GLOBALS['TL_DCA']['tl_member']['fields']['fax']['eval']['fakerOptional'] = [0.2, '']; $GLOBALS['TL_DCA']['tl_member']['fields']['email']['eval']['fakerMethod'] = 'email'; $GLOBALS['TL_DCA']['tl_member']['fields']['language']['eval']['fakerMethod'] = 'languageCode'; $GLOBALS['TL_DCA']['tl_member']['fields']['login']['eval']['fakerMethod'] = 'unixTime'; $GLOBALS['TL_DCA']['tl_member']['fields']['username']['eval']['fakerMethod'] = 'userName'; $GLOBALS['TL_DCA']['tl_member']['fields']['disable']['eval']['fakerMethod'] = 'boolean'; $GLOBALS['TL_DCA']['tl_member']['fields']['disable']['eval']['fakerParameter'] = [80]; // chance of getting true $GLOBALS['TL_DCA']['tl_member']['fields']['start']['eval']['fakerMethod'] = 'unixTime'; $GLOBALS['TL_DCA']['tl_member']['fields']['stop']['eval']['fakerMethod'] = 'unixTime'; $GLOBALS['TL_DCA']['tl_member']['fields']['dateAdded']['eval']['fakerMethod'] = 'unixTime'; $GLOBALS['TL_DCA']['tl_member']['fields']['lastLogin']['eval']['fakerMethod'] = 'unixTime'; $GLOBALS['TL_DCA']['tl_member']['fields']['currentLogin']['eval']['fakerMethod'] = 'unixTime'; $GLOBALS['TL_DCA']['tl_member']['fields']['loginAttempts']['eval']['fakerMethod'] = 'numberBetween'; $GLOBALS['TL_DCA']['tl_member']['fields']['loginAttempts']['eval']['fakerParameter'] = [0, 3]; $GLOBALS['TL_DCA']['tl_member']['fields']['loginAttempts']['eval']['fakerOptional'] = [0.9, 0]; // 10% chance of 0 $GLOBALS['TL_DCA']['tl_member']['fields']['locked']['eval']['fakerMethod'] = 'unixTime'; // serialisierte Daten $GLOBALS['TL_DCA']['tl_member']['fields']['groups']['eval']['fakerMethod'] = 'numberBetween'; $GLOBALS['TL_DCA']['tl_member']['fields']['groups']['eval']['fakerParameter'] = [1, 10]; $GLOBALS['TL_DCA']['tl_member']['fields']['groups']['eval']['fakerSerial'] = [1,5]; // Anzahl der serialisierten Datensätze: [min., max.] // internetAddressProvider $GLOBALS['TL_DCA']['tl_member']['fields']['website']['eval']['fakerMethod'] = 'internetAddress'; $GLOBALS['TL_DCA']['tl_member']['fields']['website']['eval']['fakerParameter'] = [['https://', 'http://']]; $GLOBALS['TL_DCA']['tl_member']['fields']['website']['eval']['fakerOptional'] = [0.9, '']; // 10% chance of getting emtpy string $GLOBALS['TL_DCA']['tl_member']['fields']['website']['eval']['fakerSerial'] = [1,5];
创建 50 个数据记录
$factory = \Contao\System::getContainer()->get('esit_fakertoolbox.services.factories.fakerfactory'); $faker = $factory->getFaker('tl_member'); $testData = $faker->getRows(50);
运行测试
在扩展目录中调用以下命令
build/runtests.sh