标签: phpunit

PHPUnit:多个Bootstraps或XML文件?

我有一个PHP MVC框架,在该系统下有多个"应用程序"

\project\apps\app1\
\project\apps\app2\
\project\apps\shared\
Run Code Online (Sandbox Code Playgroud)

每个应用程序都可以拥有自己的一组控制器

\project\apps\app1\controllers\FooContoller.php
\project\apps\app2\controllers\FooContoller.php
\project\apps\shared\controllers\BarContoller.php
Run Code Online (Sandbox Code Playgroud)

我想设置我的PHPUnit测试空间以便能够测试每个应用程序目录,但我希望以"最佳"方式进行测试.

PHPUnit的设置如下:

\project\PHPUnit
\project\PHPUnit\phpunit.xml
\project\PHPUnit\apps\app1\bootstrap.php
\project\PHPUnit\apps\app1\controllers
\project\PHPUnit\apps\app1\controllers\FooControllerTest.php
\project\PHPUnit\apps\app2\bootstrap.php
\project\PHPUnit\apps\app2\controllers
\project\PHPUnit\apps\app2\controllers\FooControllerTest.php
Run Code Online (Sandbox Code Playgroud)

现在问题是:配置我的phpunit.xml文件的"最佳实践"方法是什么?

就目前而言,我试图将这两个应用程序作为自己的测试套件包含在XML文件中,但我很快就遇到了"Can not Redeclare Class:FooController".

在我看来,理想的情况是配置XML,以便为app1运行所有测试,然后"清除"内存,并为app2运行所有测试.

然而,在最佳实践方面,最好有多个XML文件,每个APP一个.(然后可能是批处理/ shellscript文件来运行"全部测试"或测试X)

如果我们查看"典型的"PHPUnit XML配置文件:

<phpunit bootstrap="./apps/app1/bootstrap.php" colors="true">
    <testsuite name="App1TestSuite">
        <directory>./</directory>
    </testsuite>
    <filter>
        <whitelist>
        <directory suffix=".php">./apps/app1/controllers/</directory>        
    <directory suffix=".php">./apps/shared/</directory>
        </whitelist>
    </filter>
    <logging>
        <log type="coverage-html" target="./log/report.html" charset="UTF-8"
            yui="true" highlight="true"
            lowUpperBound="50" highLowerBound="80"/>
        <log type="testdox-html" target="./log/testdox.html" />
    </logging>
 </phpunit>
Run Code Online (Sandbox Code Playgroud)

我应该选择其中的许多吗?或者我应该添加 标记并将所有文件设置组合在一个XML配置中.

如果最佳做法是"单一配置"......有没有人知道如何启用多个"bootstraps"?由于每个APP加载的全局变量略有不同,有些会加载略有不同版本的同名类,因此有必要清除所有内容并重新开始.

我有兴趣从一开始就构建用于测试的"最佳"系统,但显然我知道一些漏洞.

architecture configuration phpunit process

7
推荐指数
1
解决办法
4018
查看次数

PHPUnit代码覆盖率和例外

我怀疑PHPUnit显示单行测试没有涵盖1行代码,因为抛出的异常(但我抓到了)

我有单元测试应该涵盖那一行

/**
 * @expectedException Doctrine\ORM\NoResultException
 */
public function testCannotLoginInvalidUser() {

  $user = User::login($this->em, 'nonExistant', 'password');
  $this->assertNull($user);

}
Run Code Online (Sandbox Code Playgroud)

为什么我的代码覆盖率仍然反映不包括在内?

我做了一个测试...添加echo b4返回null ...我发现那行真的没有被覆盖......

try {
  $user = $query->getSingleResult();
} catch (Exception $e) {
  echo 'caught exception';  <-- this does not get executed. 
  return null;
}
Run Code Online (Sandbox Code Playgroud)

一旦抛出异常,PHPUnit是否会跳过所有执行?

更新:我觉得我使用@expectedException错了......

php phpunit exception

