funkatron/funit

FUnit 是适用于 PHP 5.3+ 的测试微型框架,部分灵感来自 QUnit。

0.6.0 2014-03-08 02:25 UTC

This package is not auto-updated.

Last update: 2024-09-14 15:07:33 UTC


README

FUnit 是适用于 PHP 5.3+ 的测试微型框架,部分灵感来自 QUnit。FUnit 由 Ed FinklerFictive Kin 创建。

如果你能编写 PHP 代码,你就能用 FUnit 编写测试。

特性

  • 简单编写测试并获取输出 – 快速开始编写测试
  • 简洁明了的语法
  • 可以从 CLI 运行 – 无需 web 服务器
  • 终端中带颜色的输出

示例

<?php
require __DIR__ . '/FUnit.php';
use \FUnit as fu;  // note the alias to "fu" for terseness

fu::test("this is a test", function() {
	fu::ok(1, "the integer '1' is okay");
	fu::ok(0, "the integer '0' is not okay"); // this will fail!
});

$exit_code = fu::run();
exit($exit_code);

将输出

> php example_standalone.php
Running test 'this is a test...'
RESULTS:
--------------------------------------------
TEST: this is a test (1/2):
 * PASS ok() the integer '1' is okay
 * FAIL ok() the integer '0' is not okay

ERRORS/EXCEPTIONS: 0
TOTAL ASSERTIONS: 1 pass, 1 fail, 0 expected fail, 2 total
TESTS: 1 run, 0 pass, 1 total

查看 example_standalone.php 文件以获取更多信息,或者尝试用 php example_standalone.php 运行它

或者,如果您在浏览器中加载 standalone_example.php,它将输出一个非常简单的 HTML 版本的文本报告。如果您正在运行 PHP 5.4 或更高版本,您可以使用开发服务器查看它,如下所示

php -S 0.0.0.0:8000 example_standalone.php

然后,在浏览器中打开 http://0.0.0.0:8000

方法

测试套件构建方法

  • FUnit::test($name, \Closure $test)
    添加一个名为 $name 的测试和一个匿名函数 $test。$test 将包含各种 断言,如 FUnit::ok()

  • FUnit::run($report = true, $filter = null, $report_format = 'text')
    运行已注册的测试。

    • $report (布尔值): 如果传递 false,则抑制报告输出。
    • $filter (字符串): 如果传递,则仅运行包含 $filter 字符串的测试。
    • $report_format (字符串): 默认为 'text'。也接受 'xunit'。
  • FUnit::setup(\Closure $setup)
    注册一个在每次测试开始时运行的函数。查看 FUnit::fixture()

  • FUnit::teardown(\Closure $setup)
    注册一个在每次测试结束时运行的函数。查看 FUnit::fixture()FUnit::reset_fixtures()

  • FUnit::fixture($key, [$val])
    检索或注册一个固定值。在 FUnit::setup() 中使用此功能将固定值分配给键,并在测试中检索这些固定值

  • FUnit::reset_fixtures()
    清除 FUnit::$fixtures 数组中的所有固定值。这不能保证干净地关闭或关闭

断言

  • FUnit::ok($a, $msg = null)
    断言 $a 是真值。可选的 $msg 描述测试

  • FUnit::not_ok($a, $msg = null)
    断言 $a 不是真值。可选的 $msg 描述测试

  • FUnit::equal($a, $b, $msg = null)
    断言 $a == $b。可选的 $msg 描述测试

  • FUnit::not_equal($a, $b, $msg = null)
    断言 $a != $b。可选的 $msg 描述测试

  • FUnit::strict_equal($a, $b, $msg = null)
    断言 $a === $b。可选的 $msg 描述测试

  • FUnit::not_strict_equal($a, $b, $msg = null)
    断言 $a !== $b。可选的 $msg 描述测试

  • FUnit::has($needle, $haystack, $msg = null)
    断言数组或对象 ($haystack) 有键或属性 ($needle)

  • FUnit::not_has($needle, $haystack, $msg = null)
    断言数组或对象 ($haystack) 不具有键或属性 ($needle)。请原谅我的语法。

  • FUnit::fail($msg = null, [$expected = null])
    强制失败的断言。如果 $expected === true,则标记为 预期失败

  • FUnit::expect_fail($msg = null)
    确保一个 预期失败。相当于 FUnit::fail('msg', true)

  • FUnit::pass($msg = null)
    强制成功的断言。

  • FUnit::throws($callback, $params, $exception = null, $msg = null)
    断言 $callback 抛出类型为 $exception 的异常。$callback 必须是一个 可调用

  • FUnit::all_ok($a, $callback, $msg = null)
    遍历 $a 中的所有项目,并将每个传递给 $callback。如果回调对所有返回 true,则通过 -- 否则失败。$callback 必须是一个 可调用

