代码之家  ›  专栏  ›  技术社区  ›  Erik White

Laravel生产应用程序,faker和phpUnit需要开发是真的吗?

  •  0
  • Erik White  · 技术社区  · 2 年前

    我总是注意到,默认情况下,faker和phpunit都在require-dev中,我希望有一个cron作业在生产上运行测试,以确保某个api连接是稳定的。

    这是一个长话短说,所以为了尽可能缩短上下文-我们必须建立与Zoho CRM的连接,这样我们就可以下载数据来运行操作。。因为zoho在批处理文件方面很糟糕,而且我们对客户端信息进行了大量的csv文件上传和处理。。我们正在逐步建立自己的自定义CRM,以摆脱Zoho。要做到这一点,我必须依赖于我找到并分叉的这个包,它封装了他们的官方api。 https://github.com/asciisd/zoho-v3

    由于某些不合理的原因,从本地环境到生产环境,api的行为方式之间存在不一致,有时要求一个对象,有时期望一个字符串,等等。更糟糕的是,它随机地在一个随机的时间切换期望的属性类型。

    当我在本地开发这个时,我有一组单元测试,它们生成虚假数据,发送到我的仅限管理员的测试记录,然后获取这些数据,并确保我正确地推送/拉取。我会每天手动运行

    由于其中一种情况,我刚刚花了一天时间修复了一个错误,我真的很想建立一个cron,每天在生产中运行这些测试。有什么真正的原因可以解释为什么faker/phpunit默认不在Laravel中composer的标准需求部分吗?是否存在安全隐患?

    0 回复  |  直到 2 年前
        1
  •  1
  •   matiaslauriti    2 年前

    PHPUnit Faker 未打开 require-dev 因为您永远不应该在生产上运行测试。没有“借口”,也没有你想怎么称呼它,把它转移到 require 并在那里运行测试。 Faker 可以移动到 要求 ,这是测试中使用的大部分时间,但自从Laravel 10.x以来 fake() 助手可用,因此您可以将其移动到 要求 ,我个人永远不会在生产中使用Faker,除非你有一个非常具体和好的案例可以帮助你,通常没有好的案例。我确实认为我们有 phpunit 在里面 需要dev 由于标准,就这么简单,因为你肯定可以把它移到 要求 (生产)。

    为什么?想象一下,你进行了部署,但有人放弃只运行你想要运行的测试,你可能会运行所有的测试。。。在生产数据库中,想象一下这对公司来说可能是什么类型的灾难?

    您可以采用一系列解决方案,但这取决于您的测试方式,更具体地说,如果API有一些您应该考虑的白名单或任何类似的内容,则会限制哪些机器(IP)可以与此外部API通信:

    1. 让一个cron对API执行特定的HTTP请求(REST),如果只有一个调用满足,那就是了。如果失败,请使用错误跟踪器或类似工具报告。
    2. 如果你必须测试很多端点(或端点的案例),那么测试就是真正的解决方案,而且你没有我之前说过的限制(没有白名单),那么你可以有一个外部的CI/CD服务,比如circleci.com、GitHub Actions、Bitbucket Pipelines和更多服务,以计划的方式运行这些测试(你可以这样做),所以他们处于另一个非生产环境中。
    3. 如果您确实有限制,但仍然可以将更多机器(IP)列入白名单,则应阅读外部CI/CD服务文档或与他们联系,询问是否可以为测试运行程序或类似程序获取固定IP,以便在运行测试时将该工作程序列入白名单。
    4. 下列的 2. 3. ,在我曾经工作过的一家公司,我们确实有Bamboo(它是Atlassian的一个CI/CD解决方案,比Bitbucket Pipelines更复杂或更广泛),我们在工作流上有一个按钮,当点击它时,它也会运行这些测试。我们什么时候可以使用这个按钮和行为?当我们在任何分支上运行CI管道时(因为您提交了,所以在任何分支中运行测试),因此如果您还想运行那些外部端点测试(集成测试),您可以在此时执行。
    5. 如果你不能将另一台机器列入白名单,或者将另一个机器列入白列表要复杂得多,我会非常非常小心地三次检查你在调度程序上写的运行测试的命令,如果你或任何人更改了调用命令上的任何内容,并运行了另一个可能会扰乱真实数据的测试,你将完成一段时间。。。(如果没有自动数据库快照,情况会更糟)

    我可能错过了另一个解决方案,但这就是我现在想到的(基于你所写的)。

    希望它能有所帮助,否则请添加更多信息!