PHPUnit:运行单个测试时通过,运行所有测试时失败

4

我遇到了这样的问题:当我只运行这个测试时,它可以正常运行。但是当我将所有测试一起运行时,这个测试就会失败。从NetBeans或命令行中运行都会得到相同的结果。

与套件中其他测试不同的是,这个测试从资源文件夹中获取一个文件,然后将它复制到一个测试文件夹中(该文件夹在测试开始时创建,在结束时销毁)。

我曾认为这可能是相对路径或绝对路径的问题,但当我输出源路径和目标路径时,它们是相同的。

这是有问题的代码(在复制语句上失败):

public function testRemoveRequirementFileValid()
{
    $dbName = 'TRHUtilTest';
    $reqID = 1;
    $userID = 14;
    $trhVersionID = 3;

    //create the database
    DBCreator::CreateProjectDatabaseAndTables($dbName);
    DB::setConnectionInfo($dbName);

    $fileName = 'example.png';
    $sourceFolder = dirname(__FILE__).'\TRHUtilResources\\';
    $targetLink = '../'.FolderDefine::GetFolder('TRH_RequirementLink', $dbName).$trhVersionID.'/'.$reqID.'/';
    FileUtil::MKDirs($targetLink);
    $targetFolder = FolderDefine::GetFolder('TRH_RequirementFile', $dbName).$trhVersionID.'\\'.$reqID.'\\';

    //2 debugging statements
    print PHP_EOL.'Source Folder: '.$sourceFolder.PHP_EOL;
    print PHP_EOL.'Target Folder: '.$targetFolder.PHP_EOL;
    copy($sourceFolder.$fileName, $targetFolder.$fileName);

    $file = new File();
    $file->setName($fileName);
    $file->setLocation($targetLink);
    $file->save();
    $fileID = $file->getID();

    //create the link between a requirement and a file
    TRHUtil::RequirementFileLink($reqID, $fileID, $userID);

    //assert that there is one record, then check the structure and then the contents
    $this->assertEquals(1, DB::getRecordCount($dbName.'.files_reqs'));
    $this->assertEquals(1, TRHUtil::RequirementFileLinkPresent($reqID, $dbName));
    $this->assertEquals(1, TRHUtil::RequirementFileLinkCheck($reqID, $fileID, $dbName));
    $this->assertEquals(1, count(TRHUtil::GetRequirementFileLinkID($reqID, $dbName)));

    TRHUtil::RemoveRequirementFile($reqID, $dbName, $trhVersionID);

    //assert that the records about this file are removed and that the folder where the file was staying is also removed
    $this->assertEquals(0, DB::getRecordCount($dbName.'.files_reqs'));
    $this->assertEquals(0, TRHUtil::RequirementFileLinkPresent($reqID, $dbName));
    $this->assertEquals(0, TRHUtil::RequirementFileLinkCheck($reqID, $fileID, $dbName));
    $this->assertEquals(0, TRHUtil::GetRequirementFileLinkID($reqID, $dbName));
    $this->assertEquals(0, is_dir($targetFolder));

    //remove the project folder
    $projectFolder = FolderDefine::GetFolder('ProjectRoot', $dbName);
    FileUtil::RRMDir($projectFolder);
}

调试语句随后输出:
Source Folder: D:\Inetpub\wwwroot\DTS\tests\util\TRHUtilResources\
Target Folder: D:\Inetpub\wwwroot\DTSfiles\TRHUtilTest\trh\reqs\3\1\

在NetBeans的输出窗口中,我还看到了以下内容:copy(D:\Inetpub\wwwroot\DTSfiles\TRHUtilTest\trh\reqs\3\1\example.png): failed to open stream: No such file or directory
然而,这个文件夹已经被创建了。值得注意的是,有关复制语句的错误只显示第二个参数,并且没有引号包围该参数。

2
你需要展示出你的有问题的测试以及它是如何失败的,才能得到帮助。这听起来像是测试污染(即测试会影响全局状态导致后续测试失败,或者在执行“测试”之前从一个假设状态开始而不是确保测试场景符合预期)。 - AD7six
失败(fail)的确切含义是什么? - Lajos Veres
@AD7six 我添加了有问题的代码。 - Tornado
@AD7six:我知道这不是完整的单元测试,我只是在这里放置了导致问题的行(完整的测试有49行)。断言语句稍后出现在测试函数中。 - Tornado
2
你那里的代码相当混乱,看起来不像是单元测试。如果你的代码在设置时无法复制文件夹,那么这只是一个“正常”的问题需要你进行调试。例如,路径是否正确(DTSfiles?)?在调用复制之前,源文件夹和目标文件夹是否存在?在这里,没有什么人能为你提供帮助。 - AD7six
显示剩余5条评论
1个回答

0

我找到了解决方案,这要感谢用户@AD7six和@Lilshieste最新评论后我添加的一些额外调试语句。

为了创建目标文件夹,我使用了以下命令:

$targetLink = '../'.FolderDefine::GetFolder('TRH_RequirementLink', $dbName).$trhVersionID.'/'.$reqID.'/';
FileUtil::MKDirs($targetLink);

这意味着创建了以下文件夹:../../../DTSfiles/TRHUtilTest/trh/reqs/3/1/
然而,它应该是:
$targetFolder = FolderDefine::GetFolder('TRH_RequirementFile', $dbName).$trhVersionID.'\\'.$reqID.'\\';
FileUtil::MKDirs($targetFolder);

对应的文件夹是:D:\Inetpub\wwwroot\DTSfiles\TRHUtilTest\trh\reqs\3\1\

由于运行该单元测试的起始位置与存储所有测试的根文件夹不同(根测试文件夹深度比 起始位置深2个目录级别),因此目标文件夹确实已创建,但级别错误。

感谢大家的支持。


很高兴听到你找到了问题所在。现在事情正在运作,这是一个开始重构的绝佳机会。 :-) - Lilshieste
你说得很有道理,但实际上这个测试更像是一个集成测试而不是单元测试(在这里使用的所有其他函数(例如FileUtil :: MKDirs)已经被其他更小的单元测试覆盖了)。 - Tornado
你说得对,你肯定应该保留这个测试。不过,在这个测试下面有一个设计,它正在等待着被发掘出来,正如你所遇到的困难所表明的那样。但这已经偏离了你的问题,因此我为分散注意力而道歉。 - Lilshieste

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接