今天我们撸一撸NodeJS为我们提供的Console控制台打印输出和Assert单元测试的断言功能。
先说下Console,nodejs为我们提供的console是浏览器API中console的加强版,除了一些基础应用和浏览器用法保持一致外,它还为我们提供了更加强化的接口方法。
一、console(控制台输出)
console引不引入都可以,不引入使用的就是nodejs全局的console对象
var console=require('console');
- 基本数据类型打印
console.log()普通日志 ,console.warn()警告日志 ,console.error()错误日志用法基本一致。值得一提的是 '%s'、'%d'、'%f' 格式化输出。
//基本类型
console.log("格式化%s字符串输出","(我是被格式化的部分)");//字符串
console.warn("警告输出%d",250);//整数
console.error("错误输出%f",88.88);//浮点
执行输出:
格式化(我是被格式化的部分)字符串输出
警告输出250
错误输出88.88
- 打印多个消息
在首个参数没有格式化字符串的情况下,把多个message以逗号分隔拼接在一起输出打印。
//打印多个消息(以空格分隔)
console.log("打印多个消息以空格分隔","消息2","消息3","消息4");
console.log(2,8,15,25);
执行输出:
打印多个消息以空格分隔 消息2 消息3 消息4
2 8 15 25
- json对象类型打印
json对象打印我们可以用 '%j' 格式化输出
var student={name:"July",age:22,hasbooks:["《nodejs教程》","《webpack教程》","《vue教程》"]};
console.log("打印json对象:%j",student);
执行输出:
打印json对象:{"name":"July","age":22,"hasbooks":["《nodejs教程》","《webpack教程》","《vue教程》"]}
- JS变量打印
我们可以使用 ${变量} 的方式直接打印变量的值:
//打印变量【注意:括起来的不是单引号是键盘上~号下面那个符号】
var title="《NodeJS教程》";
var price=58.8;
console.log(`打印变量:书的标题是${title},书的价格是${price}元`);
执行输出:
打印变量:书的标题是《NodeJS教程》,书的价格是58.8元
- 分组打印
有时候我们需要输出一组log信息,nodejs为我们提供了这样的功能。可以使用 console.group("组的名称")---开始组的打印,并使用 console.groupEnd()---结束组的打印。开始和结束中打印的消息都会缩进2个空格,方便查看。
//分组打印
console.group("分组打印");
console.log("Hello1");
console.log("Hello2");
console.log("Hello3");
console.groupEnd();
执行输出:
分组打印
Hello1
Hello2
Hello3
- 自定义输出logger
我们在输出日志的时候,既需要在控制台中显示出打印的信息又要保存日志信息在本地磁盘文件中,我们可以结合nodejs提供的 fs模块,创建一个自定义的简单logger:
//自定义输出logger
const { Console } = require('console');
var fs=require("fs");
//构建本地输出log目录
var ouput=fs.createWriteStream("./info.log",);
var erroroutput=fs.createWriteStream("./error.log");
var logger=new Console(ouput,erroroutput);
//使用logger
logger.log("自定义logger输出内容");
logger.error("logger错误输出");
logger.log("追加内容2");
console.log("写入logger日志完毕");
执行后会在当前目录下创建 info.log文件和 error.log文件,并且写入log日志信息到文件中。
- 打印堆栈信息
使用 console.trace("栈信息") 来打印当前堆栈信息,这个功能很有用,我们可以输出我们自己的异常栈或消息栈。
//打印跟踪栈
tracemain();
function tracemain()
{
console.log("tracemain方法");
console.trace("跟踪栈");
}
执行输出:
Trace: 跟踪栈
tracemain方法
at tracemain (F:\Projects\nodejs\nodejstest-lession\lession7-nodejs-AssertAndConsole\console_test.js:41:13)
at Object. (F:\Projects\nodejs\nodejstest-lession\lession7-nodejs-AssertAndConsole\console_test.js:36:1)
at Module._compile (module.js:657:14)
at Object.Module._extensions..js (module.js:671:10)
at Module.load (module.js:573:32)
at tryModuleLoad (module.js:513:12)
at Function.Module._load (module.js:505:3)
at Function.Module.runMain (module.js:701:10)
at startup (bootstrap_node.js:194:16)
at bootstrap_node.js:618:3
- 打印执行时间
nodejs又一个有用的功能,使用 console.time("标记名称")---此次统计执行时间的开始标记
使用 console.timeEnd("标记名称")---此次统计执行时间的结束标记。
最终会以亚毫秒的方式输出当前执行所消耗的cpu时间。
//打印统计执行时间
workmain();
function workmain()
{
console.time("workmain方法");
var temp=0;
for(var i=0;i<10000000;i++)
{
temp+=10;
}
console.timeEnd("workmain方法");
}
执行输出:
workmain方法: 16.180ms
二、Assert(断言)
接下来我们来看nodejs提供的 assert (断言)模块,我们可以用它来做单元测试,功能测试,如果测试不通过它会抛出 AssertionError。首先还是先引入
/*断言*/
var assert=require("assert");
- assert.equal(actual,expected)一般测试
它会使用 '=='比较actual和expected两个值是否相等,如果相等执行通过,不相等则抛出 AssertionError异常并终止应用程序
//使用相等运算符(==)测试 actual 参数与 expected 参数是否相等。
assert.equal("abc","abc");//相等
console.log("---equal测试abc和abc通过");
assert.equal({ a: 1 }, { a: "1" });//不通过【两个对象!=】
执行输出:【---equal测试abc和abc通过】最后会抛出 AssertionError异常
- assert.deepEqual(actual,expected)深度测试
它会比较两个值是否相等(并且两个值都是可枚举的,如果不可枚举可以使用assert.deepStrictEqual来测试),看下面的例子和 equal的区别:
assert.deepEqual({ a: 1 }, { a: "1" });//通过
console.log("---深度测试1=='1'通过");
执行输出:【---深度测试1=='1'通过】
- assert.deepStrictEqual(actual,expected)深度严格测试
它和assert.deepEqual的区别在于 它会测试对象的原型,与assert.deepEqual()
大致相同,但有一些区别:
- 原始值使用全等运算符(
===
)比较。Set
的值与Map
的键使用 SameValueZero 比较。 - 对象的原型也使用全等运算符比较。
- 对象的类型标签要求相同。
- 比较[对象包装器][]时,其对象和里面的值要求相同。
//1组
assert.deepEqual({ a: 1 }, { a: "1" });//通过【原始值使用 '=='进行比较】
assert.deepStrictEqual({ a: 1 }, { a: "1" });//不通过【原始值使用 '==='进行比较】
//2组
//深度测试,不会抛出 AssertionError因为deepEqual只测试可枚举的自身属,new Date()属于不可枚举的
assert.deepEqual(/abc/gi,new Date());//通过
//深度严格模式测试,会比对原型
assert.deepStrictEqual(obj1,date);//不通过 因为要测试原型
以上是我们对nodejs提供的console模块和assert模块的常用功能梳理,希望大家能够喜欢。