mtk 调试工具 调试节点_节点应用程序测试和调试指南

mtk 调试工具 调试节点

《测试和调试节点应用程序指南》摘自曼宁的《 Node.js in Action》第二版 。 本书在第二版中经过了全面修订,可指导您完成构建生产质量的Node应用程序所需的所有功能,技术和概念。

功能测试节点应用

在大多数Web开发项目中,功能测试是通过驱动浏览器,然后针对特定于用户的需求列表检查各种DOM转换而进行的。 假设您正在构建内容管理系统。 图像库上载功能的功能测试将上载图像,检查其是否已添加,然后检查其是否已添加到相应的图像列表中。

用于功能测试Node应用程序的工具的选择令人困惑。 从高层次将它们分为两大类:无头测试和基于浏览器的测试。 无头测试通常使用PhantomJS之类的东西来提供终端友好的浏览器环境,但是较轻的解决方案使用诸如Cheerio和JSDOM之类的库。 基于浏览器的测试使用诸如Selenium之类的浏览器自动化工具,该工具可让您编写驱动真实浏览器的脚本。 两种方法都可以使用相同的基础Node测试工具,并且可以使用Mocha,Jasmine甚至Cucumber来针对应用程序驱动Selenium。

使用浏览器自动化测试节点

Selenium

Selenium是一个流行的基于Java的浏览器自动化库,可用于测试Node应用程序。 借助特定于语言的驱动程序,您可以连接到Selenium服务器并针对真实的浏览器运行测试。 在本文中,您将学习如何使用Web DriverIO (Node Selenium驱动程序)。

运行Selenium比纯Node测试库要难得多,因为您需要安装Java并下载Selenium JAR文件。 首先, 为您的操作系统下载Java ,然后转到Selenium下载站点下载JAR文件。 然后,您可以像这样运行Selenium服务器:

java -jar selenium-server-standalone-3.4.0.jar

请注意,您的确切Selenium版本可能有所不同。 您可能还必须提供浏览器二进制文件的路径。 例如,在将Firefox设置为browserName的Windows 10中,您可以指定Firefox的完整路径,如下所示:

java -jar -Dwebdriver.firefox.driver="C:\path\to\firefox.exe" selenium-server-standalone-3.4.0.jar

