在nodejs应用程序的实际环境旁边的测试环境

时间:2017-12-20 15:51:13

标签: node.js mongodb express pm2

在我问之前,我经常搜索过很多关于它的文章。但我的问题更深一些。 我有一个应用程序使用 Nodejs Expressjs + MongoDB + Reddit + PM2集群模式+比特币和卡片逃生+ API系统

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

另外,我不得不说比特币付款,需要真正的测试。需要Blockchain的请求和回复。我怎样才能拥有一个测试环境,我可以测试与实模式完全相同的所有内容,然后如果一切正常,那么将其部署到实模式?

易于编码和测试然后易于部署的环境?摩卡可以帮我准确地提供我需要的东西吗?我正在使用PM2群集模式。

1 个答案:

答案 0 :(得分:0)

你的问题不是一个恰当的问题,而是一层问题,一些基于意见的问题,一些问题太广泛而无法回答。但是,让我们尝试将其分解。

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

让我们来定义要采取的粗略步骤。

  1. 实时环境
  2. 最迫切的问题似乎是你在使用实时应用程序,在开发期间崩溃意味着它也会为你的用户崩溃。让我们来处理。

    • 立即更改所有访问代码,密钥,用户名和密码,以便将它们存储在环境文件中(可以安全加密和备份,但不能在源代码中提交),例如environment-prod.env。< / LI>
    • 然后为您使用的所有服务创建第二组凭据。对于MongoDB,例如它很简单,只需创建一个名为test_database的本地数据库实例。对于Reddit,创建第二个应用程序,例如,将其命名为my-app-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分支到功能分支或bugfix分支,测试时将其合并。然后标记它&#34; release - &#34;并部署到生产中。然后去如果可能的话,自动完成所有这些。)

    1. 测试
    2. 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(&#39; http://reddit.com/api/submit&#39;,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。但是要开始研究它,因为从长远来看,你目前的方法似乎是不可持续的。