标签: phpunit

如何对子类进行单元测试

单元测试子类的最佳方法是什么?让我们假设有一个我已经编写过测试的基类,并且有一些子类会覆盖父公共和/或受保护方法中的一些父行为.

我的子类的测试类是否应该扩展(并在适当的情况下覆盖测试方法)我的基类的测试类,以便应用所有基类测试?否则,我希望有重复的测试代码.

tdd phpunit unit-testing

15
推荐指数
2
解决办法
4687
查看次数

如何在单独的进程中运行单个phpUnit测试?

是否可以在同一个进程中运行一个phpUnit测试测试套件,但是确定要在自己的进程中运行的特定测试?

通常我用

@runTestsInSeparateProcesses
@preserveGlobalState disabled
Run Code Online (Sandbox Code Playgroud)

对于整个测试套件,但我只需要单独运行一个方法,并且我希望在单个进程中运行其余部分的速度提高.

谢谢

php phpunit unit-testing

15
推荐指数
1
解决办法
7064
查看次数

PHPUnit:模拟不存在的类

是否可以在PHPUnit中创建一个不存在的类的模拟?
假设我有一些类创建另一个类的实例,例如:

class TaskRunner
{
    public function runTasks()
    {
        // Run through some loop to get tasks and store each in $taskName
        // Get task instance by given task name 
        $task = $this->getTaskInstance($taskName);
        if ($task instanceof AbstractTask) {
            $task->run();
        }
    }

    protected function getTaskInstance($taskName)
    {
        // Just an example
        return new $taskName();
    }
}
Run Code Online (Sandbox Code Playgroud)

我想运行单元测试runTasks方法来检查创建的任务实例是否扩展了一些抽象类.
是否有可能不在文件系统中创建样本类来检查继承约束?
谢谢大家!

phpunit unit-testing mocking

15
推荐指数
2
解决办法
4672
查看次数

使用 phpunit 测试命令 symfony

我使用 symfony3.2 创建一些基本命令来定期生成一些新闻通讯,当我想使用 phpunit 5.5.4 测试我的 symfony 命令时,我正在处理一些问题。它从一开始就失败了:

    /**
     * @param InputInterface $input
     * @param OutputInterface $output
     */
    protected function execute(InputInterface $input, OutputInterface $output){

        $output->writeln("<info>Script start</info>");
        //...
        $output->writeln("<info>done</info>");
     }
Run Code Online (Sandbox Code Playgroud)

通过这个单元测试:

use MyBundle\Command\MyCommand;
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use Symfony\Component\Console\Tester\CommandTester;

class MyCommandTest extends KernelTestCase
{

    public function testExecute(){

        $kernel = static::createKernel();
        $kernel->boot();

        $application = new Application($kernel);
        $application->add(new MyCommand());

        $command = $application->find('generate:newsletter');
        $commandTester = new CommandTester($command);
        $commandTester->execute(array(
            'command' => $command->getName()
        ));

        $output = $commandTester->getDisplay();
        $this->assertContains('done',$output);
    }
}
Run Code Online (Sandbox Code Playgroud)

我一步一步地遵循这个步骤,但就我而言,我得到:

Error: Call to …
Run Code Online (Sandbox Code Playgroud)

php phpunit symfony symfony-3.2

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

PHPUnit - 断言失败但我想继续测试

->assertTrue(false);
->assertTrue(true);
Run Code Online (Sandbox Code Playgroud)

第一个断言失败,执行停止.但我想继续进一步的代码片段.

是否有可能在PHPUnit中

php phpunit unit-testing

14
推荐指数
4
解决办法
7522
查看次数

在PHPUnit中重新运行上次失败的测试

--stop-on-failure当其中一个测试失败时,您可以使用flag来打破单元测试.

有没有办法快速告诉PHPUnit重新运行此失败的测试,而是手动提供完整路径?

php phpunit unit-testing

14
推荐指数
2
解决办法
3281
查看次数

PHPUnit - 转储变量

我刚刚开始使用PHPUnit,并且想知道是否存在转储变量内容的构建方式?

