devco/testes

一个简单的单元和故事测试框架。

这个包的官方仓库似乎已经不存在了,因此包已经被冻结。

1.1.0 2013-09-27 05:00 UTC

This package is not auto-updated.

Last update: 2022-07-18 05:08:49 UTC


README

Testes - 请原谅我的措辞 - 是一个简单的测试框架,用PHP 5.4编写。其目标是简化、快速且可维护的测试。

设置

要设置Testes,您只需确保您的测试与psr-0自动加载器兼容,并且您的测试所在的目录已注册为自动加载路径。

Testes提供了一个可以为您完成此任务的自动加载器

require '../lib/Testes/Autoloader/Autoloader.php';
Testes\Autoloader\Autoloader::register('./tests');

之后,您只需设置您的测试层次结构。实际上,您需要做的只是确保您已经组织了测试,以便您和您的同事可以轻松浏览测试。

  • 测试
    • 测试
      • 子目录
        • SomeTest.php

SomeTest类可以定义如下

namespace Test\Subfolder;
use Testes\Test\UnitAbstract;

class SomeTest extends UnitAbstract
{
    ...
}

测试方法

测试方法是任何不在任何父类或实现接口中的公共方法。这意味着像setUp()tearDown()这样的公共方法不是有效的测试方法,不会被作为测试的一部分运行。

一些好的测试方法名称

  • makeSureAllPropertiesAreSetWhenHydrating()
  • testAssertionAggregation()
  • completeRequestDispatchingTest()

您不能将测试方法定义为测试套件的一部分。它们必须存在于一个测试类中。

有两种类型的测试:单元测试故事

单元测试

单元测试从Testes\Test\UnitAbstract类派生。这通常是在您测试小的代码单元而不是行为时。

故事

故事从Testes\Test\StoryAbstract派生。它们遵循“给定 ... 当 ... 那么 ...”约定来描述测试案例。定义这些场景的方法应该是public的。处理场景各部分的方法应该是protected的。

<?php

namespace Test;
use Testes\Test\StoryAbstract;

class MyStory extends StoryAbstract
{
    private $request;
    
    private $error;
    
    public function ensureProperError()
    {
        $this->given('a bad request')->when('an error occurs')->then('an error should be returned');
    }
    
    protected function givenABadRequest()
    {
        $this->request = ...;
    }
    
    protected function whenAnErrorOccurs()
    {
        if (!$this->request) {
            $this->error = 'Some error message.';
        }
    }
    
    protected function thenAnErrorShouldBeReturned()
    {
        $this->assert($this->error && is_string($this->error));
    }
}

设置和清理

在您的测试类中,您可以定义setUptearDown方法,分别在测试方法执行前后执行代码。您可以放入任何必要的代码来准备测试的运行,并在之后进行清理。

固定装置

通常,您将使用这些方法来准备数据,以便对您的测试进行操作。这种测试数据通常被称为“固定装置”或“固定装置”。固定装置的存在是为了模拟测试数据,并在其中自动执行setUptearDown,而不是让您在测试类中定义它们。

最低限度的固定装置必须定义一个生成其数据的方法

class MyFixture extends Testes\Fixture\FixtureAbstract
{
    public static function generateData()
    {
        return [
            'id'   => 1,
            'name' => 'value'
        ];
    }
}

现在,您将在测试类中使用setUp方法将此固定装置添加到测试中

$this->setFixture('myfixture', new MyFixture);

此固定装置可在您的测试方法中使用

$data  = $this->getFixture('myfixture');
$name  = $data->name;
$value = 'value';

$this->assert($name === $value, 'The data is not valid.');

然而,您可以在测试方法之外访问固定装置数据。您可能需要这样做,以便关联两个固定装置

class SomeOtherFixture extends Testes\Fixture\FixtureAbstract
{
    public static function generateData()
    {
        return [
            'id'   => 2,
            'link' => MyFixture::id(),
            'name' => 'value'
        ];
    }
}

断言

您的测试类包含一个名为 assert 的断言方法。

$this->assert($something, $message);

您可能会问为什么没有更多的断言方法。以下是一个示例

assert($value === true, 'message');
assertEquals($value, true, 'message');

前面的断言实际上比后面的更易读,甚至更短。

运行测试

我们使用查找器来查找我们的测试

$finder = new Testes\Finder\Finder('/path/to/tests');

然后我们使用查找器运行测试,这会返回已运行的测试套件

$suite = $finder->run();

我们可以使用套件来获取有关测试的信息

echo sprintf(
    'Tests were completed in "%d" milliseconds and used "%s" bytes of memory.',
    $suite->getTime(),
    $suite->getMemory()
);

如果您只想运行特定的测试子集,请将命名空间传递给查找器

$finder = new Testes\Finder\Finder('/path/to/tests', 'Test/Subfolder');

分析覆盖率

可以在启动覆盖率分析后运行测试来完成覆盖率分析。

$coverage = new Testes\Coverage\Coverage;
$coverage->start();

// run tests
...

$analyzer = $coverage->stop();

您需要告诉分析器基于哪些文件来建立覆盖率。一种方法是将文件目录添加进去

$analyzer->addDirectory('/path/to/code/needing/coverage');

您也可以添加特定文件

$analyzer->addFile('/path/to/single/file/to/analyze.php');

一旦添加了文件,您可以根据需要过滤它们

$analyzer->is('.php$');

分析器为我们提供了相当多的信息,例如哪些行没有被测试

// percent tested
echo $analyzer->getPercentTested(2) . PHP_EOL . PHP_EOL;

// untested files are files that are not 100% tested
foreach ($analyzer->getUntestedFiles() as $file) {
    foreach ($analyzer->getUntestedLines() as $line) {
        echo $line . PHP_EOL;
    }
}

渲染输出

很多时候,您需要以某种格式输出结果,以便构建服务器等可以消费。为此,我们提供了JUnit格式。

$renderer = new Testes\Renderer\Junit;
$rendered = $renderer->render($suite);ch

file_put_contents('junit.xml', $rendered);

许可

版权所有 (c) 2005-2013 Trey Shugart

特此授予任何获得本软件及其相关文档副本(以下简称“软件”)的人免费使用软件的权利,不受任何限制,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本的权利,并允许向软件提供方提供软件的人行使其权利,前提是遵守以下条件

上述版权声明和本许可声明应包含在软件的任何副本或主要部分中。

软件按“原样”提供,不提供任何形式的保证,无论是明示的、暗示的,包括但不限于适销性、特定用途适用性和非侵权性保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论这些索赔、损害或其他责任是由合同、侵权或其他方式引起的,无论这些索赔、损害或其他责任是否与软件或软件的使用或其他相关事宜有关。