【问题标题】:Testing with PHP SimpleTest使用 PHP SimpleTest 进行测试
【发布时间】:2013-10-30 10:19:16
【问题描述】:

我在尝试使用 SimpleTest for PHP 运行一些简单测试时遇到错误。

目前,我正在根据文档扩展 UnitTestCase 类。我正在尝试在一个方法中测试我的课程的不同方面。这是我的课:

<?php
class SimpleClass extends UnitTestCase {

    public function __construct() {
        $this->test();
    }

    private function test() {
        $x = true;
        $this->assertTrue($x, 'x is true');
    }
}

我尝试扩展 TestSuite 类并使用文档中的语法,但我得到了同样的错误:

Fatal error: Call to a member function getDumper() on a non-object in /simpletest/test_case.php on line 316

关于如何做到这一点的任何想法,或者我在进行课堂测试时是否有错误?

【问题讨论】:

  • 如果可以,你真的应该切换到 PHPUnit。 SimpleTest 是一个非常好的测试框架,但它不再得到任何支持,并且能够帮助解决问题的社区越来越小。 PHPUnit 是事实上的 PHP 测试标准框架,几乎无处不在。
  • 这是个好建议。找到 SimpleTest 后,我​​没有再四处张望;现在我知道其他人都使用 PHPUnit,我将切换到它。谢谢,应该作为答案发布,不是吗?
  • 避免问题并不能真正算作答案,是吗?
  • 是的,只是一个想学习的新手:/

标签: php unit-testing simpletest


【解决方案1】:

不要在测试中使用构造函数!

SimpleTest 允许您使用方法创建类。如果他们的名字以“test”开头,它会被自动识别为一个测试方法,如果你启动测试套件就会被调用。

您创建了一个构造函数来调用您的测试方法,并在没有进行所有设置的情况下进行断言,因此 SimpleTest 没有将其测试结果包装成漂亮输出所需的报告器类。

仔细阅读本教程,您会发现一些关于如何设置测试套件或如何开始单个测试的提示:

假设我们正在测试一个名为 Log in classes/log.php 的简单文件日志记录类。我们首先创建一个测试脚本,我们将其称为 tests/log_test.php 并按如下方式填充它...

改编自文档的代码示例:

<?php
require_once('simpletest/autorun.php');
require_once('../classes/log.php');

class TestOfLogging extends UnitTestCase {
    function testLogCreatesNewFileOnFirstMessage() {
        $this->assertTrue(true);
    }
}
?>

注意没有构造函数,如果这个文件是用 PHP 执行的,自动运行文件会小心运行测试。

【讨论】:

  • 感谢您的解决方案。我真的很喜欢 SimpleTest 附带的可编写脚本的浏览器,它也是一些不错的轻量级测试。我尝试通过 PHPUnit,安装/文档很长。
  • SimpleTest 有点简单,浏览器也不错。但是脚本浏览器有它的局限性——你可以使用 Selenium 远程控制一个支持 Javascript 的真实浏览器,而 PHPUnit 有一个适配器来控制 Selenium。但是测试的原则是一样的——你可以稍后切换到 PHPUnit。
  • @Sven 我认为 OP 可以使用 __constructor,只需要确保他调用父构造函数 parent::__construct() (理论上它应该可以工作)。虽然这不是最漂亮的解决方案,但最终还是要捕获调用call_user_func_array(array($this, 'parent::__construct'), get_func_args())的参数
  • @DaGhostmanDimitrov 虽然理论上你是对的,但实际上你为什么要这样做? SimpleTest 有一个通用的默认方式来创建测试类和测试方法。为什么要偏离并显式调用测试方法?
  • @Sven 你是完全正确的,我只想提一下这是可能的,这是不建议的,而且我认为 OP 所做的没有多大意义。我不确定简单测试是否等同于 protected function setup(); 这是我提到它的主要原因。
猜你喜欢
  • 2011-07-17
  • 1970-01-01
  • 2010-12-16
  • 2013-05-02
  • 2012-01-31
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
  • 2011-02-20
相关资源
最近更新 更多