简单(非单元)测试框架,类似于 .phpt,应该评估输出/标头/错误/结果

simple (non-unit) test framework, similar to .phpt, should evaluate output/headers/errors/results

提问人:mario 提问时间:10/4/2010 最后编辑:mario 更新时间:11/20/2010 访问量:237

问:

我正在寻找一个更简单的测试框架。我看了一些 PHPUnit 和 SimpleTest 脚本,我发现所需的语法糖令人震惊。SnapTest 听起来不错,但同样繁琐。Apache More::Test 太程序化了,即使不符合我的口味。而 Symfony lime-test 在这方面并不独特。 像 http://everzet.com/Behat/#basics 这样的 BDD 工具非常好,但甚至比预期的抽象级别高出两个。

此外,到目前为止,我一直在使用一次性测试脚本。我想知道是否有一个测试框架/工具可以简化将它们用于自动化测试的过程,而不是扔掉它们。具体来说,我想使用以下功能:

  • 评估输出(打印/回显),甚至返回值/对象
  • 序列化并将其保存为探测/比较数据
  • 允许将该比较输出分类为通过测试或失败
  • 还收集标头、警告或错误消息(也可能是预期输出)
  • 除了一些 $test->assert() 或 test::fail() 状态

基本上我懒得做测试框架的工作,手动预定义或布尔值评估和分类预期的输出。此外,我发现不必要地将测试方法包装到类中并不有趣,普通的包含脚本或函数就足够了。此外,使用预先初始化的基础和测试环境自动运行测试脚本应该不难。

旧的 .phpt 脚本及其 --expect-- 输出接近,但仍然需要太多的手动设置。此外,我更喜欢 Web GUI 来运行测试。是否有此类测试脚本的现代版本?(加上一些标头/错误/结果评估,并最终进行单元测试::assert方法)


编辑,我必须举个例子。这是典型的 PHPUnit 测试:

 class Test_Something extends PHPUnit_Test_Case_Or_Whatever {
     function tearUp() {
         app::__construct(...);
     }
     function testMyFunctionForProperResults() {
         $this->assertFalse(my_func(false));
         $this->assertMatch(my_func("xyzABC"), "/Z.+c/");
         $this->assertTrue(my_func(123) == 321);
     }
 }

相反,我想使用纯PHP和较少混合的测试API:

 function test_my_function_for_proper_results() {
     assert::false(my_func(false));
     print my_func("xyz_ABC");
     return my_func(123);
 }

嗯,这实际上是三个测试合二为一。但要强调的是:第一个版本需要手动测试。我想要的是将测试数据发送/返回到测试框架。框架的任务是比较结果,而不仅仅是用勺子喂养的布尔值。或者想象一下,我得到了一个臃肿的数组结果或对象链,我不想在测试脚本中手动列出它们。

PHP的

评论

0赞 Geoffrey Bachelet 10/8/2010
你似乎想要一个测试框架的所有好处,而没有测试框架,恕我直言,这是不可能的。我的意思是,无论你使用什么方法来运行测试,你总是要针对 API 编写测试,无论是框架测试还是 PHP(你真的不想要测试,因为它缺少使测试框架有用的一切)。(实际上,你描述的让我想起了很多石灰,tbh,从长远来看,这有点无法使用)
0赞 mario 10/8/2010
不,我不想要框架。我已经没有测试脚本的框架了。我确实想要一个运行时,因此问题来了。我只是不想要企业级的 PHPUnit 复杂。除了 ->assertThis 和 ->assertThat 之外,我认为评估 return/echo 没有问题。必须将测试包装到类中显然只是为了 phpunit/simpletest 的利益;语法糖并不能简化编写测试。

答:

0赞 Hamish 10/11/2010 #1

不得不说 - 如何实现简化测试用例的示例并不明显。不幸的是,这种错综复杂或多或少是必须忍受的。也就是说,我已经看到 PHPUnit 被扩展以简化事情,以及添加 Web 测试运行器、标头测试、输出等(在这里想想 SilverStripe - 他们正在用 PHPUnit 做很多你想做的事情)。这可能是你最好的选择。例如:

  • 评估输出(打印/回声)
    • 启用输出缓冲并针对缓冲结果进行断言
  • 收集标头、警告或错误消息
    • 注册自己的存储错误消息的处理程序
    • wget 针对 URL 并比较结果(标头和所有)

等。

评论

0赞 mario 10/11/2010
帮助程序类很有帮助,所以我肯定会重用一些。然而,PHPUnit 除了挂钩附加功能之外是不可扩展的。核心过于僵化,不可覆盖,句法糖是系统性的。我必须自己写点东西——显然,因为我解释得很糟糕;无论如何,捕获输出似乎很容易。使用错误处理程序是显而易见的,但也可以定义 PHP assert() 处理程序。尚不确定标头捕获。.
1赞 mario 11/20/2010 #2

郑重声明,我现在发现了 Shinpuru
http://arkanis.de/projects/shinpuru/
对于实际的测试用例来说,它看起来很有前途,并且使用 PHP5.3 风格的匿名函数而不是内省类包装器。