PhpStorm 中的 PHPUnit 引导程序

Posted

技术标签:

【中文标题】PhpStorm 中的 PHPUnit 引导程序【英文标题】:PHPUnit bootstrap in PhpStorm 【发布时间】:2013-01-23 05:17:28 【问题描述】:

我正在使用 Zend Framework 2,我想在 phpStorm 5.0.4 中为我的所有模块运行测试。我设置了 PhpStorm 以检查 myproject/module 中的测试,它成功地找到了我的测试。问题是它不会在每个模块中读取我需要的配置文件(它指向一个引导文件)。

这是一个模块的目录结构 (source):

/module
    /User
        /tests
            /UserTest
                /Model
                    /UserTest.php
            Bootstrap.php
            phpunit.xml.dist
            TestConfig.php.dist

当我运行测试时,它给了我一个错误,因为在运行 UserTest.php 之前没有运行 Bootstrap.php。所有文件都是正确的,因为如果我 cd/myproject/module/User/tests/ 并在终端中运行 phpunit,它工作正常。

我希望它在每个模块中使用配置(从而引导)。我尝试将--configuration 选项与相对路径一起使用,但无法正常工作。

这是我目前的配置:

关于在测试模块时如何运行配置文件(和引导程序)的任何指示?也就是说,一个模块有自己的配置文件和引导程序。

提前致谢。

【问题讨论】:

【参考方案1】:

PHP Storm 7 假设您只需要一个默认引导文件,因此不会为每个 PHPUnit 测试配置直接启用单独的引导文件。

但是,zf2 以每个模块为基础进行测试。因此,在您将默认值设置为第一个模块后,其他模块将不起作用。解决方法是

    删除 File|Settings|PHP|PHPUnit 中的默认选项 您不必删除默认配置文件,但您必须 EMPTY OUT 并取消选中默认引导文件。仅取消选中是不够的

    运行|编辑配置(此框还有其他快捷方式) 对于每个模块,您必须创建一个测试配置。例如,您将拥有标准的应用程序模块,因此有一个“应用程序模块测试”,可能是一个管理模块,然后是一个“管理模块测试”

    对于每个测试(假设标准 zf2 目录结构)

一个。测试范围:目录 湾。目录:C:\wamp\www\PROJECT-NAME\module\MODULE-NAME\test C。选中“使用替代配置文件:” d。输入 C:\wamp\www\PROJECT-NAME\module\MODULE-NAME\test\MODULE-NAMETest\phpunit.xml.dist e.在“Test Runner options”中,输入“--bootstrap C:\wamp\www\PROJECT-NAME\module\MODULE-NAME\test\MODULE-NAMETest\Bootstrap.php”

    重复下一个模块

这里的问题是,只要默认的 bootsrap 字段有一个条目,phpstorm 就会在您在特定于案例的测试运行器选项中添加任何内容之后将其添加为默认的 --bootstrap 选项。所以,无论你做什么,除了第一个/默认测试用例之外,你每次都会运行错误的引导文件

希望对你有帮助

【讨论】:

【参考方案2】:

除非我遗漏了什么,否则您必须为每个模块设置一个测试配置。在你的情况下,你有 myproject。相反,您需要为每个模块设置一个,然后为每个模块设置配置(使用替代配置文件)。

【讨论】:

【参考方案3】:

我利用运行配置中的环境变量选项来定义一个值,我可以在全局 bootstrap.php 中使用它来提取特定于给定模块或应用程序部分的要求。

class GlobalBootstrap


private static $applicationSections = [
    'section_a',
    'section_b',
    'section_c'
];

public static function init()

    $localMethod = self::fetchLocalMethod();
    if (!is_null($localMethod)) 
        self::$localMethod();
     else 
       throw new Exception(
            __CLASS__
            . '::'
            . __FUNCTION__
            . 'Says: No local method has been defined for this test section'
        );
    


private static function fetchLocalMethod()

    $section = getenv('APPLICATION_SECTION');
    if (is_null($section) || !in_array($section, self::$applicationSections)) 
        return null;
    
    $section = preg_replace("/[^a-zA-Z]+/", "", $section);
    $method = 'bootstrap' . ucfirst(strtolower($section));

    return $method;


/**
 * Section specific methods
 */

protected static function bootstrapSectiona()

    require __DIR__ . '/../../section_a/module/Test/Bootstrap.php';



GlobalBootstrap::init();

可以创建任意变量和值,然后在 bootstrap.php 中使用:getevn(VARIABLE_NAME);这在 PHPStorm 中节省了大量冗长的配置,但如果您依赖许多不同的引导功能,可能会变得同样复杂。

【讨论】:

以上是关于PhpStorm 中的 PHPUnit 引导程序的主要内容,如果未能解决你的问题,请参考以下文章

PhpStorm 中的 PHPUnit 测试:无法打开文件

PhpStorm 令牌不匹配异常中的 PHPUnit 测试

使用 Docker 在 PhpStorm 中使用 PHPUnit

使用 PhpStorm 在 Homestead 环境中调试 PHPUnit 测试

PhpStorm 配置 PHPUnit

PhpStorm:未找到类'PhpUnit Framework TestCase'(composer / autoload)