测试 node.js网站_在2018年测试Node.js

news/2024/5/20 23:01:28/文章来源:https://blog.csdn.net/dfsgwe1231/article/details/107268687

测试 node.js网站

流为300亿以上的最终用户提供数据源。 在所有这些用户都依赖我们的基础架构的情况下,我们非常乐意测试投入生产的所有产品。 我们的主要代码库是用Go编写的,剩下的是Python。

我们最近的展示应用程序Winds 2.0是使用Node.js构建的,我们很快了解到我们在Go和Python中常用的测试方法不太适合。 此外,由于我们使用的框架不提供任何类型的内置测试功能,因此创建适当的测试套件需要在Node.js中进行一些前期工作。

无论您使用哪种语言,建立一个良好的测试框架都可能很棘手。 在本文中,我们将揭露使用Node.js进行测试的难点,以及我们决定在Winds 2.0中使用的各种工具,并为正确的方向指明何时编写下一组测试的时间。

为什么测试如此重要

我们所有人都对生产做出了糟糕的承诺,并面临后果。 发生这不是一件有趣的事情。 编写可靠的测试套件不仅是一个很好的健全性检查,而且还使您可以完全重构代码,并确信自己的代码库仍可正常运行。 如果您刚刚启动,这尤其重要。

如果您与团队一起工作,那么拥有测试覆盖面就非常重要。 没有它,团队中的其他开发人员几乎不可能知道他们的贡献是否会导致重大变化(哎呀)。

编写测试还可以鼓励您和您的团队成员将代码分成更小的部分。 这样可以更轻松地理解您的代码,并一路修正错误。 由于您尽早发现了错误,因此生产率的提高甚至更大。

最后,如果没有测试,您的代码库可能就是纸牌屋。 几乎没有确定性的代码是稳定的。

坚硬的零件

我认为,我们在Winds中遇到的大多数测试问题都是Node.js特有的。 生态系统一直在增长。 例如,如果您在macOS上并运行“ brew upgrade”(安装了Homebrew),则看到Node.js新版本的机会非常高。 随着Node.js的快速发展和库的紧随其后,很难及时了解最新的库。

以下是立即想到的一些痛点:

  1. 在Node.js中进行测试是非常自以为是的,同时又不受质疑。 对于如何构建和衡量成功的测试基础架构,许多人有不同的看法。 可悲的是,关于如何进行测试还没有黄金标准。
  2. 在您的应用程序中可以使用大量框架。 但是,它们通常很小,没有明确定义的配置或启动过程。 这会导致非常常见但难以诊断的副作用。 因此,您可能最终会从头开始编写自己的测试运行程序。
  3. 几乎可以保证,您将需要编写自己的测试运行器(我们将在几分钟内完成)。

上面列出的情况并不理想,这是Node.js社区需要尽早解决而不是后来解决的问题。 如果其他语言已经弄清楚了,我认为现在是时候让Node.js(一种被广泛采用的语言)也弄清楚了。

编写自己的测试运行器

所以......你可能想知道一个测试运行什么。 老实说,它并不复杂。 测试运行程序是测试套件中最高的组件。 它允许您指定全局配置和环境以及导入夹具。 有人会认为这很容易做到……对吗? 没那么快…

我们了解到,尽管那里有大量的测试框架,但没有一个适用于Node.js的框架可以提供一种统一的方式来构建测试运行器。 可悲的是,这取决于开发人员。 以下是对测试跑步者的要求的快速细分:

  • 能够加载不同的配置(例如,本地,测试,开发),并确保从不加载生产配置-您可以猜测发生这种情况时出了什么问题。
  • 使用虚拟数据提升数据库并进行播种以进行测试。 为此,这必须适用于各种数据库,无论是MySQL,PostgreSQL,MongoDB还是任何其他数据库。
  • 能够加载夹具(带有种子数据的文件以在开发环境中进行测试)。

对于Winds,我们选择使用Mocha作为测试运行程序。 Mocha通过命令行工具(与Babel集成)提供了一种简单的编程方式来在ES6代码库上运行测试。

为了开始测试,我们自己注册了Babel模块加载器。 这使我们可以更好地控制Babel在覆盖Node.js模块加载过程之前导入哪些模块,从而使我们有机会在运行任何测试之前模拟模块。

此外,我们还使用Mocha的测试运行器功能将HTTP处理程序预分配给特定请求。 我们这样做是因为在测试过程中未运行正常的初始化代码(服务器交互由Chai HTTP插件模拟),并且运行了一些安全检查以确保我们未连接到生产数据库。

