• 0
  • 0
分享

  测试代码是确保代码稳定的第一步。能做到这一点的最佳方法之一就是使用单元测试,确保应用程序中的每个较小的功能都按应有的方式运行——尤其是当应用程序接收到极端或无效输入,甚至可能有害的输入时。

  为什么要进行单元测试?

  进行单元测试有许多不同的方法,一些主要目的是:

  验证功能:单元测试确保代码做正确的事情并且不做任何不应该做的事情——大多数错误发生在这里。

  防止代码回归:当我们发现错误时,添加单元测试来检查场景可以防止代码更改在将来重新引入错误。

  记录代码:通过正确的单元测试,一套完整的测试和结果提供了应用程序应该如何工作的规范。

  保护您的应用程序:单元测试可以检查可利用的漏洞(例如启用恶意 SQL 注入的漏洞)。

  范围界定和编写单元测试

  使用单元测试框架使我们能够快速编写和自动化我们的测试,并将它们集成到我们的开发和部署过程中。这些框架通常支持前端和后端 JavaScript 代码的测试。

  以下是帮助你编写性能单元测试和可测试代码的一些通用指南。

  保持单元测试简短而简单

  不要编写过重的单元测试,测试应该只有几行代码来检查应用程序的简短功能块。

  考虑正面和负面的测试用例

  虽然编写正确执行函数的测试是有用的,但是,编写更广泛的测试集来检查函数在被滥用或在极端情况下是否正确或者失败同样重要。这些负面测试可能更有价值,因为它们有助于预测意外情况,例如函数何时应引发异常或应如何处理接收格式错误的数据。

  分解长而复杂的函数

  包含大量逻辑的大型函数难以测试;包含太多操作则难以有效地测试每个变量。如果函数太复杂,请将其拆分为较小的函数以进行单独测试。

  避免网络和数据库连接

  单元测试应该是快速和轻量级的,但是进行网络调用或连接到其他应用程序或进程的功能需要长时间才能执行。这使得同时运行多个操作变得具有挑战性,且会产生更脆弱的代码。你可以在单元测试中调用模拟的网络或数据库而非真实地连接网络。而如果要进行包含真实的网络和数据库连接的测试,应当在称为集成测试(所有的单元或模块被组合在一起并作为一个整体进行测试)中进行而不是单元测试。

  如何编写单元测试

  我们已经回顾了一些单元测试的最佳实践,现在准备好用 JavaScript 编写你的第一个单元测试了。

  本教程使用 Mocha 框架 —— 最流行的单元测试之一。每个测试框架都略有不同,但它们足够相似,学习基本概念将使你能够轻松地在它们之间切换。

  在开始前,请确保你的电脑上安装了 Node.js 环境。

  创建一个新项目

  首先打开一个终端窗口或命令提示符到一个新的项目文件夹。然后,通过以下命令在其中创建一个新的 Node.js 项目。

  npm init -y

  这会在文件夹中创建一个文件 package.json ,使你能够使用 npm install?-D?mocha 命令来安装 mocha 框架。

  接下来,在代码编辑器中打开 package.json 文件并将 test script 替换为:mocha

    "scripts": {
      "test": "mocha"
    },

  实现一个类

  接下来,编写一个简单的红绿灯系统进行单元测试。

  在项目目录中,创建一个名为 traffic.js文件,其中是一个 TrafficLight 的类:

  class TrafficLight {
      constructor() {
          this.lightIndex = 0;
      }
      static get colors() {
          return [ "green", "yellow", "red" ];
      }
      get light() {
          return TrafficLight.colors[ this.lightIndex ];
      }
      next() {
          this.lightIndex++;
          // This is intentionally wrong!
          if( this.lightIndex > TrafficLight.colors.length ) {
              this.lightIndex = 0;
          }
      }
  }
  module.exports = TrafficLight;

  这个类由四部分组成:

  ·TrafficLight.colors:交通灯颜色的常量属性。

  · lightIndex:一个变量,跟踪当前交通灯颜色的索引。

  · light:以字符串形式返回当前交通灯颜色的类属性。

  · next():将红绿灯更改为下一个灯光颜色的功能。

  配置和添加我们的第一个单元测试

  现在是时候围绕代码添加一些单元测试了。

  在项目中创建一个名为 test 的目录,这是 Mocha 默认检查单元测试的地方。然后,在新的测试文件夹中添加一个名为 traffic.test.js 的文件。

  接下来,在文件顶部导入 TrafficLight 类:

  const TrafficLight = require( "../traffic" );

  我们还将使用该 assert 模块进行测试,因此在你的代码中需要引入它:

  const assert = require( "assert" );

  在 Mocha 中我们可以使用 describe() 这个函数将单元测试进行分组集合,如下:

  describe( "TrafficLight", function () {
  });

  然后,我们将创建一些单元测试来验证他们自己的子组中的交通颜色:

  describe( "TrafficLight", function () {
      describe( "colors", function () {
      });
  });

  对于第一个单元测试,我们可以验证 colors 只有三种状态:绿色、黄色和红色。测试方式是使用 describe() 组内的 it() 函数定义的,因此编写测试如下:

  describe( "TrafficLight", function () {
      describe( "colors", function () {
          it( "has 3 states", function () {
              const traffic = new TrafficLight();
              assert.equal( 3, TrafficLight.colors.length );
          });
      });
  });

  现在让我们运行单元测试,看看它是否通过。

  在终端窗口中运行 npm test,如果一切正确,Mocha 会打印出单元测试运行的结果。

