devco / testes
一个简单的单元和故事测试框架。
这个包的官方仓库似乎已经不存在了,因此包已经被冻结。
Requires
- php: >=5.4.0
Requires (Dev)
- ext-xdebug: *
- devco/event-emitter: 1.0.*-dev
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));
}
}
设置和清理
在您的测试类中,您可以定义setUp
和tearDown
方法,分别在测试方法执行前后执行代码。您可以放入任何必要的代码来准备测试的运行,并在之后进行清理。
固定装置
通常,您将使用这些方法来准备数据,以便对您的测试进行操作。这种测试数据通常被称为“固定装置”或“固定装置”。固定装置的存在是为了模拟测试数据,并在其中自动执行setUp
和tearDown
,而不是让您在测试类中定义它们。
最低限度的固定装置必须定义一个生成其数据的方法
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
特此授予任何获得本软件及其相关文档副本(以下简称“软件”)的人免费使用软件的权利,不受任何限制,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本的权利,并允许向软件提供方提供软件的人行使其权利,前提是遵守以下条件
上述版权声明和本许可声明应包含在软件的任何副本或主要部分中。
软件按“原样”提供,不提供任何形式的保证,无论是明示的、暗示的,包括但不限于适销性、特定用途适用性和非侵权性保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论这些索赔、损害或其他责任是由合同、侵权或其他方式引起的,无论这些索赔、损害或其他责任是否与软件或软件的使用或其他相关事宜有关。