ben-rowan/vcsv-stream

用于创建CSV测试用例的虚拟CSV流

v0.1.0 2019-08-05 14:11 UTC

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

这定义了一组覆盖数据生成器。如果我们在这里没有定义列,则将使用之前定义的默认标题数据生成器。

注意:这里的列名 必须 与标题列之一匹配。