使用PHPUnit进行单元和功能测试的文件系统/目录布局

2022-02-24 00:00:00 integration layout php phpunit

我需要将集成测试添加到我的测试套件中。虽然名称是PHPUnit,但我发现这里有很多对运行非单元测试的支持。我的布局是这样的:

<root>
    lib/
        Foo/
            Component.php
    tests/
        lib/
            Foo/
                ComponentTest.php
        resources/
            fixtures/

在我看来,有三种方法可以在这里添加高于单元级别的测试:

添加并行结构

<root>
    tests/
        unit/
            lib/
                Foo/
                    ComponentTest.php
        integration/
            lib/
                Foo/
                    ComponentTest.php
        resources/
            fixtures/

这应该可以工作,除非现在没有1:1的class:test类关系,这可能会(而且很可能会)混淆NetBeans。

添加<root>/tests/lib/Foo/ComponentIntegrationTest.php

具有与上面相同的问题,但目录较少。

将测试添加到现有测试类,符号类似于@group integration

这保持了1:1的关系,但会显著增加测试套件的复杂性。此外,由于需要在更改的环境中调用SUT,因此我不能只重用单元测试中的_setup()。

想法?


解决方案

单元测试用于隔离测试单个单元(类)。集成测试旨在一起测试多个单元。因此,您可能不会在类和它们所属的集成测试之间具有1:1的相关性。

我将创建一个单独的目录结构--甚至可能是一个单独的项目--来存放集成测试。NetBeans将无法打开类所属的"测试",因为它将属于多个测试,但它将继续打开其匹配的单元测试。

我们有一个单独的项目,使用Selenium进行集成测试(在我到达之前称为健全性测试),到目前为止它工作得足够好。

更新

我们集成测试的目录布局非常简单:每个站点一个目录。我们为站点提供了单一的代码库,并使用视图来允许单个站点覆盖布局(不仅仅是换皮)。我们在这些测试上花的时间没有我想要的那么多。在将站点推送到临时服务器之后,我们使用Selenium来运行测试。我还没有机会将它们连接到我们的持续集成服务器(Jenkins),但这将是理想的。

我建议您在站点上按功能区或模块组织它们。在很大程度上,这取决于您如何看待您正在测试的项目。示例可能如下所示:

src/
    Model/
        Cart.php
    ...
tests/
    unit/
        phpunit.xml
        bootstrap.php
        Model/
            CartTest.php
        ...
    integration/
        account/
            login/
            register/
            subscriptions/
        products/
            listing/
            details/
            search/
        cart/
            shop/
            checkout/

相关文章