尽管这不是测试运行程序的一部分,但是拥有夹具装载器是我们测试套件的重要组成部分。 我们研究了现有的解决方案; 但是,我们决定编写自己的帮助程序,以便根据我们的要求进行定制。 通过我们的解决方案,我们可以在手工生成或编写夹具时遵循简单的临时约定来加载具有复杂数据相关性的夹具。

风工具

尽管该过程很麻烦,但我们能够找到适当的工具和框架之间的平衡,以使适当的测试成为我们后端API的现实。 这是我们选择使用的:

摩卡咖啡

Mocha被描述为“在Node.js上运行的功能丰富JavaScript测试框架”,是我们直接选择的工具。 我们拥有超过1万5千颗星,许多支持者,赞助商和贡献者,我们知道这是工作的正确框架。

柴🥃

接下来是我们的断言库。 我们选择采用传统方法,这是最适合Mocha- Chai的方法 。 Chai是Node.js的BDD和TDD断言库。 通过简单的API,Chai可以轻松集成到我们的应用程序中,并允许我们轻松声明我们应该期望的内容 从Winds API返回。 最棒的是,Chai对写作测试感到很自然。 这是一个简短的示例:

诗乃🧙

凭借与任何单元测试框架一起使用的能力, Sinn是我们首选的模拟库。 同样,通过最少的设置即可实现超级干净的集成,Sinn将模拟请求变成了一个简单的过程。 他们的网站拥有极其友好的用户体验,并提供了简便的步骤将Sinon与您的测试套件集成在一起。

ock

对于所有外部HTTP请求,我们使用nock ,它是一个健壮的HTTP模拟库,在您必须与第三方API(例如Stream的REST API )进行通信时,它确实非常有用。 除了它在功能上令人赞叹之外,关于这个小库没有太多可说的了,这就是我们喜欢它的原因。 这是我们为Stream调用个性化引擎的简单示例:

模拟要求🎩

模拟要求库允许依赖外部代码。 在一行代码中,您可以替换模块,并且当某些代码尝试导入该模块时,mock-require将介入。 这是一个小型且简约但强大的库,我们是忠实的拥护者。

伊斯坦布尔🔭

Istanbul是一个JavaScript代码覆盖率工具,可通过模块加载器挂钩计算语句,行,函数和分支的覆盖率,以在运行测试时透明地添加覆盖率。 尽管我们在CodeCov中具有类似的功能(请参阅下一节),但是在本地运行测试时,这是一个不错的工具。

最终结果-工作测试

使用所有库,包括上面提到的测试运行器,让我们看一下完整的测试是什么样的(您可以在 此处 查看我们的整个测试套件 ):

持续集成

有很多持续集成服务可用,但是我们喜欢使用Travis CI,因为它们和我们一样热爱开源环境。 鉴于Winds是开源的,因此非常适合。

我们的集成非常简单-我们有一个.travis.yml文件,该文件可以设置环境并通过简单的npm命令启动测试。 覆盖范围会报告给GitHub,在那里我们可以清楚地了解我们最新的代码库或PR是否通过了我们的测试。 GitHub集成很棒,因为无需我们去Travis CI查看结果就可以看到它。 下面是查看PR时GitHub的屏幕截图(经过测试):

除了Travis CI外,我们还使用一个称为CodeCov的工具。 CodeCov与Istanbul类似,但是,它是一个可视化工具,使我们能够轻松查看代码覆盖率,文件更改,行修改以及其他各种优点。 尽管无需使用CodeCov即可可视化这些数据,但是将所有内容都集中在一个位置很高兴。

我们学到了什么

在开发测试套件的整个过程中,我们学到了很多东西。 由于没有“正确”的处理方式,我们决定通过对可用库进行排序来建立并创建自己的测试流程,以找到可以添加到我们工具箱中的库。

我们最终了解到,在Node.js中进行测试并不像听起来那样简单。 希望随着Node.js的不断发展,社区将团结起来,建立一个坚如磐石的库,以“正确”的方式处理所有与测试相关的事情。

在此之前,我们将继续使用我们的测试套件,该套件在Winds GitHub存储库上是开源的。

局限性

没有简单的方法来创建夹具

框架和语言(例如Python的Django)具有创建固定装置的简便方法。 例如,使用Django,您可以使用以下命令通过将数据转储到文件中来自动创建固定装置:

以下命令会将整个数据库转储到db.json文件中:
./manage.py dumpdata> db.json

