【问题标题】:Tagging unit-tests标记单元测试
【发布时间】:2023-03-17 15:59:01
【问题描述】:

我正在开发一个具有可靠单元测试覆盖率的 PHP 项目。

我注意到,上次我使用 unit-tests 命令行测试运行器的 --filter 命令进行了非常棘手的操作。

以下是官方文档中对该命令的解释:

--过滤器

仅运行名称与给定模式匹配的测试。模式可以是单个测试的名称,也可以是匹配多个测试名称的正则表达式。

我经常使用它,因为有时只运行整个测试库中的单个测试套件或测试用例会变得非常有用。

我想知道这是否是好的做法?

我听说有时在您的持续集成机器上运行整个测试套件是一种很好的做法,如果您确定您只修改了一个组件并且100%百分比置信度,它不会通过其他组件的单元测试。 你怎么看?

前段时间我认为我们不应该太在意运行所有单元测试的整个套件所需的时间,但是当您有非常复杂的业务逻辑和单元测试时 - 这可能会花费大量时间。

我明白,“真正的”单元测试不应该与数据库交互,使用模拟/存根对象,我同意这一点。但有时,使用 DB 固定装置进行测试更容易(更便宜)。

请给我一些建议,如何解决这个问题?

【问题讨论】:

    标签: performance unit-testing continuous-integration phpunit tagging


    【解决方案1】:

    好的单元测试应该:

    • 有明确的方法名称和变量名称作为文档
    • 跑得快。这也将是可能的 用于复杂业务的测试 逻辑。测试应该以平均方式运行 大约 0.1 秒的时间。
    • 用一种测试方法准确测试一件事
    • 不与文件系统、电子邮件等外部资源集成, 数据库、网络服务和 其他一切。你可以创建 单独的数据库集成测试 来测试你的数据库交互。 这些测试会比你的单元慢 大部分时间都在测试。我把我的 单独的集成测试 项目,我只在我运行时运行它们 处理集成代码。一世 还在 CI 上的所有构建上运行它们 服务器。
    • 彼此完全隔离。当你有测试取决于 在彼此身上,你看不到什么 你的问题是从阅读哪个 测试失败。你可能不得不 调试以发现问题。孤立 测试将为您节省大量时间。

    就我个人而言,我在测试中不使用类别名称。我每个应用程序使用 2 个测试项目。一种用于单元测试,一种用于集成测试和较慢的测试。

    反应:

    “但有时,它很多 更容易(更便宜)使用 DB 固定装置 测试。”

    当你的代码写得好时,它会更容易模拟。我不知道 Php 中的 mocking 框架,但我在其他语言中使用它们可以节省我很多时间。先写测试再写代码可能会帮助您设计更容易测试的代码。

    就我个人而言,我学会了更好地测试

    • 阅读有关它的博客
    • 阅读有关它的书籍
    • 阅读他人编写的测试代码
    • 当然要写很多测试。我花了几千次测试才变得擅长它。

    【讨论】:

    • hm.. 对我来说,将快速和慢速测试拆分为不同的项目是一个非常新的想法。而且也很有趣。正如您之前所说,它看起来更像是测试很慢,因为它们不是单元测试而是集成测试。谢谢
    【解决方案2】:

    我经常使用它,因为有时只运行整个测试库中的单个测试套件或测试用例会变得非常有用。

    我想知道这是否是好的做法?

    当然,只要您偶尔运行全套单元测试(通过 CI 服务器听起来很完美)

    定期运行“有趣”的测试比很少运行所有测试要好。

    【讨论】:

      【解决方案3】:

      我会通过在提交前运行 必须 运行 1 分钟或更短时间的测试子集(“冒烟测试”)来解决这个问题,然后从您的CI服务器。

      如果您的全套测试需要超过 15 分钟,那么我会考虑将它们分开并并行运行。

      然后,您可以使用 --filter 先运行您最感兴趣的测试,然后在提交之前运行冒烟测试,其余的从 CI 服务器运行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-18
        • 2017-06-17
        • 2014-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-10
        • 1970-01-01
        相关资源
        最近更新 更多