如何跳过PHPUnit中的错误测试?
当依赖项的数据集出错时,如何让PHPUnit跳过测试如何跳过PHPUnit中的错误测试?,php,unit-testing,testing,phpunit,Php,Unit Testing,Testing,Phpunit,当依赖项的数据集出错时,如何让PHPUnit跳过测试 作品 如果我的数据提供程序只有导致错误的东西,那么它将适当地跳过相关测试注意跳过的代码:1 class DataProviderDependsTest extends PHPUnit_Framework_TestCase { public function getDataProvider(){ return [ ['non-existent_file.txt'], ]; }
作品 如果我的数据提供程序只有导致错误的东西,那么它将适当地跳过相关测试注意跳过的
代码:1
class DataProviderDependsTest extends PHPUnit_Framework_TestCase
{
public function getDataProvider(){
return [
['non-existent_file.txt'],
];
}
/**
* @dataProvider getDataProvider
*/
public function testCanBeDependedOn($data){
$actual = file_get_contents($data);
$this->assertSame('expected',$actual);
}
/**
* @dataProvider getDataProvider
* @depends testCanBeDependedOn
*/
public function testCanDepend($data){
$this->assertTrue(false);
}
}
不起作用 但是,如果我向提供程序添加了一条良好的数据,那么尽管其余数据导致了错误,PHPUnit仍然继续执行all相关测试(甚至是有错误的对应数据集)。它没有跳过任何内容注意向数据提供程序添加了
['real_file.txt'],
class DataProviderDependsTest extends PHPUnit_Framework_TestCase
{
public function getDataProvider(){
return [
['real_file.txt'],
['non-existent_file.txt'],
];
}
/**
* @dataProvider getDataProvider
*/
public function testCanBeDependedOn($data){
$actual = file_get_contents($data);
$this->assertSame('expected',$actual);
}
/**
* @dataProvider getDataProvider
* @depends testCanBeDependedOn
*/
public function testCanDepend($data){
$this->assertTrue(false);
}
}
PHPUnit在使用时不会跳过错误测试
发件人:
注
当测试依赖于使用数据提供程序的测试时,当它所依赖的测试对于至少一个数据集成功时,将执行依赖测试。
如果依赖测试中提供的数据的任何部分导致错误,我想一起跳过一些测试。有没有办法绕过这个限制
如果需要,您可以进行快速测试,或者只克隆:
git clone https://github.com/admonkey/phpunittest.git
很抱歉,这个答案并没有真正解决您的问题,因为您确实需要在数据提供程序中至少有一条通过记录才能运行基于@depends的测试。@iRas的答案看起来是你想要做的 我没有删除这个答案,因为它仍然可能向其他人提供一些信息 @depends不能实现您期望的功能。这并不意味着如果另一个失败,就不运行测试 : PHPUnit支持声明测试方法之间的显式依赖关系。这种依赖关系不定义测试方法的执行顺序,但它们允许生产者返回测试夹具的实例并将其传递给依赖使用者。示例2.2显示了如何使用@Dependes注释来表示测试方法之间的依赖关系 有关更多详细信息,请参阅“测试依赖项”一节 这更多地用于在测试函数之间传递数据,而不是确保一组测试在另一组测试失败时不运行
在测试中,从testEmpty()返回$stack,并将其传递到testPush。这意味着testPush中的$stack已定义,并且是空数组,而不是未定义的数组
理想情况下,您的测试不应该依赖于一个或另一个传递,而应该是原子的,以指示功能是否工作,从而帮助您发现代码中的问题。基于测试通过的更多依赖关系可能会导致大量错误,如果一个测试以一种不期望的方式更改数据,那么所有检查该数据的后续测试都将失败,这实际上不是您应该如何构造测试的。测试是否良好,测试是否失败,但在通过测试和失败测试之间没有硬依赖关系。也许这就是您期望的行为:
<?php
class DataProviderDependsTest extends PHPUnit_Framework_TestCase
{
protected static $failed = false;
public function getDataProvider() {
return [
['real_file.txt'],
['non-existent_file.txt'],
];
}
/**
* @dataProvider getDataProvider
*/
public function testCanBeDependedOn($data) {
try {
$actual = file_get_contents($data);
self::assertSame('expected', $actual);
} catch(Exception $e) {
self::$failed = true;
throw $e;
}
}
/**
* @dataProvider getDataProvider
* @depends testCanBeDependedOn
*/
public function testCanDepend($data) {
if (self::$failed) {
self::markTestSkipped('testCanBeDependedOn failed');
}
self::assertTrue(true);
}
}
有趣的想法。问题不在于他忽略了@依赖项
——他只是满足于其中一个数据有效的测试……但如果依赖项测试失败,它将跳过测试。。。它可以这样做,因为它说“这就是为什么PHPUnit在依赖测试失败时跳过测试的执行。”
git clone https://github.com/admonkey/phpunittest.git
<?php
use PHPUnit\Framework\TestCase;
class StackTest extends TestCase
{
public function testEmpty()
{
$stack = [];
$this->assertEmpty($stack);
return $stack;
}
/**
* @depends testEmpty
*/
public function testPush(array $stack)
{
array_push($stack, 'foo');
$this->assertEquals('foo', $stack[count($stack)-1]);
$this->assertNotEmpty($stack);
return $stack;
}
/**
* @depends testPush
*/
public function testPop(array $stack)
{
$this->assertEquals('foo', array_pop($stack));
$this->assertEmpty($stack);
}
}
?>
<?php
class DataProviderDependsTest extends PHPUnit_Framework_TestCase
{
protected static $failed = false;
public function getDataProvider() {
return [
['real_file.txt'],
['non-existent_file.txt'],
];
}
/**
* @dataProvider getDataProvider
*/
public function testCanBeDependedOn($data) {
try {
$actual = file_get_contents($data);
self::assertSame('expected', $actual);
} catch(Exception $e) {
self::$failed = true;
throw $e;
}
}
/**
* @dataProvider getDataProvider
* @depends testCanBeDependedOn
*/
public function testCanDepend($data) {
if (self::$failed) {
self::markTestSkipped('testCanBeDependedOn failed');
}
self::assertTrue(true);
}
}