在测试领域,检查单个功能与测试整个应用程序端到端是不同的。虽然两者同样重要,但测试每个功能(也称为单元)是必要的,以确保应用程序中的每个函数都按预期执行。这就是单元测试的作用。
截至2022年,98%的网站使用JavaScript作为客户端编程语言,这显示了它的日益流行。
由于JavaScript或JS是一种流行且不断发展的用于开发Web应用程序的编程语言,因此有必要了解如何在JavaScript中执行单元测试。本文将探讨如何执行这些测试,这些测试应该在哪里运行以及为什么。
什么是单元测试?
单元测试验证系统中软件单元的行为。它验证称为“单元”的代码库的小而孤立的部分是否按照开发人员的意图行为。
单元测试通过将其实际行为与完全隔离的预期行为进行比较,验证应用程序的最小部分或组件。
在这里,“完全隔离”意味着在单元测试期间,开发人员不会将应用程序与外部依赖项(例如数据库,文件系统或HTTP服务)连接起来。
这使得单元测试快速和稳定,因为它们不会因为与那些外部服务集成的问题而失败。
- 不要测试系统接口或第3方库
例如以下函数:
function getLocation() { return window.location }
为什么编写单元测试?
通常,开发人员首先编写单元测试,然后编写软件代码。这种方法称为测试驱动开发(TDD)。
在TDD中,将需求转化为具体的测试用例,然后改进软件以通过新测试。
在单元测试的情况下,它允许在不影响其他单元或软件功能的情况下修改代码。这使得开发人员的工作更加容易,因为在此阶段很容易定位错误,从而节省时间和金钱。
此外,在单元测试环境中,产品的各个模块相互隔离并具有自己的责任区域。
在这种情况下,测试更可靠,因为它们在一个封闭的环境中运行。由于可靠性,代码也变得可靠。
除了上述事实,让我们探讨单元测试的各种好处。
单元测试的好处
- 单元测试的主要优点是它们的锐利关注点。由于它们测试单个功能,它们提供精确的反馈。如果单元测试失败,在大多数情况下,测试人员可以确定正在测试的特定功能是问题所在。
- 单元测试有助于快速轻松地查找和修复错误。
- 单元测试有助于提高代码质量。
- 单元测试有助于改善应用程序架构。
- 单元测试充当文档。
- 单元测试也以其速度而闻名。由于它们快速,它们经常执行,成为几乎持续提供有价值反馈的来源。
创建单元测试的最佳实践
创建单元测试时应遵循以下最佳实践:
- 测试应该快速简单,这意味着开发人员需要以更高的速度运行测试用例,因为它服务于单元测试的目的。如果它们很慢,开发人员将不会像应该那样经常运行测试用例。此外,单元测试用例越简单,测试结果越准确。
- 测试用例不重复实现逻辑。
- 测试用例应该是确定性的-只要它们的代码不变,就表现出相同的行为。
- QAs必须在真实的浏览器和设备上执行测试,而不是在仿真器和模拟器上执行测试,以保持测试的确定性。如果没有接触实际的生产环境(真实的,功能真实的设备),测试结果将远远不确定或准确。
- 为测试用例采用有影响力的命名约定
JavaScript单元测试框架
JavaScript单元测试是一种方法,在其中为Web页面或应用程序模块编写JavaScript测试代码。
然后将其与HTML作为内联事件处理程序组合,并在浏览器中执行,以测试所有功能是否按预期工作。然后将这些单元测试组织在测试套件中。
以下JavaScript测试框架有助于在JavaScript中进行单元测试。它们如下:
Unit.js
一个用于JavaScript的断言库,在Node.js和浏览器上运行。它与任何测试运行器和单元测试框架(如Mocha,Jasmine,Karma,protractor(用于Angular应用程序的E2E测试框架),QUnit等)一起使用。
Mocha
Mocha是一个测试框架,既可以在Node.js中运行,也可以在浏览器中运行。该框架通过串行运行测试使异步测试变得简单。Mocha测试串行运行,允许灵活和准确的报告,同时将未捕获的异常映射到正确的测试用例。它提供对所有浏览器的支持,包括无头Chrome库,并方便开发人员编写测试用例。
- Jest
它是一个基于JavaScript构建的开源测试框架,主要设计用于与基于React和React Native的Web应用程序一起使用。通常,当在任何软件的前端运行单元测试时,它们并不是非常有用。这主要是因为前端的单元测试需要广泛的,耗时的配置。使用Jest框架可以大大减少这种复杂性。
- Jasmine
Jasmine是一种流行的JavaScript行为驱动开发框架,用于单元测试JavaScript应用程序。它提供了运行同步和异步代码的自动化测试的实用程序。它也非常有利于前端测试。
- Karma
Karma是一个基于节点的测试工具,允许您在多个浏览器中测试JavaScript代码。它使测试驱动开发变得快速,有趣和容易,并在技术上被称为测试运行器。
- Cypress
Cypress框架是基于Mocha构建的基于JavaScript的端到端测试框架-一个功能丰富的JavaScript测试框架,可在浏览器中运行异步测试,使其变得简单和方便。在Cypress中进行单元测试甚至不需要运行Web服务器。这使得Cypress成为测试旨在在浏览器中使用的JS / TS库的理想工具。
- NightwatchJS
Nightwatch.js框架是基于Selenium的测试自动化框架,用Node.js编写,并使用W3C WebDriver API(以前是Selenium WebDriver)。它使用与WebDriver服务器(例如ChromeDriver或Selenium Server)通信的restful HTTP API。协议由W3C WebDriver规范定义,该规范源自JSON Wire协议。
编写测试用例
编写测试用例时,应遵循以下最佳实践:
- 对测试用例采用有影响力的命名约定
- 测试用例应该具有最简单可测试的单元功能,并尽可能独立于其他代码
- 在测试用例中涵盖功能的正常和边缘情况
- 使用断言库对测试结果进行验证
参考链接:
JavaScript Unit Testing Tutorial | BrowserStack
test-driven development (TDD)
Best Practices for Unit Testing
Front End Testing: A Beginner's Guide | BrowserStack
Front End Testing: A Beginner's Guide | BrowserStackJest vs Mocha vs Jasmine
版权归原作者 benchi_de_chaoge 所有, 如有侵权,请联系我们删除。