PHP(单位)中的测试和生产代码
#教程 #tdd #php #测试

共关序测试和生产代码是某些编程语言中的默认值,并且已成为事实上的标准。我必须承认,虽然我喜欢Go和Typescript,但我总是对PHP的做法感到有些不适。我真的不能命名。这更多的是“感觉不正确”的感觉。当然,事实证明这只是一个胡说八道的偏见,因为它在PHP中的工作原理和其他语言一样。无论哪种语言,好处都是相同的:

  • 乍一看,如果有一件代码的测试
  • 您不必再导航了
  • 您不必在源和测试目录中维护并行结构

让我们尝试一下,好吗?

迁移一个简单的项目

在平行结构和单个测试套件中使用测试和生产代码进行此设置:

src/
└── MyProject
    ├── MyClass.php
    └── MyOtherClass.php
tests/
└── MyProject
    ├── MyClassTest.php
    └── MyOtherClassTest.php
<testsuites>  
    <testsuite name="default">  
        <directory>tests</directory>  
    </testsuite>
</testsuites>

好消息是,迁移就像将MyProject目录从tests拖动到src一样容易。至少如果您正在使用phpstorm。 PHPSTORM将适当地更改名称空间。如果您选择的编辑不提供这种重构,则搜索和替换也会做。

src/
└── MyProject
    ├── MyClass.php
    ├── MyClassTest.php
    ├── MyOtherClass.php
    └── MyOtherClassTest.php

您需要做的最后一件事就是将phpunit指向新位置。只需将目录从tests更改为src,就可以了:

<testsuites>  
    <testsuite name="default">  
        <directory>src</directory>  
    </testsuite>
</testsuites>

那多个测试套件呢?

当有一个不仅仅是一个测试套件时,事情会变得有些棘手。让我们看一下此设置:

tests/
├── Integration
│   └── MyProject
│       └── MyClassTest.php
└── Unit
    └── MyProject
        └── MyOtherClassTest.php
<testsuites>  
    <testsuite name="integration">  
        <directory>tests/Integration</directory>  
    </testsuite>
    <testsuite name="unit">  
        <directory>tests/Unit</directory>  
    </testsuite>
</testsuites>

如果我们在第一个示例中以相同的方式进行归因,则无法确定哪个测试属于哪个测试套件。这是解决此问题的两个选项。

使用后缀

第一个选择是将后缀Test更改为IntegrationTestUnitTest。尽管有点笨拙。

src
└── MyProject
    ├── MyClass.php
    ├── MyClassIntegrationTest.php
    ├── MyOtherClass.php
    └── MyOtherClassUnitTest.php
<testsuites>
    <testsuite name="integration">  
        <directory suffix="IntegrationTest.php">src</directory>  
    </testsuite>
    <testsuite name="unit">  
        <directory suffix="UnitTest.php">src</directory>  
    </testsuite>
</testsuites>

使用组

第二个选项是使用group注释对测试进行分类。由于组和测试套件是不同的东西,并且不能由组组成,因此可以将配置简化为单个测试套件。只需记住,您必须在运行测试时使用group选项而不是testsuite选项(phpunit --group integrationphpunit --group unit)。

/**
 * ...
 * @group integration
 */
final class MyClassTest extends TestCase
{
    // ...
}


/**
 * ...
 * @group unit
 */
final class MyOtherClassTest extends TestCase
{
    // ...
}
<testsuites>
    <testsuite name="default">  
        <directory>src</directory>  
    </testsuite>
</testsuites>

调整phpstorm

当我发现项目窗口中的文件看起来像这样时,我有些失望:

Snippet of PhpStorm's project window: test and production classes without clear distinction

测试类具有指示测试的红色/绿色箭头,但我希望它们会突出显示,因为我习惯了开玩笑的测试。幸运的是,这很容易自定义。

转到首选项|外观与行为|示波器并设置新的范围匹配测试类(file:*Test.php):

Screenshot of PhpStorm's settings dialog (Preferences | Appearance & Behavior | Scopes)

然后为新范围添加一个元素,然后在首选项下选择颜色|外观与行为|文件颜色

Screenshot of PhpStorm's settings dialog (Preferences | Appearance & Behavior | File Colors)

现在应该看起来像这样:

Snippet of PhpStorm's project window: test classes highlighted green

甜!

您可能想调整的另一件事是某些检查的严重性。我注意到警告显示以前没有。这可能是由于PHPSTOMS根据其在哪种类型的目录( preverences |目录)中处理文件的方式。由于我们已经设置了新范围,因此我们只需要更改偏好下的严重性|编辑|检查静音不良检查。

Screenshot of PhpStorm's settings dialog (Preferences | Editor | Inspections)

而已

这就是我目前必须说的。我已经在我的个人项目中使用了这种方法已有一年多了,并在一个月前在工作中介绍了这种方法。到目前为止,每个人都喜欢它。