Php 如何将ZF2单元/应用程序模块测试整合到单个调用中?

Php 如何将ZF2单元/应用程序模块测试整合到单个调用中?,php,unit-testing,phpunit,zend-framework2,Php,Unit Testing,Phpunit,Zend Framework2,我遵循在模块中存储测试的ZF2约定,当在每个模块中运行测试时,一切都正常工作。我想做的是有一个根级别的phpunit.xml,它调用各个模块测试并合并它们以生成代码覆盖率数据和其他度量 问题是每个单独的测试套件都是在模块化phpunit.xml文件中引导的。我知道这样做的唯一方法是在每个phpunit.xml文件中配置引导,当从根目录运行测试时,由于忽略了单个xml文件,因此显然无法获取引导 所以我的问题是:根级别的phpunit.xml文件是否有办法从模块中读取单个phpunit.xml和引导

我遵循在模块中存储测试的ZF2约定,当在每个模块中运行测试时,一切都正常工作。我想做的是有一个根级别的phpunit.xml,它调用各个模块测试并合并它们以生成代码覆盖率数据和其他度量

问题是每个单独的测试套件都是在模块化phpunit.xml文件中引导的。我知道这样做的唯一方法是在每个phpunit.xml文件中配置引导,当从根目录运行测试时,由于忽略了单个xml文件,因此显然无法获取引导

所以我的问题是:根级别的phpunit.xml文件是否有办法从模块中读取单个phpunit.xml和引导文件,如果您愿意,这是一种phpunit配置继承?我可以用Phing或CI脚本来写,但我希望在开发过程中能快速完成,而且这个解决方案仍然不能生成统一的代码报告

基本上,我想要这样的东西,但不是运行测试,而是希望它在每个模块中运行单独的phpunit.xml文件。这可能吗

<?xml version="1.0" encoding="UTF-8"?>

<phpunit>
    <testsuites>
        <testsuite name="Site Tests">
            <directory>./module/Application/test/ApplicationTest</directory>
            <directory>./module/User/test/UserTest</directory>
        </testsuite>
    </testsuites>
</phpunit>

/模块/应用程序/测试/应用程序测试
/模块/用户/测试/用户测试
更新

其目的是让PHPUnit生成的代码度量提供项目概述,而不是模块化的特定概述。我很感激答案中的脚本将在每个模块的基础上运行单元测试,但这不是我想要的。我理解就PHPUnit而言,这可能是一个限制。我将在接下来的几天内对此进行研究,并尝试找到一个解决方案,因为它似乎在许多处理自定义模块的项目中都很有用

更新2

Robert Basic提出了一个脚本,该脚本创建了一个目录结构,其中包含模块报告,它工作得很好,但如果能够在PHPUnit中运行它,并提供适当的度量报告,那就太好了


之前在irc上与不同的人讨论过这一点,我很确定你不能,你需要编写一个脚本来循环模块,并逐个模块运行它们。

如果你使用Linux,你可以创建一个简单的脚本。这不是您想要的解决方案,但仍然有帮助:

#!/bin/sh

modDir=$(pwd)
for i in *; do

    if [[ -d $i/test ]]; then
        cd $i/test
        phpunit
        cd $modDir
    fi
done
您可以将其放入模块目录中的runtests.sh文件中


只是想一想:)

谢谢你的回答,但这对代码覆盖率等方面没有帮助,因为它会为每个测试套件生成单独的文件。谢谢你的回答,但请参阅上面的评论,了解我为什么要为整个项目生成代码覆盖率和度量。我理解你的意思,但我认为这是不可能的,我在工作中遇到了同样的问题,我们为每个模块生成代码覆盖率,这看起来像是PHPUnit中的一个限制。在接下来的几天里,我将更详细地研究它。为反馈干杯。因为PHPC或任何你用来做代码分析的东西只是在读xml,你不能组合xml输出吗?很可能,我还没有研究它的本质。我明天会进行一次黑客攻击并发布结果。我前一段时间问了一个问题,但运气不好。从那以后我就没看过了,但我想我会用Phing来做这个。如果您的IDE不支持它(例如,PhpStorm不支持),那么它将非常简单,只需在创建
测试
目标后从命令行运行
phing test
或类似操作即可。这不是您想要的,但这是一个简单的解决方法,我可能会自己使用。如果您想使用ant,那么可以在[此处][1]找到另一个解决方案。[1]: