【问题标题】:Test environment beside practical environment for nodejs applicationsnodejs应用程序的实际环境之外的测试环境
【发布时间】:2018-06-03 05:45:50
【问题描述】:

在我问之前,我已经搜索了很多,并且有很多关于它的文章。但我的问题有点深。 我有一个使用 Nodejs Expressjs + MongoDB + Reddit + PM2 集群模式 + 比特币和卡逍遥游 + API 系统的应用程序。

我的问题是当我在实模式下开发这个应用程序时,它真的很糟糕。有时我会在代码中发布少量更新,然后按“pm2 log”它会显示一些语法错误或其他错误,我会尝试修复它并再次发布。在此期间,拥有许多用户的应用程序已关闭。

另外,我不得不说像比特币支付这样的东西,需要真正的测试。需要来自区块链的请求和响应。我怎样才能有一个测试环境,我可以测试与实模式完全相同的所有内容,然后如果一切正常,然后将其部署到实模式?

一个易于编码和测试然后易于部署的环境? Mocha 能准确地帮助我满足我的需要吗?我正在使用 PM2 集群模式。

【问题讨论】:

  • 这个话题太宽泛了。将其拆分为许多较小的主题。
  • 主要是关于文本环境与真实环境一模一样。
  • @Zlatko 你能帮我拆分它以获得解决方案吗?

标签: node.js mongodb express pm2


【解决方案1】:

您的问题不是一个适当的问题,而是一个问题层,有些是基于意见的,有些过于宽泛而无法回答。但是让我们试着分解一下。

所述问题是when I'm developing this application in real mode.... I release updates ... it shows me syntax error... application is down。我会读它,因为主要问题是您正在生产环境中开发。让我们暂时忘记这种做法是多么糟糕,让我们专注于一些有建设性的事情。

让我们定义粗略的步骤。

  1. 生活环境

最紧迫的问题似乎是您在开发实时应用程序,而在开发期间崩溃它意味着您的用户也会崩溃它。让我们来处理它。

  • 立即更改所有访问代码、密钥、用户名和密码,以便将它们存储在环境文件中(加密和备份是安全的,但不能在源代码中提交),例如 environment-prod.env
  • 然后为您使用的所有服务创建第二组凭据。对于 MongoDB,例如这很简单,只需创建一个本地数据库实例,例如 test_database。对于 Reddit,创建第二个应用程序,例如将其命名为 my-app-test。某些服务可能会选择在应用中创建一组 test 凭据,而其他服务则只需一个应用用于测试,一个用于生产。
  • 创建一个新的环境文件,例如test-environment.env,具有所有相同的键(例如 REDDIT_APPID、REDDIT_SECRET、MONGODB_URL、BLOCKCHAIN_GATEWAY_KEY 等),但具有新值。

现在,首先,您有一个测试环境。做一个别名,例如alias dev="cd $HOME/projects/my-reddit-bitcoin-app && source test-environment.env"。每天你来开发应用程序,输入dev,然后你就可以启动pm2等并在开发环境中安全地工作。您的用户永远不会看到您的崩溃。

仅当您确定已完成新功能或错误修复时,切换环境 (source environment-production.env),然后将新应用程序部署到运行它的服务器,然后 pm2 重新启动或用于这些部署的任何内容。在重新处理代码之前立即切换回测试环境。

详细了解如何分离测试/生产环境。阅读一些关于 git 工作流的内容(例如,从最新的 master 分支到 feature-branch 或 bugfix 分支,在测试时,将其合并回来。然后将其标记为“release-”并部署到生产中。然后尽可能自动化所有这些。 )

  1. 测试

Mocha 非常适合运行 Node/Express 应用程序的测试。重要的是测试。

你说bitcoin payment....Needs request and response。让我们看看如何做到这一点。

  • 将 [nock])(https://www.npmjs.com/package/nock) 添加到您的应用 (npm i -D nock)。
  • 导入它并将其放在测试文件的顶部。例如。在 some-test.spec.js 文件的顶部:

    const nock = require('nock')

  • 开始记录请求,例如将此添加到应用程序的 before() 块中:

    describe('My tests', function () { before(function () { nock.recorder.rec(); }); // ... tests

  • 现在,一次运行一项测试(例如,编写一项测试,从您的应用中执行一项特定任务)并检查控制台中的内容。例如。如果您发出请求 (request.post('http://reddit.com/api/submit', jsonData)),当测试运行时,您将看到 nock 在控制台中打印准确的响应(以 JSON 格式)。将其复制到测试文件中,例如把它放在底部:

    var testResponse = <whatever was in the console in json format. Or string, whatever>. // homework is to find out why var and not const, if this is at the end of the file.

  • 现在停止记录器(将其注释掉),并在您的实际测试中运行它:

    const pipe = nock('http://www.example.com') .get('/resource') .reply(200, testResponse);

  • 为您的所有请求执行此操作。

现在您拥有的是一个测试设置,因此当您更改代码时,它不应该针对真正的 Reddit api 或真正的支付网关 api 运行,而是获得您的模拟响应。将它与一些好的断言配对,你应该没问题。确保你嘲笑一切。如果您添加新类型的请求,请务必记录它们,并将它们添加到您的程序中。

现在,这一切都非常模糊。广阔。只是一种方法。漫长的过程。可能不是最好的。不适合您的具体情况。但它应该让你开始。一步一步地拿这些东西,如果你遇到困难,回到 Stackoverflow。但是一定要开始努力,因为从长远来看,您当前的方法似乎是不可持续的。

【讨论】:

  • 非常感谢并感谢您的精彩回答。我现在开始并做了一些很酷的事情。但我并没有完全得到与以下内容相关的部分:“alias dev="cd $HOME/projects/my-reddit-bitcoin-app && source test-environment.env"”和“environment-prod.env”!!你的意思是在 PM2 中?
  • 嗯,不是真的。在运行 pm2 之前,您需要设置 env 文件以供它使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-12
  • 2020-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-23
相关资源
最近更新 更多