andaniel05/pyramidaltests

此包已被废弃,不再维护。未建议替代包。

dev-master 2021-11-15 12:36 UTC

This package is auto-updated.

Last update: 2023-06-29 20:56:44 UTC


README

本项目开发已停止,转向 https://github.com/thenlabs/pyramidal-tests

查看西班牙语版本

PyramidalTests 是一个 PHPUnit 扩展,允许您使用匿名函数创建测试用例。其哲学灵感来源于 mochajsjasmineperidotphp 等项目。

为了理解此扩展的使用,您需要具备 PHPUnit 和软件测试的一般知识,理想情况下还应了解上述框架中的任何一个。

其主要目标是扩展 PHPUnitBDD 领域的应用。除此之外,另一个目标是简化测试用例的创建,提供诸如测试复用等优势。

您可以通过 PyramidalTests-Demo 克隆并修改项目。它包含了此处展示的所有功能。

设置。

1. 使用 Composer 安装。

$ composer require --dev andaniel05/pyramidaltests dev-master

2. 在配置文件中声明扩展。

将以下语句添加到 phpunit.xml 或等效文件中。

    <extensions>
        <extension class="Andaniel05\PyramidalTests\Extension"></extension>
    </extensions>

3. DSL 声明。

bootstrap.php 文件或等效文件中包含对 /vendor/andaniel05/pyramidaltests/src/DSL/PHPUnit.php 的引用。

<?php

require_once __DIR__ . '/vendor/autoload.php';
require_once __DIR__ . '/vendor/andaniel05/pyramidaltests/src/DSL/PHPUnit.php'; // DSL

// ...

如果您想创建自定义 DSL,可以使用此文件作为模板。

了解哲学。

以下代码片段对应于一个展示开发哲学的测试文件。

setTestCaseNamespace('Andaniel05\PyramidalTests\Demo\Tests');
setTestCaseClass('PHPUnit\Framework\TestCase');

use Andaniel05\PyramidalTests\Demo\Product;
use Andaniel05\PyramidalTests\Demo\Category;

testCase('create a product', function () {
    setUp(function () {
        $this->product = new Product;
    });

    test('by default the product has a code', function () {
        $this->assertNotEmpty($this->product->getCode());
    });

    test('by default the product not contains categories', function () {
        $this->assertCount(0, $this->product->getCategories());
    });

    testCase('the product adds a category', function () {
        setUp(function () {
            $this->category = new Category;
            $this->product->addCategory($this->category);
        });

        test('the product contains the category', function () {
            $this->assertContains($this->category, $this->product->getCategories());
        });
    });
});

正如您所推断的,创建了两个测试用例来测试 Product 类的操作。

您可以看到,它们是通过 testCase() 函数创建的,其中第一个参数对应于自然语言的描述,第二个参数是一个匿名函数,用于定义各自测试用例的成员。

与示例中使用的 setUp () 函数一样,还可以使用 setUpBeforeClass()tearDown()tearDownAfterClass() 函数,其中每个函数定义了相应状态的行为。

创建测试时使用 test() 函数,与 testCase() 函数一样,它也接收一个描述作为第一个参数,并接收一个包含测试代码的匿名函数作为第二个参数。

扩展最重要的强大功能之一是通过从另一个声明中调用函数testCase()来实现测试用例的嵌套。这种方式实际上是在声明最内部的测试用例继承最外层的所有功能,但非常重要的一点是测试用例本身是不继承的

如果您不希望四个状态函数中的任何一个继承父级的行为,那么必须将单词false指定为第二个参数。例如

testCase(function () {
    setUp(function () {
        $this->name = 'Andy';
    });

    testCase(function () {
        setUp(function () {
            $this->lastname = 'Navarro';
        }, false);

        test(function () {
            $this->assertFalse(isset($this->name));
            $this->assertEquals('Navarro', $this->lastname);
        });
    });
});

正如您在前面的例子中看到的,testCase ()test ()函数中的描述完全是可选的。如果省略了这些描述,则将创建匿名测试和/或用例。

强烈建议每个测试文件都定义它所定义的测试用例必须拥有的命名空间以及其基础类。这些声明是通过setTestCaseNamespace()setTestCaseClass()函数实现的,如第一个例子所示。

执行测试。

一旦调用PHPUnit,所有定义的测试都将按如下所示执行。

$ ./vendor/bin/phpunit --testdox

有一段文字表明上部对应于扩展测试执行的输出结果,而下部则是以传统方式编写的其余PHPUnit测试。

这种划分存在的原因是我们没有在PHPUnit的架构中找到任何允许在默认情况下将测试添加到TestRunner的事件。

因此,扩展的主要目标得以实现,即扩展框架的可能性,因为测试是用新的风格编写的,可以与传统测试共存。

配置选项。

仅运行扩展测试。

如果您在项目中打算以扩展风格编写所有测试,那么您必须在配置文件中添加以下环境变量

<php>
    <env name="PYRAMIDAL_ONLY" value="1"></env>
</php>

这样,当PHPUnit执行时,结果将如下所示。

指定嵌套证据用例的边距。

当使用--testdox选项执行PHPUnit时,嵌套测试用例将默认使用4个空格的空间。如果您想指定此边距的值,则必须声明环境变量PYRAMIDAL_MARGIN,其值将对应于所需的空格数。

<php>
    <env name="PYRAMIDAL_MARGIN" value="8"></env>
</php>