Note.js框架中的cluster集群和断言测试的实战剖析

简介: Note.js框架中的cluster集群和断言测试的实战剖析

@[toc]

Cluster

节点。Js在单个线程中运行单个实例。为了使用当前的多核系统,用户(开发人员)有时会使用一个Node字符串。js进程来处理加载任务。
集群模块允许轻松创建共享服务器端口的子进程。

const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  console.log(`主进程 ${process.pid} 正在运行`);

  // 衍生工作进程。
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('exit', (worker, code, signal) => {
    console.log(`工作进程 ${worker.process.pid} 已退出`);
  });
} else {
  // 工作进程可以共享任何 TCP 连接。
  // 在本例子中,共享的是一个 HTTP 服务器。
  http.createServer((req, res) => {
    res.writeHead(200);
    res.end('你好世界\n');
  }).listen(8000);

  console.log(`工作进程 ${process.pid} 已启动`);
}

第一种方法(也是除Windows以外的所有平台的默认方法)是循环方法。主进程负责侦听端口,并在接收到新连接后将连接循环分发给工作进程。发行版中使用了一些内置技术,以防止工作进程过载。
第二种方法是主进程创建侦听套接字并将其发送给感兴趣的工作进程。工作进程负责直接接收连接。
理论上,第二种方法应该是最有效的,但在实践中,由于操作系统的不可预测的调度机制,分配将变得不稳定。我们遇到过这种情况:8个进程中有2个共享70%的负载。

worker.send

向工作进程或主进程发送消息,或发送句柄。
当主进程调用此方法时,它将向特定的工作进程发送消息。另一种等效方法是ChildProcess。
当工作进程调用此方法时,它将向主进程发送消息。另一种等效方法是过程。
工作进程将回显主进程发送的消息。

if (cluster.isMaster) {
  const worker = cluster.fork();
  worker.send('hi there');

} else if (cluster.isWorker) {
  process.on('message', (msg) => {
    process.send(msg);
  });
}

assert 断言测试

测试实际参数是否等于预期深度参数。使用相等运算符(==)比较原始值。
只测试可枚举自身属性,而不测试对象的原型、连接器或不可枚举属性(在这些情况下使用assert.deepStrictEqual())。例如,以下示例不会引发AssertionError,因为RegExp对象的属性不可枚举:

assert.deepEqual(/a/gi, new Date());

映射和集合中包含的子项也将进行测试。
还将测试子对象的可枚举属性:

const assert = require('assert');

const obj1 = {
  a: {
    b: 1
  }
};
const obj2 = {
  a: {
    b: 2
  }
};
const obj3 = {
  a: {
    b: 1
  }
};
const obj4 = Object.create(obj1);

assert.deepEqual(obj1, obj1);

assert.deepEqual(obj1, obj2);

assert.deepEqual(obj1, obj3);
assert.deepEqual(obj1, obj4);

测试通过,两个对象相等。

Buffer (缓冲)

在ECMAScript 2015(ES6)引入TypedArray之前,JavaScript语言没有读取或操作二进制数据流的机制。Buffer类作为Node Js API引入,使其能够在TCP流或文件系统操作等场景中处理二进制数据流。
TypedArray已添加到ES6中。Buffer类更优化,更适合Node。js用例的方法实现了Uint8Array API。
Buffer类的实例类似于整数数组,但Buffer的大小是固定的,物理内存分配在V8堆之外。缓冲区的大小在创建时确定,无法调整。
Buffer类位于节点J中。它是一个全局变量,因此不需要使用require('Buffer')。缓冲器
创建一个长度为 10、且用 0x1 填充的 Buffer。

const buf1 = Buffer.alloc(10);
const buf2 = Buffer.alloc(10, 1);
const buf3 = Buffer.allocUnsafe(10);

const buf4 = Buffer.from([1, 2, 3]);

const buf5 = Buffer.from('tést');
const buf6 = Buffer.from('tést', 'latin1');

创建一个长度为 10、且未初始化的 Buffer。
这个方法比调用 Buffer.alloc() 更快,
但返回的 Buffer 实例可能包含旧数据,
因此需要使用 fill() 或 write() 重写。

命令行选项

节点。Js您可以在开始时使用--zero-fill-buffers命令行选项,强制所有用户使用新的Buffer(size)和BufferallocUnsafe()、Buffer。AllocUnsafeSlow()或newSlowBuffer(大小)新分配的缓冲区实例在创建时自动填充0。使用此选项将更改这些方法的默认行为,并对性能产生重大影响。建议仅在需要强制新分配的Buffer实例不包含潜在敏感数据时使用--zero-fill-buffers选项。

$ node --zero-fill-buffers
> Buffer.allocUnsafe(5);
<Buffer 00 00 00 00 00>

输出: auffer

const buf1 = new Buffer('buffer');
const buf2 = new Buffer(buf1);

buf1[0] = 0x61;
console.log(buf1.toString());

