系统配置验证 tests/approach/tools

System configuration verification tests/approach/tools

问题是关于 testing/verifying 产品配置的最佳实践。

假设我们正在开发酒店预订系统,有 1 个用于预订的网站,用于处理预订的后台守护程序作业以及用于与酒店通信的 API。网站将消息发布到 Message Queue,守护程序使用这些消息,保存在数据库中并通过 API.

向酒店发送通知

在这种情况下,test/verify 这样的事情是否有意义:

是的,冒烟测试和集成测试会测试这一切,但它们更有可能进行应用程序逻辑测试。在冒烟测试之前,我想要一些我可以 运行 的东西,对于生产前和生产环境,它会很好地检查所有配置是否指向生产环境。

如有任何建议,我们将不胜感激。

你要的不是真正的测试,这是监控。

您想检查系统的健康状况。

您将从 monit (https://mmonit.com/monit/) 开始,因为它是 运行 您的守护进程的一个很好的基础。它还具有内置和可编写脚本的检查,因此如果您的守护进程吃得太多 cpu 或 ram,它可以重新启动它。

您还可以监控您的 mq 服务器和队列的长度,以便在出现问题时发现问题。

对于配置文件和正确的数据库连接:如果这些不正确,甚至您的索引页面也可能会失败,因此类似 monit 的检查将在几秒钟内诊断出这些问题。

我还会在应用层实施健康检查,并定期从您的监控服务(如您的站点。com/healthreport。php,它只能从列表访问地址)。然后你可以投票。请务必提供有用的错误消息和当前版本信息(例如您的应用程序版本,php 版本或 mysql 版本),并跟踪这些信息,因为很难找到没有信息的问题。 (哪个服务器!?哪个用户?它是哪个版本?它在哪里?哦,伙计们,你们刚刚 apt-get 更新了吗?!?)

这样,如果您的健康报告没有及时回答,并且答案不是 "Everything ok",那么它会向您发送警报。

对于配置,我将实施三层解决方案: - 第 1 层是所有内容的默认设置,这是您源代码的一部分,当然它是受版本控制的。 - 第 2 层是一个版本控制的覆盖配置,仅与默认设置不同。您应该在配置中包含您的安装实体名称(或主机名,例如),因此在一个版本控制的目录中,您可以存储测试、生产、开发配置。没有人在生产中触及配置,您应该始终提交更改来做到这一点。 - 第 3 层是 NEVER 的例外 :) 用于安全凭证,并且该层不受版本控制,因此它只是安装附近服务器上的一个文件,并且可能也包含安装名称("production" 或 "development" 等)。

这种分层配置意味着您将始终知道谁更改了什么,您将知道当前发布了哪个修订版,并且如果遇到麻烦,您可以回滚任何更改(甚至自动回滚)。

(凭据存储除外,但几乎不会改变,您确实有备份,不是吗?)

日志记录和日志分析也是您操作的一部分,您的应用程序不应该隐藏问题(尝试捕获所有内容),但它应该有一个内置的异常处理程序,记录有关问题的所有必要细节,并帮助您来查找问题。

例如,如果您的软件 运行 在脚本语言的自托管环境中,您可以直接从版本控制软件进行部署。当出现异常时,您可以分析堆栈跟踪(如果需要,可以实时分析),检查发生在哪个文件的哪一行,并使用 vcs 工具的注释功能来跟踪开发人员的最后一次更改,修订(提交) ,甚至是基于提交消息的问题跟踪系统中的票证。

这样智能系统可以: - 实时通知负责最后更改的开发人员(这并不总是 his/her 错误,但他或她拥有最新信息,因此如果必须的话,他们将以最快的速度将问题追踪到其他开发人员) - 另外,如果你有异常,你可能会得到 200 个相同的原因,所以你可以将它们收集在一起。 (不同的日期源文件行 :))。

你也想在上线前测试这些吗?您将需要一个与真实环境具有几乎相同设置的暂存环境,然后您将需要一个滚动更新系统来逐步发布新版本。您也可以自动执行此操作,滚动更新仅在没有已知问题时进行。

我确信像 gmail 这样的服务也会跟踪响应时间,所以如果 2.1 版本的响应时间比 2.0 版本长 20%,他们也会将其视为失败,升级推出甚至会停止如果用户甚至没有注意到这个问题。

基本思想是,你应该在尝试处理所有数据之前存储它们(即使你的系统崩溃也能够恢复),然后你应该存储一些指标用于分析,编写防御性代码来处理每个可能的故障场景(测试所有内容),然后自动收集这些报告。

您还应该为您的 api 构建一个客户端(将其提供给您的付费客户使用您的 api 是很好的),并且通过该客户端您可以监控所有服务一天轮。