以下命令将仅转储django admin.logentry表中的内容
./manage.py dumpdata admin.logentry> logentry.json

以下命令将转储django auth.user表中的内容:
./manage.py dumpdata auth.user> user.json

在Node.js中没有简单的方法来创建固定装置。 我们最终要做的是使用MongoDB Compass并从那里导出JSON。 如此产生的效果很好,如下所示(但是,这是一个繁琐的过程,容易出错):

使用Babel,模拟模块和Mocha Test-Runner时模块加载不直观

为了支持更广泛的节点版本并可以访问Javascript标准的最新添加,我们使用Babel将我们的ES6代码库转换为ES5。 Node.js模块系统基于CommonJS标准,而ES6模块系统具有不同的语义。

Babel在Node.js模块系统的顶部模拟了ES6模块的语义,但是由于我们通过使用模拟需求干扰了模块的加载,因此我们正着手探索奇怪的模块加载极端情况,这似乎很不直观,并可能导致多种情况。整个代码库中导入,初始化和使用的模块的独立版本。 这会使测试期间的模拟和全局状态管理变得复杂。

在使用ES6模块时无法模拟模块中使用的功能

当模块导出多个函数,而一个函数调用另一个函数时,就无法模拟模块内部正在使用的函数。 原因是,当您需要一个ES6模块时,会看到与该模块内部使用的一组独立的引用。 重新绑定引用以指向新值的任何尝试都不会真正影响模块内的代码,因为它将继续使用原始功能。

最后的想法

测试Node.js应用程序是一个复杂的过程,因为生态系统一直在发展。 掌握最新,最出色的工具非常重要,这样您就不会落后。

如今,JavaScript相关新闻的媒体太多,很难与所有新闻保持同步。 遵循诸如JavaScript Weekly和Node Weekly这样的电子邮件新闻通讯是一个好的开始。 除此之外,加入像/ r / node这样的subreddit是一个好主意。 如果您想掌握最新趋势,那么JS State可以在帮助开发人员可视化测试世界中的趋势方面做得很好。

最后,这是我最喜欢的几个博客,其中经常弹出文章:

  • 黑客正午
  • 免费代码营
  • 点点滴滴

认为我错过了重要的事情吗? 在评论中或在Twitter上让我知道– @NickParsons 。

另外,如果您想查看Stream,请在我们的网站上进行5分钟的精彩教程。 在这里试一下 。

翻译自: https://hackernoon.com/testing-node-js-in-2018-10a04dd77391

测试 node.js网站

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_728128.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大型网站技术架构(五)网站高可用架构

2019独角兽企业重金招聘Python工程师标准>>> 网站的可用性(Avaliability)描述网站可有效访问的特性。 1、网站可用性的度量与考核 网站不可用时间(故障时间)故障修复时间点-故障发现(报告)时间点…

跟我一起数据挖掘(20)——网站日志挖掘

收集web日志的目的 Web日志挖掘是指采用数据挖掘技术,对站点用户访问Web服务器过程中产生的日志数据进行分析处理,从而发现Web用户的访问模式和兴趣爱好等,这些信息对站点建设潜在有用的可理解的未知信息和知识,用于分析站点的被访…

Shell脚本——批量检测网站是否异常并邮件通知

批量检测网站是否异常脚本 检测网站运行是否正常,如果不能正常访问,发送邮件通知管理员 curl -o /de/dev/null -s -w "%{http_code}" www.baidu.com 结果演示 访问失败,也又可能和网络等等原因有关。 所以我们要进行次数判断&a…

超级好用的解析JSON数据的网站

超级好用的解析JSON数据的网站 网址 http://json.parser.online.fr/beta/ 效果图 测试数据 {"city":{"id":1816670,"name":"Beijing","coord":{"lon":116.397232,"lat":39.907501},"country"…

网站input及textarea提示文字的样式及功能模块总结

coding表单的过程中,经常会遇到input及textarea的部分,而这两种标签几乎都伴随着框内提示文字的情况,如果把每处需要做提示的地方都做一套样式及脚本的话,又不利于网站的代码共用,并且调整起来也十分费力,所…

[置顶]大型网站技术架构(七)网站的可扩展性架构

扩展性是指对现有系统影响最小的情况下,系统功能可持续扩展或提升的能力。 设计网站可扩展架构的核心思想是模块化,并在此基础上,降低模块间的耦合性,提供模块的复用性。模块通过分布式部署,独立的模块部署在独立的服务…

nginx 安装ssl 网站证书的方法

