单元测试子类的最佳方法是什么?让我们假设有一个我已经编写过测试的基类,并且有一些子类会覆盖父公共和/或受保护方法中的一些父行为.
我的子类的测试类是否应该扩展(并在适当的情况下覆盖测试方法)我的基类的测试类,以便应用所有基类测试?否则,我希望有重复的测试代码.
是否可以在同一个进程中运行一个phpUnit测试测试套件,但是确定要在自己的进程中运行的特定测试?
通常我用
@runTestsInSeparateProcesses
@preserveGlobalState disabled
Run Code Online (Sandbox Code Playgroud)
对于整个测试套件,但我只需要单独运行一个方法,并且我希望在单个进程中运行其余部分的速度提高.
谢谢
是否可以在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方法来检查创建的任务实例是否扩展了一些抽象类.
是否有可能不在文件系统中创建样本类来检查继承约束?
谢谢大家!
我使用 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) ->assertTrue(false);
->assertTrue(true);
Run Code Online (Sandbox Code Playgroud)
第一个断言失败,执行停止.但我想继续进一步的代码片段.
是否有可能在PHPUnit中
--stop-on-failure当其中一个测试失败时,您可以使用flag来打破单元测试.
有没有办法快速告诉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) 使用命令行运行测试时遇到问题:如果我像这样运行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) 我有一个全新的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就足够了,但大部分时间都不是这样).
有没有办法使堆栈跟踪与浏览器上显示的相同?或者至少接近那个,以便我知道我应该做的下一步是什么.
提前致谢.
当我在为Laravel创建的新软件包上使用PhpUnit运行测试时,它将生成file .phpunit.result.cache。
怎么办呢?是否将其添加到我的.gitignore文件中?
我正在使用PHPUnit 8.0.4
phpunit ×10
unit-testing ×7
php ×6
laravel ×2
laravel-5 ×2
tdd ×2
laravel-5.4 ×1
mocking ×1
symfony ×1
symfony-3.2 ×1