【问题标题】:Quarantined Testing environment for PHPPHP 隔离测试环境
【发布时间】:2011-04-25 21:02:39
【问题描述】:

我正在将 Git 存储库集成到公司工作流程中,老板想要一种能够在部署到生产环境之前测试 php 代码的方法。目标是拥有三个环境:开发、测试和生产。

所以工作流程会是这样的:

  • 克隆到本地开发者的存储库中
  • 将更改推送到 repo
  • 将更改从 repo 拉到测试环境
  • 在测试环境中测试更改,以向管理人员展示网站在更改被拉入实时环境后的外观和行为
  • 获得批准后,将更改从 repo 拉到生产环境中。

现在,这里有几个问题:

  1. 公司希望使用来自实时环境的实际数据来更好地判断程序在测试环境中的行为是否正确。我很乐意保持数据同步,并且基本上让实时数据库每晚同步到测试数据库。
  2. 该程序会定期向客户端发送电子邮件,因此我需要一种方法来拦截对 mail() 的任何调用,并将该尝试重定向到日志文件或其他电子邮件地址。
  3. 该程序还处理计费,但我相当有信心我可以将支付处理器集成从实时切换到沙盒环境(即 paypal、auth.net 等)。

如果您有任何关于如何执行上述操作的想法和想法,我将不胜感激。

谢谢!

【问题讨论】:

    标签: php git testing


    【解决方案1】:

    在我们的暂存服务器上,我已将本地 smtp 配置为丢弃除白名单中的某些地址之外的所有邮件。这样,客户就不会收到来自暂存环境的任何邮件。

    对于其他外部服务,如果它们支持或使用存根,我会在测试模式下运行它们。后者意味着我们无法测试最后一个集成点,但这是可以接受的。

    【讨论】:

    • 非常酷,你有资源可以指点我,以便我学习如何配置 smtp 以满足我的需要吗?
    • 使用后缀非常简单。这是一个带有说明的帖子:thedrupalblog.com/…
    【解决方案2】:

    我之前看到过类似的方法写入应用程序,并看到了以下实现:

    • 用于构建/发送所有出站电子邮件的标准“邮件”类。这样您就可以轻松地修改开发/登台环境中的行为。一种很好的方法是将来自该系统的所有电子邮件发送到共享邮箱或登录用户的电子邮件地址(执行测试),并在邮件中包含一个标题,说明它来自测试平台如果它正在生产中,它会被发送给谁。
    • 在其他设置中,我看到 MTA 配置为黑洞邮件
    • 明确定义的方法让应用程序检测它在哪个环境中运行,以便它可以弄清楚如何表现。在 Apache 配置中设置的环境变量(我猜您正在使用 Apache)来检测平台,然后配置允许您从一组常用选项继承并在必要时重载特定选项的功能。 Zend Framework 的Zend_Config 处理得非常好。
    • 为了便于测试您的代码或更换组件,良好的 OO 设计和Dependency Injection 将真正有助于您测试事物的能力
    • 考虑使用某种持续集成工具,例如 Hudson 或 PHP Under Control
    • 考虑使用 Capistrano 或 Phing,以便轻松部署到不同平台

    【讨论】:

    • 我喜欢依赖注入的建议。这是一个非常有用的概念。
    【解决方案3】:
    1. 数据需要有多准确?它是否需要成为生产数据,或者只是喜欢它?每当您有架构更改或其他情况时,您都可以手动运行导入。

    2. 这里的另一种选择是在包含您的联系人的数据库表上运行更新,在不需要任何其他配置的实时电子邮件地址的末尾添加“.invalid”或其他内容。

    3. 用于支付授权的沙盒环境必然是您使用的网关的功能。

    我喜欢 James C 提到的依赖注入。注入的依赖项将模糊您的生产和测试环境之间的界限,而无需进行大量配置。这肯定会让您的生活更轻松。

    【讨论】:

      【解决方案4】:
      1. 如果您有一个大型数据集,这将是乏味的。如果您使用的是 MySQL,您可以捕获 bin 日志并在测试时重新运行它们以保持数据同步。

      2. 这可以使用环境变量或配置来实现,如果正在使用的环境是测试环境,则使用调试邮件 ID。

      3. 与上述配置相同。

      请注意,当使用 git 推送到远程仓库时,仓库必须是裸露的,否则您将不得不破解它。

      【讨论】:

      • 只有在暂存数据库没有被写入(我猜它可能会作为测试的一部分)的情况下才能很好地捕获二进制日志。如果是这样,那么您可能会在重放 bin 日志时遇到各种令人讨厌的问题,例如主键冲突等
      • 我们使用 unfuddle 作为我们的 repo 主机。 AFAIK 我可以克隆到存储库中,进行更改,添加并提交更改,将更改推送回存储库,并且更改将在远程存储库中适当地表示。我不打算尝试将更改从 unfuddle repo 推送到 testing/live env
      • @JamesC,真的,我没有考虑过这种可能性。 @ivannovak,正如您所提到的,任何托管的 git repo 都可以。如果您需要推送到自己的 git 存储库,我指出了这种情况。
      猜你喜欢
      • 2011-07-28
      • 2018-08-19
      • 1970-01-01
      • 1970-01-01
      • 2017-06-06
      • 2020-04-28
      • 2016-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多