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命令更新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客户端和服务器模块。
使用调试
DEBUG
是NODE_DEBUG
的公共替代方法。 npm上的许多软件包都在寻找DEBUG
环境变量。 它模仿NODE_DEBUG
使用的参数样式,允许您指定要调试的模块列表或使用DEBUG='*'
查看所有模块。
如果要将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.js
与node 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,第二版》的第一章或购买整本书。
mtk 调试工具 调试节点