2-1.jpg

  添加更多单元测试

  我们的项目现在已准备好运行单元测试,因此我们可以添加更多测试以确保我们的代码正常工作。

  首先,向colors组中添加一个单元测试,以验证红绿灯颜色是否正确且有序。这是实现此测试的一种方法:

  it( "colors are in order", function () {
      const expectedLightOrder = [ "green", "yellow", "red" ];
      const traffic = new TrafficLight();
      for( let i = 0; i < expectedLightOrder.length; i++ ) {
          assert.equal( expectedLightOrder[ i ], TrafficLight.colors[ i ] );
      }
  });

  其次,测试next()方法看它是否正确地改变了交通信号灯。创建一个新的子组并添加两个单元测试:一个检查灯光是否以正确的顺序变化,另一个检查灯光是否能循环在红灯之后变为绿灯:

  describe( "next()", function () {
      it( "changes lights in order", function () {
          const traffic = new TrafficLight();
          for( let i = 0; i < TrafficLight.colors.length; i++ ) 
              assert.equal( traffic.light, TrafficLight.colors[ i ] );
              traffic.next();
          }
      });
      it( "loops back to green", function () {
          const traffic = new TrafficLight();
          // Change the light 3x to go from green -> yellow -> red -> green
          for( let i = 0; i < 3; i++ ) {
              traffic.next();
          }
          assert.equal( traffic.light, TrafficLight.colors[ 0 ] );
      });
  });

  现在,当我们重新运行测试时,我们会看到其中一个测试失败了。这是因为 TrafficLight 类中有一个错误。

2-2.jpg

  修复错误

  为方便调试本例提前注明好的错误代码位置,我们再次打开 TrafficLight 类并找到 next() 函数内的这句注释:// This is intentionally wrong!。

  从单元测试中我们知道这个函数没有正确地循环回 green,我们可以看到代码是在判断lightIndex值超过交通灯颜色的数量时给索引设置了0,这显然是不对的,我们必须在值达到确切的颜色数时立即将索引修改为0:

  // This is intentionally wrong!
  if( this.lightIndex === TrafficLight.colors.length ) {
      this.lightIndex = 0;
  }

  现在你所有的单元测试都应该通过了。而这带来的好处是即使TrafficLight这个类被重构或大量修改,我们的单元测试也会在它到达用户之前捕获这个错误。

