ben-rowan / vcsv-stream
用于创建CSV测试用例的虚拟CSV流
Requires
- php: ^7.2
- ext-posix: *
- fzaninotto/faker: ^1.7
- symfony/console: ^4.3
- symfony/yaml: ^4.3
Requires (Dev)
- phpmd/phpmd: @stable
- phpstan/phpstan: ^0.9.2
- phpunit/phpunit: ^7.1
This package is not auto-updated.
Last update: 2024-09-25 13:11:33 UTC
README
一个用于创建单元/集成测试用例的虚拟CSV流。
安装
composer require --dev ben-rowan/vcsv-stream
模式
您可以使用vcsv://stream以在线和离线两种模式生成CSV测试用例,两种模式。
在线
您可以将vcsv://stream用作标准文件流的直接替代品。在此模式下,vcsv://stream将根据提供的配置动态生成伪造的CSV数据。
优点
- 快速测试开发和反馈循环。
- 每次测试运行都会得到一组不同的有效数据。这意味着您有机会捕捉到代码中的意外错误。
缺点
- 生成大文件时CPU和内存利用率较高(我会看看是否能降低这个值!)
离线
您还可以使用vcsv://stream在磁盘上生成CSV测试用例。您可以在测试中使用它。
优点
- 快速测试执行,降低了CPU和内存负载。
缺点
- 较慢的测试开发和反馈循环。
- 每次测试运行都会得到相同的数据。这减少了测试的范围。
使用方法
在线
第一步是在测试中调用vcsv://streams的设置方法。这初始化并注册了流
/** * @throws VCsvStreamException */ public function setUp() { VCsvStream::setup(); }
接下来,您加载配置(有关配置文档,请参阅此处)
/** * @test * * @throws ValidationException * @throws ParserException */ public function iCanTestSomething(): void { VCsvStream::loadConfig('path/to/config.yaml'); // ... }
最后,您可以使用流,就像使用其他任何文件流一样
/** * @test * * @throws ValidationException * @throws ParserException */ public function iCanTestSomething(): void { VCsvStream::loadConfig('path/to/config.yaml'); $vCsv = new SplFileObject('vcsv://fixture.csv'); // ... }
离线
提供的generate:csv
命令使这变得简单
vendor/bin/vcsv generate:csv path/to/config.yaml
这将输出一个CSV文件到stdout
,这样您可以轻松地看到正在生成的内容。一旦您满意,您可以将它写入磁盘
vendor/bin/vcsv generate:csv path/to/config.yaml > some_fixture.csv
配置
vcsv://stream使用yaml配置文件来定义您的CSV测试用例。这比简单创建CSV文件并将其添加到源代码控制具有许多优点
- 您正在定义生成数据的规则。这意味着您知道您有100行这种类型的数据,然后是100行另一种类型的数据。如果您只有CSV,那么您必须猜测这一点或从另一组单独的文档中获取信息。
- 您可以添加注释。这意味着您可以在顶部详细描述测试用例,并在整个过程中对选择进行注释。这非常有帮助。
- 您可以轻松地从您的IDE/文本编辑器中编辑CSV。这减少了在开发测试时进行更改的开销(这在在线模式下尤其正确)。
示例
以下是一些vcsv://stream配置的完整示例。我们将在下面的每个部分中讲解
# This CSV is used to test for X, Y and Z header: include: true columns: "Column One": type: value value: 1 "Column Two": type: faker formatter: randomNumber unique: true "Column Three": type: text records: "Record One": count: 10 columns: "Column Two": type: value value: 2 "Column Three": type: faker formatter: randomNumber unique: false # This record is important for some reason "Record Two": count: 100 columns: "Column Two": type: value value: 3 # This is why we chose 3 "Column Three": type: faker formatter: text unique: false "Record Three": count: 1000 columns: "Column Two": type: value value: 4 "Column Three": type: faker formatter: ipv4
header
此部分定义了CSV的标题。即使您选择不输出标题,它也是必需的,因为它定义了每列的默认数据生成器。
include
当设置为true
时,CSV将包含标题。当设置为false
时,则不会包含。
columns
这是我们告诉vcsv://stream我们想要为CSV提供多少列以及如何默认生成这些列数据的方法。
为每个列提供的名称将成为列标题,如果启用此功能。名称必须是唯一的。
header: columns: "Column Name": # <-- column name type: text # <-- column data generation config
vcsv://stream可以以三种方式生成数据
value
列
您可以提供您希望此列包含的固定值
"Column Name": type: value value: 1
faker
列
您可以使用 Faker 库中的一个来随机生成数据 格式化工具
"Column Name": type: faker formatter: randomNumber unique: true
通过将 unique
设置为 true
,我们告诉 Faker 我们不希望该列包含任何重复数据。
text
列
您也可以告诉 vcsv://stream,您只想让该列包含 lorem ipsum
"Column Name": type: text
记录
这定义了实际的 CSV 数据。我们以 '块' 的形式定义数据,这意味着我们可以更改文件中的数据。每条记录都有一个名称,这应该是一些可以帮助您记住它是如何创建的。
records: "Record One": # <-- record name count: 10 # <-- number of rows to generate with this config columns: "Column Two": # <-- override the data generator for 'Column Two' type: value value: 2
计数
这定义了应该使用此组配置创建的行数。
columns
这定义了一组覆盖数据生成器。如果我们在这里没有定义列,则将使用之前定义的默认标题数据生成器。
注意:这里的列名 必须 与标题列之一匹配。