console.log(buf2.toString());

new Buffer

分配大小为字节的新缓冲区。如果大小大于buffer.constants.MAX_LENGTH或小于0,则抛出RangeError错误。如果大小为0,将创建长度为0的缓冲区。
在Node.js 8.0.0之前,以这种方式创建的Buffer实例的底层内存未初始化。新缓冲区的内容未知,可能包含敏感数据。使用缓冲区。alloc(size)将缓冲区初始化为0。

const buf = new Buffer(10);
const buf = Buffer.alloc(11, 'aGVsbG8gd29ybGQ=', 'base64');
相关文章
|
11天前
|
人工智能 搜索推荐 数据管理
探索软件测试中的自动化测试框架选择与优化策略
本文深入探讨了在现代软件开发流程中,如何根据项目特性、团队技能和长期维护需求,精准选择合适的自动化测试框架。
58 8
|
17天前
|
人工智能 JavaScript 前端开发
自动化测试框架的演进与实践###
本文深入探讨了自动化测试框架从诞生至今的发展历程,重点分析了当前主流框架的优势与局限性,并结合实际案例,阐述了如何根据项目需求选择合适的自动化测试策略。文章还展望了未来自动化测试领域的技术趋势,为读者提供了宝贵的实践经验和前瞻性思考。 ###
|
7天前
|
Linux Shell 网络安全
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
34 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
|
12天前
|
安全 Ubuntu Linux
Metasploit Pro 4.22.6-2024111901 (Linux, Windows) - 专业渗透测试框架
Metasploit Pro 4.22.6-2024111901 (Linux, Windows) - 专业渗透测试框架
36 9
Metasploit Pro 4.22.6-2024111901 (Linux, Windows) - 专业渗透测试框架
|
16天前
|
Java 测试技术 API
探索软件测试中的自动化测试框架
本文深入探讨了自动化测试在软件开发中的重要性,并详细介绍了几种流行的自动化测试框架。通过比较它们的优缺点和适用场景,旨在为读者提供选择合适自动化测试工具的参考依据。
|
19天前
|
jenkins 测试技术 持续交付
自动化测试框架的搭建与实践
在软件开发领域,自动化测试是提升开发效率、确保软件质量的关键手段。本文将引导读者理解自动化测试的重要性,并介绍如何搭建一个基本的自动化测试框架。通过具体示例和步骤,我们将探索如何有效实施自动化测试策略,以实现软件开发流程的优化。
43 7
|
16天前
|
数据管理 jenkins 测试技术
自动化测试框架的设计与实现
在软件开发周期中,测试是确保产品质量的关键步骤。本文通过介绍自动化测试框架的设计原则、组件构成以及实现方法,旨在指导读者构建高效、可靠的自动化测试系统。文章不仅探讨了自动化测试的必要性和优势,还详细描述了框架搭建的具体步骤,包括工具选择、脚本开发、执行策略及结果分析等。此外,文章还强调了持续集成环境下自动化测试的重要性,并提供了实际案例分析,以帮助读者更好地理解和应用自动化测试框架。
|
17天前
|
监控 测试技术 定位技术
探索软件测试中的自动化测试框架选择与实施###
本文不概述传统意义上的摘要内容,而是直接以一段对话形式引入,旨在激发读者兴趣。想象一下,你是一名勇敢的探险家,面前摆满了各式各样的自动化测试工具地图,每张地图都指向未知的宝藏——高效、精准的软件测试领域。我们将一起踏上这段旅程,探讨如何根据项目特性选择合适的自动化测试框架,并分享实施过程中的关键步骤与避坑指南。 ###
28 4
|
17天前
|
敏捷开发 测试技术 持续交付
自动化测试之美:从零开始搭建你的Python测试框架
在软件开发的马拉松赛道上,自动化测试是那个能让你保持节奏、避免跌宕起伏的神奇小助手。本文将带你走进自动化测试的世界,用Python这把钥匙,解锁高效、可靠的测试框架之门。你将学会如何步步为营,构建属于自己的测试庇护所,让代码质量成为晨跑时清新的空气,而不是雾霾中的忧虑。让我们一起摆脱手动测试的繁琐枷锁,拥抱自动化带来的自由吧!
|
18天前
|
测试技术 持续交付 数据安全/隐私保护
软件测试的艺术与科学:探索自动化测试框架
在软件开发的世界中,测试是确保产品质量的关键环节。本文将深入探讨自动化测试框架的重要性和实现方法,旨在为读者揭示如何通过自动化测试提升软件测试效率和准确性。我们将从测试的基本概念出发,逐步引导读者了解自动化测试框架的设计和实施过程,以及如何选择合适的工具来支持测试活动。文章不仅提供理论知识,还将分享实用的代码示例,帮助读者将理论应用于实践。无论你是测试新手还是经验丰富的开发者,这篇文章都将为你打开一扇通往更高效、更可靠软件测试的大门。
19 1
下一篇
DataWorks