《NodeJS开发教程7-Assert与Console》

今天我们撸一撸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.<anonymous> (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() 大致相同,但有一些区别:
  1. 原始值使用全等运算符===)比较。Set 的值与 Map 的键使用 SameValueZero 比较。
  2. 对象的原型也使用全等运算符比较。
  3. 对象的类型标签要求相同。
  4. 比较[对象包装器][]时,其对象和里面的值要求相同。
//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模块的常用功能梳理,希望大家能够喜欢。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容