标签: phpunit

如果该函数应该杀死PHP,你如何使用PHPUnit来测试函数?

基本上我有一个名为killProgram的类的方法,它用于发送hTTP重定向然后杀死PHP.

我该怎么测试呢?当我运行phpunit时,它不返回该测试的任何内容,并完全关闭.

现在我正在考虑让killProgram函数抛出一个不应该被处理的异常,这将允许我断言抛出异常.

有没有更好的办法?

php phpunit unit-testing

35
推荐指数
5
解决办法
1万
查看次数

PHPUnit:验证该数组是否具有给定值的键

鉴于以下课程:

<?php
class Example {
    private $Other;

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

    public function query ()
    {   
        $params = array(
            'key1' => 'Value 1'
            , 'key2' => 'Value 2'
        );

        $this->Other->post($params);
    }
}
Run Code Online (Sandbox Code Playgroud)

而这个测试用例:

<?php
require_once 'Example.php';
require_once 'PHPUnit/Framework.php';

class ExampleTest extends PHPUnit_Framework_TestCase {

    public function test_query_key1_value ()
    {   
        $Mock = $this->getMock('Other', array('post'));

        $Mock->expects($this->once())
              ->method('post')
              ->with(YOUR_IDEA_HERE);

        $Example = new Example($Mock);
        $Example->query();
    }
Run Code Online (Sandbox Code Playgroud)

如何验证$params(哪个是数组)并传递给$Other->post()包含名为'key1'且值为'Value 1'的键?

我不想验证所有的数组 - 这只是一个示例代码,在实际代码中传递的数组有更多的值,我想在那里只验证一个键/值对.

还有$this->arrayHasKey('keyname'),我可以用它来验证该键存在.

还有$this->contains('Value …

php phpunit

35
推荐指数
3
解决办法
3万
查看次数

使用PHPUnit实现100%的代码覆盖率

我一直在为一个项目创建一个测试套件,虽然我意识到100%的覆盖率并不是人们应该努力指标,但在代码覆盖率报告中有一点奇怪,我想要一些澄清.

看截图:

在此输入图像描述

因为正在测试的方法的最后一行是a return,所以最后一行(它只是一个结束括号)显示为从未执行,因此整个方法被标记为未在概述中执行.(要不然,或者我没有正确阅读报告.)

完整的方法:

static public function &getDomain($domain = null) {
    $domain = $domain ?: self::domain();

    if (! array_key_exists($domain, self::$domains)) {
        self::$domains[$domain] = new Config();
    }

    return self::$domains[$domain];
}
Run Code Online (Sandbox Code Playgroud)

有这个原因,还是一个小故障?

(是的,我通读了如何使用PHPUnit获得100%的代码覆盖率,不同的情况虽然相似.)

编辑:

通过报告跋涉,我注意到switch代码中其他地方的陈述也是如此.所以这种行为至少在某种程度上是一致的,但对我来说却令人困惑.

EDIT2:

我正在运行:OS X上的PHPUnit 3.6.7,PHP 5.4.0RC5,XDebug 2.2.0-dev

php testing phpunit code-coverage

35
推荐指数
1
解决办法
1万
查看次数

phpunit --debug仍然只显示点

我想看看在phpunit运行期间当前执行了哪个测试.

我使用--debug参数但仍然只得到点:

$ phpunit --debug 
PHPUnit 3.7.19 by Sebastian Bergmann.

Configuration read from /home/foo/bar/phpunit.xml

..S.......I..

内容phpunit.xml:

<phpunit backupGlobals="true"
     bootstrap="tests/bootstrap.php"
     backupStaticAttributes="false"
     cacheTokens="false"
     colors="true"
     convertErrorsToExceptions="true"
     convertNoticesToExceptions="true"
     convertWarningsToExceptions="true"
     forceCoversAnnotation="false"
     mapTestClassNameToCoveredClassName="false"
     printerClass="PHPUnit_TextUI_ResultPrinter"
     processIsolation="false"
     stopOnError="false"
     stopOnFailure="false"
     stopOnIncomplete="false"
     stopOnSkipped="false"
     testSuiteLoaderClass="PHPUnit_Runner_StandardTestSuiteLoader"
     strict="false"
     verbose="true">
    <testsuites>
    <testsuite name="foo Tests">
        <directory>./tests</directory>
    </testsuite>
    </testsuites>
    <filter>
    <whitelist addUncoveredFilesFromWhitelist="true">
        <directory suffix=".php">./src</directory>
    </whitelist>
    </filter>
    <logging>
    <log type="coverage-clover" target="./clover.xml"/>
    </logging>
</phpunit>
Run Code Online (Sandbox Code Playgroud)

这可能是什么原因?

php phpunit symfony

35
推荐指数
4
解决办法
2万
查看次数

如何单元测试使用类型提示的函数

假设我有一个类包含一个使用类型提示的函数,如下所示:

class Testable 
{
    function foo (Dependency $dependency) 
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

我想Testable使用以下代码对此类进行单元测试:

$dependencyMock = $this->getMockBuilder('Dependency')
        ->disableOriginalConstructor()
        ->getMock();


$testable = new Testable($dependencyMock);
Run Code Online (Sandbox Code Playgroud)

如果我使用PHPUnit创建$ dependency的存根,然后尝试foo使用这个模拟调用函数(如上所述),我将得到一个致命的错误,说:

传递给函数foo()的参数1必须是Dependency的一个实例,给出Mock_Foo的实例

如何使用PHPUnit和仍然存根来对此函数进行单元测试$dependency

phpunit unit-testing mocking type-hinting symfony

35
推荐指数
3
解决办法
1万
查看次数

在命名空间中组织PHPUnit测试

我看到了将PHPUnit单元测试组织到命名空间层次结构中的两种选择.这两种方法有哪些优点/缺点?是否有任何明显的缺陷我没有考虑过会使一个明显更好的选择?

考虑一个示例类,如\SomeFramework\Utilities\AwesomeClass:

  • 方法1:将每个TestCase类放入与覆盖类相同的名称空间中.

    \SomeFramework\Utilities\AwesomeClassTest
    
    Run Code Online (Sandbox Code Playgroud)
    • 好处
      • 与编写PHPUnit测试的传统方法一致.
    • 缺点
      • 灵活性较差.
      • 似乎打破了使用命名空间的原则 - 不相关的测试被分组到同一个命名空间中.

  • 方法2:将每个TestCase放在以覆盖类命名的命名空间中.

    \SomeFramework\Utilities\AwesomeClass\Test
    
    Run Code Online (Sandbox Code Playgroud)
    • 好处
      • 提供了一种非常简单/明显的方法来将多个相关的TestCase类组合在一起,例如针对不同的测试套件.
    • 缺点
      • 可能会导致更深层次,更复杂的层次结构.

php phpunit unit-testing

34
推荐指数
3
解决办法
1万
查看次数

使用PHPUnit模拟PDO对象

我在使用PHPUnit模拟PDO对象时遇到困难.

网上似乎没有太多关于我的问题的信息,但是我可以收集的信息:

  1. PDO具有'final'__ wakeup和__sleep方法,可以防止它被序列化.
  2. PHPunit的模拟对象实现在某些时候将对象序列化.
  3. 当发生这种情况时,单元测试会因PDO生成的PHP错误而失败.

通过在单元测试中添加以下行,有一个旨在防止此行为的功能:

class MyTest extends PHPUnit_Framework_TestCase

{    
    protected $backupGlobals = FALSE;
     // ...

}
Run Code Online (Sandbox Code Playgroud)

资料来源:http://sebastian-bergmann.de/archives/797-Global-Variables-and-PHPUnit.html

这不适合我,我的测试仍然会产生错误.

完整的测试代码:

class MyTest extends PHPUnit_Framework_TestCase
{

    /**
     * @var MyTest
     */
    private $MyTestr;

    protected $backupGlobals = FALSE;

    /**
     * Prepares the environment before running a test.
     */
    protected function setUp()
    {
        parent::setUp();

    }

    /**
     * Cleans up the environment after running a test.
     */
    protected function tearDown()
    {

        parent::tearDown();
    }

    public function __construct()
    {

        $this->backupGlobals = …
Run Code Online (Sandbox Code Playgroud)

php phpunit pdo unit-testing

33
推荐指数
1
解决办法
1万
查看次数

PHPUnit :: get message:好的,但不完整或跳过测试!没有任何信息发生的地方

获取消息:

好的,但不完整或跳过测试!

没有任何信息发生的地方.只有:..我........

我怎样才能找到问题所在?

谢谢

php phpunit

32
推荐指数
1
解决办法
9771
查看次数

Eclipse PDT和PHPUnit?

是否有任何PHPUnit与Eclipse PDT的集成?

如果没有,有没有计划这样做?

eclipse phpunit eclipse-pdt

31
推荐指数
5
解决办法
2万
查看次数

使用PhpStorm在Docker容器中运行PHPUnit

我想配置我的PhpStorm IDE以在我的Docker容器中运行PHPUnit测试.

似乎我只能使用本地PHP可执行文件,或者通过SSH作为测试的解释器.

我可以在我的PHP容器上安装SSH服务,但它似乎是一个hacky解决方案,并且在线文章不鼓励在容器上安装SSH服务.

为了尝试让本地解释器工作,我尝试创建一个bash脚本来代理容器内对PHP的调用,如下所示:

#!/usr/bin/env bash

# Run PHP through Docker
docker exec -t mycontainer_php_1 php "$@"
Run Code Online (Sandbox Code Playgroud)

当我自己运行它时,这非常有效,但当我将PhpStorm指向它作为本地PHP解释器时,它不会将其识别为有效的PHP可执行文件.

那么什么是让这个工作的好方法?

php phpunit phpstorm docker

31
推荐指数
2
解决办法
1万
查看次数