2-3.jpg

  最后

  单元测试易于设置,是软件开发的有效工具。它们有助于及早消除错误并防止它们重现。这使项目更易于管理和维护,即使它们变得更大更复杂——尤其是在大型开发团队中。像这样的自动化测试还使开发人员能够重构和优化他们的代码,而不必担心新代码的行为是否正确。

  单元测试是开发过程的关键部分,对于帮助你构建更好、更安全的 JavaScript 应用程序至关重要。祝测试愉快!


作者:茶无味的一天    

来源:http://www.51testing.com/html/58/n-7793958.html

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   之前我们讲过,测试工程师的4层技术发展路线都需要掌握哪些技能。学而优则仕,今天我们来说说如果想做某个行业的专家应该掌握哪些技能。  如果你对测试技术不感兴趣,但对某领域的业务兴趣浓厚,可以考虑行业专家路线。  由于测试工程师对产品和业务很熟悉,成为专业的产品经理和业务专家,而且目前很多公司在Beta测试时需要专门的业务工程师或业务专家参与测试。  且配置管理和质量管理也是软件测试工程师职业的一个发展方向:测试工程师——业务测试专家/测试咨询专家/用户体验专家/产品设计专家/软件质量管理专家/项目经理。  晋升方法  大厂  如果你是在大厂,了解公司相关晋升制度,寻求晋升机会,与领导或人力资...
            0 0 445
            分享
          • fiddler抓包原理注意:Fiddler是以代理web服务器的形式工作的,它使用代理地址:127.0.0.1,端口:8888。当Fiddler退出的时候它会自动注销,这样就不会影响别的程序。不过如果Fiddler非正常退出,这时候因为Fiddler没有自动注销,会造成网页无法访问。解决的办法是重新启动下Fiddler。配置打开FiddlerTool->FiddlerOptions->HTTPS。(配置完后记得要重启Fiddler)。选中"DecrptHTTPStraffic",Fiddler就可以截获HTTPS请求,第一次会弹出证书安装提示,若没有弹出提示,勾...
            10 11 4543
            分享
          • 想做一个小游戏玩玩,飞行的小鸟,简单好玩,尝试看看。用python做游戏的话,就得要用到pygame这个模块了。先简单介绍一下pygame吧。 pygame是一个利用SDL库(全名Simple DirectMedia Layer)写就的游戏库。安装好python3环境以后,可以用pip3 install pygame命令来安装pygame。pygame有很多的模块,我们这个游戏会用到以下模块: pygame:主模块,一些通用的控制 pygame.display:用来访问显示设备 pygame.draw:绘制形状,线和点 pygame.rec...
            3 0 2230
            分享
          •   前言  性能测试用例主要分为预期目标用户测试、用户并发测试、疲劳强度与大数据量测试、网络性能测试、服务器性能测试五大部分。  具体编写用例时要根据实际情况去进行,遵守低成本、策略为中心,裁减、完善模型,具体化等原则。  Web性能测试模型提出的主要依据是:一种类型的性能测试可以在某些条件下转化成为另外一种类型的性能测试,这些类型的性能测试的实施是有着相似之处的。  预期指标的性能测试  系统在需求分析和设计阶段都会提出一些性能指标,完成这些指标的相关的测试是性能测试的首要工作之一,这些指标主要诸于:系统可以支持并发用户200个,系统响应时间不得超过20秒等。  对这种预先承诺的性能要求,需...
            0 0 774
            分享
          • 1、概述随着web应用的增多,新的模式解决方案中以web为核心的应用也越来越多,很多公司各种应用的架构都以B/S及web应用为主,但是有关WEB测试方面的内容并没有相应的总结,所以我在这里对web的测试方法和采用的测试技术进行总结,便于内部交流。测试方法尽量涵盖web程序的各个方面,测试技术方面在继承传统测试技术的技术上结合web应用的特点。相关的测试和实现技术也有着很大的关系,由于本公司使用J2EE体系,也许例子中只有JAVA平台可以使用,.NET平台测试技术暂时不涉及,如果你有请与我联系。2、测试方法说明:测试方法的选择取决你的测试策略。一般的web测试和以往的应用程序的测试的侧重点不完全...
            15 15 2942
            分享
      • 51testing软件测试圈微信