如何让PHPUnit排除测试路径中的.svn目录?

如何让PHPUnit排除测试路径中的.svn目录?,php,phpunit,autoload,Php,Phpunit,Autoload,从phpunit.xml如何使phpunit不在.svn目录中搜索?在大型项目中,随着.svn目录数量的增加,这将成为一个更大的问题 我的当前配置: <?xml version="1.0" encoding="UTF-8"?> <phpunit bootstrap="phpunit_bootstrap.php" colors="true" convertErrorsToExceptions="true" convertNoticesToException

从phpunit.xml如何使phpunit不在.svn目录中搜索?在大型项目中,随着.svn目录数量的增加,这将成为一个更大的问题

我的当前配置:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit bootstrap="phpunit_bootstrap.php"
    colors="true"
    convertErrorsToExceptions="true"
    convertNoticesToExceptions="true"
    convertWarningsToExceptions="true"
    processIsolation="false"
    syntaxCheck="true"
    verbose="true"
    strict="true">
    <filter>
        <whitelist addUncoveredFilesFromWhitelist="true">
            <directory suffix=".php">./phpunit/</directory>
            <exclude>
                <directory>./phpunit/.svn</directory>
            </exclude>
        </whitelist>
    </filter>
</phpunit>

是否可以将.svn目录列入黑名单?最好使用通配符指令,这样我就不必指定每个.svn目录的绝对路径(例如,
.svn

目前没有办法告诉
PHPUnit
不扫描与特定表达式匹配的目录或忽略隐藏的目录

因此,目前您必须
每一个svn目录

只是重申一下评论中所说的:这只是在处理非常慢的文件系统时的一个问题,这些文件系统需要花费大量时间进行stat和read调用

这就是为什么我会假设用例是如此有限,以至于在phpunit中构建一个.svn ignore是不值得的,特别是因为较新的svn版本不再将dir放在任何地方。(见可能的解决方案2)

可能的解决方案: 列出所有排除项 也许编写一个从文件中生成排除标记的小脚本不是什么大问题

find . | grep -e ".svn$" | sed 's/^/<directory>/' | sed 's/$/<\/directory>/'
find.|grep-e“.svn$”| sed's/^/'| sed's/$/'
例如,将为您提供所有要粘贴的include标记的列表。或者使用基于文档的小脚本就地更新文件:)

升级到Subversion 1.7。
这会将所有元数据存储在项目根目录中的一个目录中,因此您的
项目/tests
文件夹中不会有文件供phpunit扫描并解决此问题。

这可能有些过分,但我确实想要一个更好的解决方案

下面是php\PEAR\File\Iterator\Factory.php文件的一个补丁,它是所有这些缓慢的原因。它跳过不以字母或数字开头的目录。取悦于

108110c108
<新递归迭代器(
新的递归迭代器(新的递归迭代器(新的递归目录迭代器($path,递归目录迭代器::FOLLOW\u符号链接),'=\\\\[a-zA-Z0-9]=',true),

我有一个项目,在svn的+300个文件夹中有+5000个类/文件,phpunit会进行扫描,直到执行第一个测试大约需要半秒钟。你能详细解释一下为什么这对你来说是个问题吗?:)我正在一个网络上工作,该网络与NAS服务的机器进行对话。谢谢,回答得很好。我不知道SVN1.7将其元数据布局更改为类似于git的内容。我可能不得不申请升级!
find . | grep -e ".svn$" | sed 's/^/<directory>/' | sed 's/$/<\/directory>/'
108,110c108
<                     new RecursiveIteratorIterator(
<                       new RecursiveDirectoryIterator($path)
<                     ),
---
>                       new RecursiveIteratorIterator(new RecursiveRegexIterator(new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::FOLLOW_SYMLINKS), '=\\\\[a-zA-Z0-9]='), true),