7
推荐指数
1
解决办法
1598
查看次数

是否可以使用--process-isolation选项调试PhpUnit测试?

对于unittest

class SampleTest extends PHPUnit_Framework_TestCase
{
    public function testBreakpoint()
    {
        $a = 18;
    }
}
Run Code Online (Sandbox Code Playgroud)

断点5号线"$ a = 18;",

  • Xdebug v2.1.0,
  • PHPUnit 3.6.10,
  • PHP 5.3.6,
  • ubuntu 10.11

使用NO --process-isolation选项运行unittest可以按预期停止第5行的脚本执行.运行相同的配置WITH --process-isolation选项不会在第5行停止执行.

选项--process-isolation在https://github.com/sebastianbergmann/phpunit/blob/3.6/PHPUnit/Util/PHP.php中的runJob函数中使用'proc_open'运行新进程中的每个测试

使用调试器插件测试PhpStorm 3和vim 7.它允许调试PHPUnit本身,但不允许调试测试用例.

有没有办法使用Xdebug调试由PhpUnit创建的子进程?可能是Zend Debugger?

php phpunit xdebug phpstorm

7
推荐指数
1
解决办法
2587
查看次数

模拟框架返回具有不同名称和类型的类

我正在尝试创建一个模拟来满足使用此代码的类型提示(Mockery):

return \Mockery::mock('\Contracts\Helpers\iFileSystemWrapper');
Run Code Online (Sandbox Code Playgroud)

或者这个(PHPUnit):

return $this->getMock('\Contracts\Helpers\iFileSystemWrapper');
Run Code Online (Sandbox Code Playgroud)

但返回的模拟称为Mockery\Mock ObjectMock_iFileSystemWrapper_a5f91049.当它不是我需要的任何一个框架的实例时,我该如何键入检查?

为什么模拟框架试图加载真正的类?如果我想要真正的课程,我会包括真正的课程.

这个问题在编写测试时已经减慢了很多次,我只是抛出类型暗示窗口并检查类名,或者只是使用生产对象,因为模拟很难使用.

php phpunit unit-testing mocking mockery

7
推荐指数
1
解决办法
414
查看次数

如何从PHPUnit中的提供程序传递数组作为参数?

我有一个接收数组作为参数的测试方法,我想从数据提供程序方法提供数据?

怎么能实现呢?

public function dataProvider(){
        return array(array(
                'id'=>1,
                'description'=>'',
        ));
}

/**
 * @dataProvider dataProvider
 */
public function testAddDocument($data){
// data here shall be an array provided by the data provider
// some test data here
}
Run Code Online (Sandbox Code Playgroud)

会发生什么,它传递'id'键等的值

我想传递整个数组

php phpunit

7
推荐指数
1
解决办法
4583
查看次数

测试构造函数太多了吗?

首先,我会说我来自Java世界(这很重要,真的).

我已经编写了一段时间的PHP,我遇到的一个问题是由于缺少编译,有时可能在编译时很容易检测到错误(例如,给定函数的参数数量错误),可以默默地通过.

通过添加单元测试,可以轻松检测到代码覆盖率增加.问题是,例如测试构造函数以检查传递的参数是否正确是否有意义?我不是指参数的数量,而是指这些参数的内容(例如,如果参数为null,某些对象应该启动异常以避免创建"脏"对象).

问题是,我是否被多年的Java代码污染了?因为毕竟,增加代码覆盖率以"发现"错过的函数感觉就像(真正)原始的编译方式.

另外,我想说明我已经使用了开发环境(PHPStorm),我们也使用了像PHPCodeSniffer这样的工具.

有什么想法/建议吗?

php phpunit unit-testing software-quality

7
推荐指数
1
解决办法
178
查看次数

Symfony 2:如何正确测试Doctrine模型?

有没有办法在Symfony 2应用程序中正确单元测试Doctrine模型?现在我正在编写通过控制器的功能测试,以确保我的应用程序正确存储(和CRUDing)数据.但这需要太长时间而且非常糟糕,因为我必须为每个套件设置灯具,并在套件完成后清除数据库.