或者,您可能需要下载mozilla的Gecko驱动程序(将其与selenium可执行文件放置在同一文件夹中,然后按以下方式启动它:

java -jar -Dwebdriver.gecko.driver=geckodriver selenium-server-standalone-3.4.0.jar

确切路径取决于您计算机上如何安装Firefox。 有关Firefox驱动程序的更多信息,请阅读SeleniumHQ文档 。 您可以找到以类似方式配置的Chrome和Microsoft Edge驱动程序。

现在,在运行Selenium服务器的情况下,创建一个新的Node项目并安装WebdriverIO:

mkdir -p selenium/test/specs
cd selenium
npm init -y
npm install --save-dev webdriverio
npm install --save express

WebdriverIO带有友好的配置文件生成器。 要运行它,请运行wdio config:

./node_modules/.bin/wdio config

遵循问题并接受默认设置。 它看起来应该像这样:

测试节点-运行wdio配置

使用wdio命令更新package.json文件,以允许使用npm test运行测试:

"scripts": {
  "test": "wdio wdio.conf.js"
},

现在添加一些测试。 一个基本的Express服务器就足够了。 该示例在随后的清单中用于测试。 将此清单另存为index.js

const express = require('express');
const app = express();
const port = process.env.PORT || 4000;

app.get('/', (req, res) => {
  res.send(`
<html>
  <head>
    <title>My to-do list</title>
  </head>
  <body>
    <h1>Welcome to my awesome to-do list</h1>
  </body>
</html>
  `);
});

app.listen(port, () => {
  console.log('Running on port', port);
});

上面的代码片段使用ES2015。 如果您想复习一下,请查看SitePoint的课程“ 跳入ES2015”

WebdriverIO的优点在于,它提供了一个简单,流畅的API以编写Selenium测试。 语法清晰易学-您甚至可以使用CSS选择器编写测试。 下一个清单(位于test/specs/todo-test.js )显示了一个简单的测试,该测试设置了WebdriverIO客户端,然后检查页面上的标题。

const assert = require('assert');
const webdriverio = require('webdriverio');

describe('todo tests', () => {
  let client;

  before(() => {
    client = webdriverio.remote();
    return client.init();
  });

  it('todo list test', () => {
    return client
      .url('http://localhost:4000')
      .getTitle()
      .then(title => assert.equal(title, 'My to-do list'));
  });
});

连接WebdriverIO后,您可以使用客户端实例从应用程序中获取页面。 然后,您可以在浏览器中查询文档的当前状态-本示例使用getTitle从文档的头部获取title元素。 如果要在文档中查询CSS元素,则可以改用.elements 。 存在几种用于处理文档,表单甚至cookie的方法。

该测试可以针对Node Web应用运行真实的浏览器。 要运行它,请在端口4000上启动服务器:

PORT=4000 node index.js

免费学习PHP!

全面介绍PHP和MySQL,从而实现服务器端编程的飞跃。

原价$ 11.95 您的完全免费

然后输入npm test 。 您应该看到Firefox已打开,并且测试在命令行中运行。 如果要使用Chrome,请打开wdio.conf.js并更改browserName属性。

使用Selenium进行更高级的测试

如果您使用WebdriverIO和Selenium来测试使用诸如React或Angular之类的更复杂的Web应用程序,则需要检查实用程序方法。 有些方法会暂停测试,直到某些元素可用为止,这对于可异步渲染文档的React应用程序非常有用,它会根据远程数据的可用时间对其进行多次更新。 查看waitFor*方法,例如waitForVisible,以了解更多信息。

如果您想了解有关这种测试的更多信息,请查看Nightwatch.jsJavaScript功能测试。

处理失败的测试

当您在进行已建立的项目时,测试会开始失败。 Node提供了多种工具,可以详细了解失败的测试。 让我们谈谈如何丰富调试失败的测试时生成的输出。

测试失败时要做的第一件事是生成更详细的日志输出。 下一节将演示如何使用NODE_DEBUG

获取更详细的日志

当测试失败时,获取有关程序运行情况的信息很有用。 Node有两种方法可以做到这一点:一种用于Node的内部,另一种用于npm模块。 要调试Node的核心模块,请使用NODE_DEBUG

使用NODE_DEBUG

要查看NODE_DEBUG的工作原理,想象一下您在一个深层嵌套的文件系统调用中忘记了使用回调。 例如,以下示例引发异常:

const fs = require('fs');

function deeplyNested() {
fs.readFile('/');
}

deeplyNested();

堆栈跟踪仅显示有关该异常的有限数量的详细信息,并且不包括异常起源的调用站点上的完整信息:

fs.js:60
    throw err;  // Forgot a callback but don't know where? Use NODE_DEBUG=fs
      ^

Error: EISDIR: illegal operation on a directory, read
    at Error (native)

没有有用的注释,许多程序员会看到这样的痕迹,并且将Node归咎于无用的错误。 但是,正如注释所指出的那样,可以使用NODE_DEBUG=fs来获取有关fs模块的更多信息。 像这样运行脚本:

NODE_DEBUG=fs node node-debug-example.js

现在,您将看到更详细的跟踪,可帮助调试问题:

fs.js:53
    throw backtrace;
        ^

Error: EISDIR: illegal operation on a directory, read
    at rethrow (fs.js:48:21)
    at maybeCallback (fs.js:66:42)
    at Object.fs.readFile (fs.js:227:18)
    at deeplyNested (node-debug-example.js:4:6)
    at Object.<anonymous> (node-debug-example.js:7:1)
    at Module._compile (module.js:435:26)
    at Object.Module._extensions..js (module.js:442:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:311:12)
    at Function.Module.runMain (module.js:467:10)

从此跟踪可以清楚地看出问题出在我们的文件中,该文件位于第7行最初在第4行调用的函数中。这使调试使用核心模块的任何代码变得更加容易,并且包括文件系统和网络库,例如节点的HTTP客户端和服务器模块。

使用调试

DEBUGNODE_DEBUG的公共替代方法。 npm上的许多软件包都在寻找DEBUG环境变量。 它模仿NODE_DEBUG使用的参数样式,允许您指定要调试的模块列表或使用DEBUG='*'查看所有模块。

测试节点-使用DEBUG ='*'运行Express应用程序

如果要将NODE_DEBUG功能合并到自己的项目中,请使用内置的util.debuglog方法

const debuglog = require('util').debuglog('example');
debuglog('You can only see these messages by setting NODE_DEBUG=example!');

要制作使用DEBUG配置的自定义调试记录器,您需要使用npm](https://www.npmjs.com/package/debug)中的调试包。 您可以根据需要创建任意数量的记录器。 假设您正在构建一个MVC Web应用程序。 您可以为模型,视图和控制器创建单独的记录器。 然后,当测试失败时,您将能够指定调试应用程序特定部分所必需的调试日志。 下面的清单演示了如何使用调试模块。

const debugViews = require('debug')('debug-example:views');
const debugModels = require('debug')('debug-example:models');

debugViews('Example view message');
debugModels('Example model message');

要运行此示例并查看视图日志,请将DEBUG设置为debug-example:views ,就像这样DEBUG=debug-example:views node index.js

调试日志记录的最后一项功能是,您可以在调试部分的前面加上连字符,以将其从日志中删除:

DEBUG='* -debug-example:views' node index.js

隐藏某些模块意味着您仍然可以使用通配符,但是从输出中忽略不需要的部分或嘈杂的部分。

获得更好的堆栈跟踪

如果您使用的是异步操作,并且其中包括您使用异步回调或Promise编写的所有内容,那么当堆栈跟踪不够详细时,您可能会遇到问题。 在这种情况下,npm上的软件包可以为您提供帮助。 例如,当回调异步运行时,Node不会在操作排队时保留调用堆栈。 为了测试这一点,请创建两个文件,一个名为async.js ,它定义一个异步函数,另一个称为index.js ,它需要async.js

此代码段称为aync.js

module.exports = () => {
  setTimeout(() => {
    throw new Error();
  })
};

而且index.js需要使用async.js

require('./async.js')();

现在,如果将index.jsnode index.js index.js一起运行,您将获得简短的堆栈跟踪,该跟踪不显示失败函数的调用方,而仅显示抛出异常的位置:

throw new Error();
    ^

Error
    at null._onTimeout (async.js:3:11)
    at Timer.listOnTimeout (timers.js:92:15)

要改进此报告,请安装跟踪软件包并使用node -r trace index.js运行它。 -r标志告诉Node在加载其他任何内容之前需要trace模块。

堆栈跟踪的另一个问题是它们可能太详细了。 当跟踪中包含有关Node内部细节的详细信息时,就会发生这种情况。 要清除堆栈跟踪,请使用clarify 。 同样,您可以使用-r标志运行它:

$ node -r clarify index.js
    throw new Error();
    ^

Error
    at null._onTimeout (async.js:3:11)

如果要在Web应用程序的错误警报电子邮件中包括堆栈跟踪,则Clarify特别有用。
如果您正在运行供Node中的浏览器使用的代码(可能是同构Web应用程序的一部分),则可以使用source-map-support获得更好的堆栈跟踪。 可以使用-r来运行,但是它也可以与某些测试框架一起使用:

node -r source-map-support/register index.js
mocha --require source-map-support/register index.js

下次您要处理由异步代码生成的堆栈跟踪时,请寻找诸如trace和澄清之类的工具,以确保您充分利用V8和Node所提供的功能。

摘要

所以你有它。 在本文中,我们研究了使用Selenium进行功能测试的Node应用程序,以及处理失败测试的一些技巧。 如果您喜欢本文,则可以访问本书的主页,并免费下载《 Node.js in Action,第二版》的第一章或购买整本书。

翻译自: https://www.sitepoint.com/testing-node-applications/

mtk 调试工具 调试节点

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值