用例是因为我已经在谈论我正在开发的代码,所以我可以使用PHPUnit来测试代码的稳定性,还可以在开发时输出调试信息.

我知道xdebug可以为我填补这个空白,但有时候只是更容易在输出中转储一些信息而不是摆弄我的IDE调试器,这对于追溯错误的原因更有用.

我知道我可以做一个常规的var_dump,我只是想知道PHPUnit是否有一个接口.

谢谢!

编辑:

决定按照大卫的回答一起破解它.

绝不是一个完美的解决方案,但它能为我完成这项工作.如果有人有兴趣:

*** PHPUnit-3.6.3/PHPUnit/Framework/TestCase.php    2011-11-09 12:25:38.000000000 -0500
--- PHPUnit/Framework/TestCase.php  2011-11-09 15:27:02.193317219 -0500
***************
*** 291,296 ****
--- 291,298 ----
       * @var boolean
       */
      private $outputBufferingActive = FALSE;
+   
+   public static $ob_output = array();

      /**
       * Constructs a test case with the given name.
***************
*** 913,921 ****
--- 915,927 ----
          }

          try {
+           ob_start();
              $testResult = $method->invokeArgs(
                $this, array_merge($this->data, $this->dependencyInput)
              );
+           
+           Static::$ob_output[ $method->name ] = ob_get_contents();
+           ob_end_clean();
          }

          catch …
Run Code Online (Sandbox Code Playgroud)

php phpunit unit-testing

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

无法在PHPUnit中使用数据提供程序运行单个测试

使用命令行运行测试时遇到问题:如果我像这样运行phpunit:

phpunit -–no-configuration -–filter testAdd DataTest DataProviderTest.php
Run Code Online (Sandbox Code Playgroud)

它工作正常.但是我们使用正则表达式来指定我们想要测试的方法的名称:

phpunit -–no-configuration -–filter /::testAdd$/ DataTest DataProviderTest.php
Run Code Online (Sandbox Code Playgroud)

不幸的是,第二种方法不起作用.源代码是:

<?php
class DataTest extends PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider provider
     */
    public function testAdd($a, $b, $c)
    {
        $this->assertEquals($c, $a + $b);
    }

    public function provider()
    {
        return array(
          array(0, 0, 0),
          array(0, 1, 1),
          array(1, 0, 1),
          array(1, 1, 3)
        );
    }
}

?>
Run Code Online (Sandbox Code Playgroud)

php phpunit

14
推荐指数
3
解决办法
4221
查看次数

Laravel:如何在PhpUnit上启用stacktrace错误

我有一个全新的laravel 5.4安装

我试图修改默认测试只是为了看到一个失败的测试.

测试/ ExampleTest.php

class ExampleTest extends TestCase
{
    /**
     * A basic test example.
     *
     * @return void
     */
    public function testBasicTest()
    {
        $response = $this->get('/ooops');

        $response->assertStatus(200);
    }
}
Run Code Online (Sandbox Code Playgroud)

我期待看到更详细的错误,如no route has been found or defined等,但只是这个错误说

Time: 1.13 seconds, Memory: 8.00MB

There was 1 failure:

1) Tests\Feature\ExampleTest::testBasicTest
Expected status code 200 but received 404.
Failed asserting that false is true.

/var/www/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestResponse.php:51
/var/www/tests/Feature/ExampleTest.php:21
Run Code Online (Sandbox Code Playgroud)

没有有意义的错误很难做TDD(是的,我知道在这种情况下404就足够了,但大部分时间都不是这样).

有没有办法使堆栈跟踪与浏览器上显示的相同?或者至少接近那个,以便我知道我应该做的下一步是什么.

提前致谢.

tdd phpunit laravel laravel-5 laravel-5.4

14
推荐指数
2
解决办法
6786
查看次数

什么是.phpunit.result.cache

当我在为Laravel创建的新软件包上使用PhpUnit运行测试时,它将生成file .phpunit.result.cache

怎么办呢?是否将其添加到我的.gitignore文件中?

我正在使用PHPUnit 8.0.4

phpunit unit-testing laravel laravel-5

14
推荐指数
2
解决办法
2445
查看次数