我如何隔离Entity和EntityRepository单元测试?有关于此的教程吗?

phpunit symfony doctrine-orm

7
推荐指数
1
解决办法
5128
查看次数

Symfony2:对ArrayCollection的测试给出了"无法访问的字段"

在添加ArrayCollection成员的表单的功能测试中,有以下声明:

$ form ['client [members] [1] [fname]'] ='Benny';

使用DOM检查器验证了字段名称.

此行的控制台输出是:

InvalidArgumentException: Unreachable field "members"

G:\Documents\workspace\sym\vendor\symfony\symfony\src\Symfony\Component\DomCrawler\Form.php:459
G:\Documents\workspace\sym\vendor\symfony\symfony\src\Symfony\Component\DomCrawler\Form.php:496
G:\Documents\workspace\sym\vendor\symfony\symfony\src\Symfony\Component\DomCrawler\Form.php:319
G:\Documents\workspace\sym\src\Mana\ClientBundle\Tests\Controller\ClientControllerTest.php:57
Run Code Online (Sandbox Code Playgroud)

应该使用什么方法来测试添加ArrayCollection成员?

按要求编辑(nb,跟随重定向已开启):

    //link to trigger adding household member form
    $link = $crawler->selectLink('Add household member')->link();
    $crawler = $client->click($link);
    $form = $crawler->selectButton('Add client')->form();
    $form['client[members][1][fname]'] = 'Benny';
    $form['client[members][1][dob]'] = "3/12/1999";
    $crawler = $client->submit($form);
    $this->assertTrue($crawler->filter('html:contains("Client View Form")')->count() > 0);
Run Code Online (Sandbox Code Playgroud)

phpunit symfony

7
推荐指数
2
解决办法
4674
查看次数

如果找到正则表达式文本,PHPUnit assertTrue?

我正在使用PHPUnit并尝试检查页面上是否存在文本.assertRegExp工作但使用if语句我得到错误Failed asserting that null is true.

我知道$ test返回null,但是如果文本存在,我不知道如何让它返回1或0或true/false?任何帮助都表示感谢.

        $element = $this->byCssSelector('body')->text();
        $test = $this->assertRegExp('/find this text/i',$element);

        if($this->assertTrue($test)){
            echo 'text found';
        }
        else{
            echo 'not found';
        }
Run Code Online (Sandbox Code Playgroud)

php phpunit assert

7
推荐指数
3
解决办法
6513
查看次数

如何从命令行运行多个PHPUnit测试套件?

如果您配置了多个测试套件,phpunit.xml如何在命令行中运行多个测试套件而不是所有测试套件?

phpunit.xml

<?xml version="1.0" encoding="utf-8"?>
<phpunit
    backupGlobals="false"
    backupStaticAttributes="false"
    colors="true"
    convertErrorsToExceptions="true"
    convertNoticesToExceptions="true"
    convertWarningsToExceptions="true"
    processIsolation="false"
    stopOnFailure="true"
    syntaxCheck="true"
    bootstrap="tests/bootstrap.php">
        <testsuites>
            <testsuite name="Unit">
                <directory suffix="Test.php">tests/unit</directory>
            </testsuite>
            <testsuite name="Integration">
                <directory suffix="Test.php">tests/integration</directory>
            </testsuite>
            <testsuite name="Acceptance">
                <directory suffix="Test.php">tests/acceptance</directory>
            </testsuite>
        </testsuites>
        <logging>
            <log type="coverage-html" target="build/coverage"/>
            <log type="testdox-html" target="build/requirements.html"/>
        </logging>
        <filter>
            <whitelist>
                <directory suffix=".php">src</directory>
            </whitelist>
        </filter>
</phpunit>
Run Code Online (Sandbox Code Playgroud)

phpunit --testsuite Unit|Integration 但不是 Acceptance

phpunit

7
推荐指数
1
解决办法
2895
查看次数