安装ssl网站证书: 现在https越来越主流,如果SSL证书没有配置好,每次访问的时候浏览器就会报错,说你这是一个不安全的网站云云,我也花了很多时间来研究所谓“自颁证书”,很麻烦而且也没法彻底解决&#xff…

react开发h5移动网站_适用于移动应用程序开发人员的5个最佳React本机课程

react开发h5移动网站Ugur Akdemir的 “手持银色iPhone 6的人”在Unsplash上 如果您是一个网络开发人员,希望进入庞大的移动应用程序开发世界,但又不想花时间学习Java或Kotlin进行Android开发,或者不想花Objective C或Swift进行iOS开发&#x…

页面点击体验优化神器Ptengine Heatmap让你拥有完美网站

如果内容是国王,设计就是城堡。好的网页设计不仅仅要让观众对你的产品或服务内容感兴趣而且还要能产生高的转化率。很多设计师认为他们有很聪明的想法来设计ui,但是没有真实的用户体验来告诉你用户需要什么,你怎么能知道你的设计是最好的&…

网站集成QQ登录功能

原文:网站集成QQ登录功能最近在做一个项目时,客户要求网站能够集成QQ登录的功能,以前没做过这方面的开发,于是去QQ的开放平台官网研究了一下相关资料,经过自己的艰苦探索,终于实现了集成QQ登录的功能,现在把…

你好,我们在自己的服务器上做好了一个网站运行很正常,用FTP工具传到万网的云虚拟主机上后台文本里的内容无法添加怎么回事...

你好,我们在自己的服务器上做好了一个网站后台文本类可以添加运行很正常,用FTP工具传到万网的云虚拟主机上后台文本里的内容无法添加怎么回事

大型网站架构之JAVA中间件

中间件就是在大型网站中,帮助各子模块间实现互相访问,消息共享或统一访问等功能的软件产品。常见的有: 远程服务框架中间件:主要解决各子模块之间互相访问的问题。 消息队列中间件:主要解决各子模之间消息共享的问题。…

印度软件开发人员_印度独角兽网站开发人员访谈

印度软件开发人员与印度最大的金融科技公司之一的开发人员进行的信息丰富的问答环节。 最近,我有机会采访了该国最大的初创公司之一的开发人员Abhinav Pandey 。 Abhinav喜欢整天编写Node.js API和数据库争执。 阅读这篇文章,以找到他对那些希望与年轻的…

印度独角兽网站开发人员访谈

与印度最大的金融科技公司之一的开发人员进行的信息丰富的问答环节。 最近,我有机会采访了该国最大的创业公司之一的开发人员Abhinav Pandey 。 Abhinav喜欢整天编写Node.js API并与数据库纠缠。 阅读本文,以找到他对那些希望磨练自己的技能并在大公司工…

编程爱好者网站_6个爱好编程者可以参与以促进放松

编程爱好者网站Pexels.com 编程可能会令人兴奋,也可能会带来压力。 作为程序员,您在计算机前花费了大量时间。 为了减轻压力和放松,您可以参加以下六个爱好,这将有助于您放松。 1.上音乐课 学习演奏乐器既轻松又有益。 这将有助…

在Google Cloud Storage上托管免费的静态网站

本指南将引导您设置免费存储桶,以使用Google Cloud Platform服务通过自定义域名为静态网站提供服务。 登录到Google Cloud Platform,导航到Cloud DNS服务并创建一个新的公共DNS区域: 默认情况下,它将具有一个NS (名称服…

php zblog 侧边栏样式_wordpress网站模板开发中,怎样给侧边栏,添加热门标签?...

使用过wordpress网站的朋友都知道,wordpress的tag标签是非常受欢迎的,尤其受到百度这样的搜索引擎的青睐。我就记得,我第一个wordpress网站,新发表的文章还没有被百度收录,而这篇文章的tag标签却被收录,而且…

深度学习去燥学习编码_5个免费的网站来学习编码

深度学习去燥学习编码最初发布于KnowLab 编码很重要,而且很有趣。 编程是那些追求它的人的礼物。 好吧,编码对于我们的日常生活至关重要。 它提高了解决问题的能力,使您有信心仅用编码语言即可构建所需的任何东西。 这是一份不断奉献的礼物&a…

5个免费的网站来学习编码

最初发布于KnowLab 编码很重要,而且很有趣。 编程是那些追求它的人的礼物。 好吧,编码对于我们的日常生活至关重要。 它提高了解决问题的能力,使您有信心仅用编码语言即可构建任何所需的东西。 这是一份不断奉献的礼物,因为它是在…