实用方法

  • FUnit::report($format = 'text')
    输出测试报告。如果您之前已抑制报告输出,则可以使用此方法手动输出报告。

  • FUnit::exit_code()
    获取退出代码。如果任何测试失败,退出代码将设置为 1。否则为 0。您可以使用此值使用 PHP 函数 exit() 返回成功或失败结果。

配置方法

  • FUnit::set_disable_reporting($state)
    如果传递 true,则在测试运行完成后不会输出报告。通过传递 false 重新启用。

  • FUnit::set_debug($state)
    如果传递 true,则将输出额外的调试信息(包括计时和断言失败详情)。通过传递 false 禁用。

  • FUnit::set_silence($state)
    如果传递 true,则仅输出报告 -- 无进度、调试信息等。通过传递 false 禁用。

报告格式

默认情况下,FUnit 输出彩色 text 输出,适用于终端。您还可以以 xunit-style xml 输出报告。

报告格式是 FUnit::run() 的第三个参数

示例

// Outputs a colored text report. This is the default format.
FUnit::run(true, null, 'text');

// Outputs xUnit-style xml
FUnit::run(true, null, 'xunit');

浏览器输出

标准 text 报告格式将在通过 Web 服务器加载测试文件时输出为非常简单的 HTML。如果您正在运行 PHP 5.4+,则可以使用开发服务器进行测试。

php -S 0.0.0.0:8000 test_file.php

然后,在浏览器中打开 http://0.0.0.0:8000

CLI 测试运行器工具

FUnit 被设计为不需要单独的测试运行器工具,但它确实提供了一个位于 bin/fu(或通过 Composer 安装时的 vendor/bin/fu)。fu 允许您运行单个文件中的测试、目录中的多个文件组,并筛选要运行的测试。

示例

  • fu --help
    获取所有选项的详细帮助和信息

  • fu ./tests
    扫描 ./tests 目录中具有 "test(s)" 名称的文件,并运行这些测试

  • fu tests.php
    执行 tests.php 中的测试

  • fu -d tests.php
    使用额外的调试信息执行 tests.php 中的测试

  • fu --filter="API" tests.php
    仅执行 tests.php 中具有 "API" 名称的测试

  • fu -s tests.php
    执行 tests.php 中的测试,但抑制除报告之外的所有输出

注意:fu 加载多个测试文件时,它会对每个文件执行 require。这意味着每个文件中的所有代码都会被执行。对 FUnit::run() 的调用将被抑制,但非 FUnit 代码(如 exit() 调用或 require 语句)可能会引起问题。

安装

使用 Composer 安装

如果您使用 Composer 管理依赖项,则可以使用它添加 FUnit。

{
	"require": {
		"funkatron/funit": "dev-master"
	}
}

注意,FUnit 尚未达到 1.0!这意味着 BC 可能会中断!

如果您通过Composer安装,可以使用自动生成的自动加载器来加载FUnit,如下所示

<?php
require "vendor/autoload.php"
use \FUnit as fu;

fu::test("this is a test", function() {
    fu::ok(1, "the integer '1' is okay");
    fu::ok(0, "the integer '0' is not okay"); // this will fail!
});

fu::run();

从GitHub安装源代码

要安装源代码

git clone git://github.com/funkatron/FUnit.git

并将其包含在您的脚本中

require_once '/path/to/FUnit/FUnit.php';

从zip/tarball安装源代码

或者,您可以获取一个tarballzipball

$ curl https://github.com/funkatron/FUnit/tarball/master | tar xzv
(or)
$ wget https://github.com/funkatron/FUnit/tarball/master -O - | tar xzv

使用类加载器

如果您正在使用类加载器(例如,Symfony类加载器)进行PSR-0风格的类加载

$loader->registerNamespace('FUnit', 'path/to/vendor/FUnit');

升级

如果您正在使用低于0.5的版本,命名空间/类名已更改为遵循PSR-0自动加载器标准。基本类现在为\FUnit,而不是\FUnit\fu。您仍然可以通过如下方式将命名空间别名来调用所有方法:fu::XXX()

use \FUnit as fu