bun 单元测试

bun test

Bun 附带了一个快速、内置、兼容 Jest 的测试运行程序。测试使用 Bun 运行时执行,并支持以下功能。

  • TypeScript 和 JSX
  • 生命周期 hooks
  • 快照测试
  • UI 和 DOM 测试
  • 使用 --watch 的监视模式
  • 使用 --preload 预加载脚本

Bun 旨在与 Jest 兼容,但并非所有内容都已实现。若要跟踪兼容性,请参阅此跟踪问题。

运行测试

bun test

测试是用 JavaScript 或 TypeScript 编写的,带有类似 Jest 的 API。有关完整文档,请参阅编写测试。

// main.test.tsimport { expect, test } from "bun:test";test("2 + 2", () => {expect(2 + 2).toBe(4);
});

运行器以递归方式在工作目录中搜索与以下模式匹配的文件:

  • *.test.{js|jsx|ts|tsx}
  • *_test.{js|jsx|ts|tsx}
  • *.spec.{js|jsx|ts|tsx}
  • *_spec.{js|jsx|ts|tsx}

您可以通过将其他位置参数传递给 bun test 来过滤要运行的测试文件集。路径与其中一个筛选器匹配的任何测试文件都将运行。通常,这些过滤器将是文件或目录名称;尚不支持 glob 模式。

bun test <filter> <filter> ...

要按测试名称进行筛选,请使用 -t/--test-name-pattern 标志。

# run all tests or test suites with "addition" in the name
bun test --test-name-pattern addition

若要在测试运行程序中运行特定文件,请确保路径以 .// 或 / 开头,以将其与筛选器名称区分开来。

bun test ./test/specific-file.test.ts

测试运行程序在单个进程中运行所有测试。它加载所有 --preload 脚本(有关详细信息,请参阅生命周期),然后运行所有测试。如果测试失败,测试运行程序将退出,并显示非零退出代码。

使用 --timeout 标志指定每个测试的超时(以毫秒为单位)。如果测试超时,它将被标记为失败。默认值为 5000

# default value is 5000
bun test --timeout 20

使用 --rerun-each 标志可多次运行每个测试。这对于检测片状或非确定性测试失败非常有用。

bun test --rerun-each 100

使用 --bail 标志在预定的测试失败次数后提前中止测试运行。默认情况下,Bun 将运行所有测试并报告所有故障,但有时在 CI 环境中,最好提前终止以减少 CPU 使用率。

# bail after 1 failure
bun test --bail# bail after 10 failure
bun test --bail 10

与 bun run 类似,您可以将 --watch 标志传递给 bun test,以监视更改并重新运行测试。

bun test --watch

生命周期 hooks

Bun 支持以下生命周期钩子:

Hook描述
beforeAll在所有测试之前运行一次。
beforeEach在每次测试之前运行。
afterEach在每次测试后运行。
afterAll在所有测试后运行一次。

这些钩子可以在测试文件中定义,也可以在预加载了 --preload 标志的单独文件中定义。

 bun test --preload ./setup.ts

有关完整文档,请参阅测试>生命周期。

Mocks

使用 bun.mock 创建 mock 函数。模拟在测试之间自动重置。

import { test, expect, mock } from "bun:test";
const random = mock(() => Math.random());test("random", () => {const val = random();expect(val).toBeGreaterThan(0);expect(random).toHaveBeenCalled();expect(random).toHaveBeenCalledTimes(1);
});

或者,您可以使用 jest.fn(),它的行为是完全相同的。

import { test, expect, jest } from "bun:test";const random = jest.fn(() => Math.random());

有关完整文档,请参阅测试>模拟。

快照测试

bun test 支持快照测试。

// example usage of toMatchSnapshot
import { test, expect } from "bun:test";test("snapshot", () => {expect({ a: 1 }).toMatchSnapshot();
});

要更新快照,请使用 --update-snapshots 标志。

bun test --update-snapshots

有关完整文档,请参阅测试>快照。

UI 和 DOM 测试

Bun 与流行的 UI 测试库兼容:

  • HappyDOM快乐DOM
  • DOM Testing LibraryDOM 测试库
  • React Testing LibraryReact 测试库

有关完整文档,请参阅测试> DOM 测试。

性能

Bun 的测试运行速度很快。

编写测试

从内置的 bun:test 模块中导入类似 Jest 的 API 来定义测试。从长远来看,Bun 旨在实现与 Jest 的完全兼容;目前,仅支持一组有限的 expect 匹配器。

基本用法

定义一个简单的测试:

// math.test.tsimport { expect, test } from "bun:test";test("2 + 2", () => {expect(2 + 2).toBe(4);
});

就像在 Jest 中一样,你可以在不导入它们的情况下使用 describe、test、expect 和其他函数。但与 Jest 不同,它们没有被注入到全局作用域中。相反,Bun 转译器会自动在内部注入一个来自 bun:test 的导入。

typeof globalThis.describe; // "undefined"
typeof describe; // "function"

这种转译器的集成仅在bun测试期间发生,并且只针对测试文件和预加载脚本。实际上,对于最终用户来说,这没有什么明显区别。

可以使用 describe 将测试分组为套件。

// main.test.tsimport { expect, test, describe } from "bun:test";describe("arithmetic", () => {test("2 + 2", () => {expect(2 + 2).toBe(4);});test("2 * 2", () => {expect(2 * 2).toBe(4);});
});

测试也可以是异步的。

import { expect, test } from "bun:test";test("2 * 2", async () => {const result = await Promise.resolve(2 * 2);expect(result).toEqual(4);
});

或者,使用 done 回调来标记完成。如果你在测试定义中将 done 回调作为一个参数包含进来,你必须调用它,否则测试将挂起。

import { expect, test } from "bun:test";test("2 * 2", done => {Promise.resolve(2 * 2).then(result => {expect(result).toEqual(4);done();});
});

可以通过给可选的第三个参数传递一个数字来指定每个测试的超时时间(以毫秒为单位)。

import { test } from "bun:test";test("wat", async () => {const data = await slowOperation();expect(data).toBe(42);
}, 500); // test must run in <500ms

test.skip

用 test.skip 跳过个别测试。这些测试将不会被运行。

import { expect, test } from "bun:test";test.skip("wat", () => {// TODO: fix thisexpect(0.1 + 0.2).toEqual(0.3);
});

test.todo

使用 test.todo 将测试标记为待办事项。这些测试将会运行,并且测试运行器会期望它们失败。如果它们通过了,那么将会提示你将它们标记为常规测试。

import { expect, test } from "bun:test";test.todo("fix this", () => {myTestFunction();
});

要仅运行标记为 todo 的测试,请使用 bun test --todo。

bun test --todo

test.only

要运行特定的测试或测试套件,请使用 test.only() 或 describe.only()。一旦声明,运行 bun test --only 将只执行被标记为 .only() 的测试/测试套件。如果在声明了 test.only() 的情况下运行 bun test 但没有使用 --only 选项,那么将执行给定套件中所有测试,直到遇到带有 .only() 的测试。在两种执行场景中,describe.only() 的功能都相同。

import { test, describe } from "bun:test";test("test #1", () => {// does not run
});test.only("test #2", () => {// runs
});describe.only("only", () => {test("test #3", () => {// runs});
});

以下命令只会执行测试 #2 和 #3。

bun test --only

以下命令会执行测试#1、#2和#3。

bun test

test.if

要条件性地运行测试,请使用 test.if()。如果条件为真值,则会运行测试。这对于仅在特定架构或操作系统上运行的测试特别有用。

test.if(Math.random() > 0.5)("runs half the time", () => {// ...
});const macOS = process.arch === "darwin";
test.if(macOS)("runs on macOS", () => {// runs if macOS
});

为了基于某些条件跳过测试,可以使用 test.skipIf() 或 describe.skipIf()。

const macOS = process.arch === "darwin";test.skipIf(macOS)("runs on non-macOS", () => {// runs if *not* macOS
});

test.each

要在测试表中为多个 case 返回一个函数,请使用test.each。

const cases = [[1, 2, 3], [3, 4, 5]];test.each(cases)("%p + %p should be %p", (a, b, expected) => {// runs once for each test case provided
})

根据标签的类型,可以对其格式进行多种设置。

%ppretty-format
%sString
%dNumber
%iInteger
%fFloating point
%jJSON
%oObject
%#Index of the test case
%%Single percent sign (%)

 匹配器

Bun 实现了以下匹配器。全面兼容 Jest 的路线图正在制定中;在这里跟踪进度。

.not
.toBe()
.toEqual()
.toBeNull()
.toBeUndefined()
.toBeNaN()
.toBeDefined()
.toBeFalsy()
.toBeTruthy()
.toContain()
.toStrictEqual()
.toThrow()
.toHaveLength()
.toHaveProperty()
.extend
.anything()
.any()
.arrayContaining()
.assertions()
.closeTo()
.hasAssertions()
.objectContaining()
.stringContaining()
.stringMatching()
.addSnapshotSerializer()
.resolves()
.rejects()
.toHaveBeenCalled()
.toHaveBeenCalledTimes()
.toHaveBeenCalledWith()
.toHaveBeenLastCalledWith()
.toHaveBeenNthCalledWith()
.toHaveReturned()
.toHaveReturnedTimes()
.toHaveReturnedWith()
.toHaveLastReturnedWith()
.toHaveNthReturnedWith()
.toBeCloseTo()
.toBeGreaterThan()
.toBeGreaterThanOrEqual()
.toBeLessThan()
.toBeLessThanOrEqual()
.toBeInstanceOf()
.toContainEqual()
.toMatch()
.toMatchObject()
.toMatchSnapshot()
.toMatchInlineSnapshot()
.toThrowErrorMatchingSnapshot()
.toThrowErrorMatchingInlineSnapshot()

生命周期钩子

测试运行器支持以下生命周期钩子。这对于加载测试装置、模拟数据和配置测试环境非常有用。

使用 beforeEach 和 afterEach 来执行每个测试的设置和拆卸逻辑。

import { beforeEach, afterEach } from "bun:test";beforeEach(() => {console.log("running test.");
});afterEach(() => {console.log("done with test.");
});

 使用 beforeAll 和 afterAll 执行每个范围的设置和拆卸逻辑。范围由定义钩子的位置决定。

将钩子范围限定为特定的 describe 块:

import { describe, beforeAll } from "bun:test";describe("test group", () => {beforeAll(() => {// setup});// tests...
});

将钩子范围限定在测试文件:

import { describe, beforeAll } from "bun:test";beforeAll(() => {// setup
});describe("test group", () => {// tests...
});

为了将整个多文件测试运行范围限定在挂钩内,请在单独的文件中定义这些挂钩。

// setup.tsimport { beforeAll, afterAll } from "bun:test";beforeAll(() => {// global setup
});afterAll(() => {// global teardown
});

然后使用 --preload 在任何测试文件之前运行设置脚本。

$ bun test --preload ./setup.ts

为了避免每次运行测试时都需要输入 “--preload”,您可以将其添加到 bunfig.toml 文件中:

[test]
preload = ["./setup.ts"]

Mocks

使用模拟函数创建模拟数据。

import { test, expect, mock } from "bun:test";
const random = mock(() => Math.random());test("random", async () => {const val = random();expect(val).toBeGreaterThan(0);expect(random).toHaveBeenCalled();expect(random).toHaveBeenCalledTimes(1);
});

另外,你也可以像Jest中那样使用 jest.fn() 函数,它的行为方式是完全一样的。

import { test, expect, jest } from "bun:test";
const random = jest.fn(() => Math.random());test("random", async () => {const val = random();expect(val).toBeGreaterThan(0);expect(random).toHaveBeenCalled();expect(random).toHaveBeenCalledTimes(1);
});

mock() 的结果是一个被添加了一些额外属性的新函数。 

import { mock } from "bun:test";
const random = mock((multiplier: number) => multiplier * Math.random());random(2);
random(10);random.mock.calls;
// [[ 2 ], [ 10 ]]random.mock.results;
//  [
//    { type: "return", value: 0.6533907460954099 },
//    { type: "return", value: 0.6452713933037312 }
//  ]

以下属性和方法在模拟函数上实现。

mockFn.getMockName()

mockFn.mock.calls

mockFn.mock.results

mockFn.mock.instances

mockFn.mock.contexts

mockFn.mock.lastCall

mockFn.mockClear()

mockFn.mockReset()

mockFn.mockRestore()

mockFn.mockImplementation(fn)

mockFn.mockImplementationOnce(fn)

mockFn.mockName(name)

mockFn.mockReturnThis()

mockFn.mockReturnValue(value)

mockFn.mockReturnValueOnce(value)

mockFn.mockResolvedValue(value)

mockFn.mockResolvedValueOnce(value)

mockFn.mockRejectedValue(value)

mockFn.mockRejectedValueOnce(value)

mockFn.withImplementation(fn, callback)

.spyOn()

可以使用SpyOn()创建一个Spy来跟踪对函数的调用,而无需将其替换为模拟函数。这些Spy可以传递给.toHaveBeenCalled()和.toHaveBeenCalledTimes()。

import { test, expect, spyOn } from "bun:test";const ringo = {name: "Ringo",sayHi() {console.log(`Hello I'm ${this.name}`);},
};const spy = spyOn(ringo, "sayHi");test("spyon", () => {expect(spy).toHaveBeenCalledTimes(0);ringo.sayHi();expect(spy).toHaveBeenCalledTimes(1);
});

 mock.module

模块模拟允许你覆盖一个模块的行为。使用 mock.module(path: string, callback: () => Object) 来模拟一个模块。

import { test, expect, mock } from "bun:test";mock.module("./module", () => {return {foo: "bar",};
});test("mock.module", async () => {const esm = await import("./module");expect(esm.foo).toBe("bar");const cjs = require("./module");expect(cjs.foo).toBe("bar");
});

像 Bun 的其余部分一样,模块 mocks 同时支持import和require。

覆盖已导入的模块

如果你需要覆盖一个已经被导入的模块,你不需要做什么特别的事情。只需要调用 mock.module(),模块就会被覆盖。

import { test, expect, mock } from "bun:test";// The module we're going to mock is here:
import { foo } from "./module";test("mock.module", async () => {const cjs = require("./module");expect(foo).toBe("bar");expect(cjs.foo).toBe("bar");// We update it here:mock.module("./module", () => {return {foo: "baz",};});// And the live bindings are updated.expect(foo).toBe("baz");// The module is also updated for CJS.expect(cjs.foo).toBe("baz");
});
提升和预加载

如果你需要在导入模块之前确保对其进行模拟,你应该使用 --preload 在运行测试之前加载你的模拟。

// my-preload.ts
import { mock } from "bun:test";mock.module("./module", () => {return {foo: "bar",};
});
bun test --preload ./my-preload

你可以在 bunfig.toml 文件中添加 preload:

[test]
# Load these modules before running tests.
preload = ["./my-preload"]

如果我 mock 一个已经被导入的模块,会发生什么?

如果你 mock 一个已经被导入的模块,该模块将在模块缓存中被更新。这意味着任何导入该模块的模块都将获得被 mock 的版本,但原始模块仍然会被评估。这意味着原始模块的任何副作用仍然会发生。

如果你想防止原始模块被评估,你应该在测试运行前使用 --preload 来加载你的模拟模块。

__mocks__目录和自动模拟 

目前尚不支持自动模拟。如果这阻止了你切换到Bun,请提交一个issue。

实现细节

模块模拟对 ESM 和 CommonJS 模块有不同的实现。对于ES模块,我们在 JavaScriptCore 中添加了补丁,允许 Bun 在运行时覆盖导出值并递归更新实时绑定。

从 Bun v1.0.19 开始,Bun会自动解析 mock.module() 中的规范参数,就像你进行了导入一样。如果解析成功,那么解析后的规范字符串将用作模块缓存中的键。这意味着你可以使用相对路径、绝对路径甚至模块名称。如果规范未解析,则使用原始规范作为模块缓存中的键。

解析后,被模拟的模块将存储在ES模块注册表和 CommonJS require 缓存中。这意味着你可以对模拟模块交替使用import和require。

回调函数是惰性调用的,只有当模块被导入或要求时才会调用。这意味着你可以使用mock.module()来模拟尚不存在的模块,而且你还可以使用mock.module()来模拟其他模块导入的模块。

日期和时间

bun:test 允许你在测试中更改时间。

这可以与以下任一项一起使用:

  • Date.now
  • new Date()
  • new Intl.DateTimeFormat().format()

计时器目前暂不支持,但可能在 Bun 的未来版本中支持。

setSystemTime

要更改系统时间,请使用 setSystemTime:

import { setSystemTime, beforeAll, test, expect } from "bun:test";beforeAll(() => {setSystemTime(new Date("2020-01-01T00:00:00.000Z"));
});test("it is 2020", () => {expect(new Date().getFullYear()).toBe(2020);
});

为了支持使用 Jest 的 useFakeTimers 和 useRealTimers 的进行测试,可以使用 useFakeTimers 和 useRealTimers:

test("just like in jest", () => {jest.useFakeTimers();jest.setSystemTime(new Date("2020-01-01T00:00:00.000Z"));expect(new Date().getFullYear()).toBe(2020);jest.useRealTimers();expect(new Date().getFullYear()).toBeGreaterThan(2020);
});test("unlike in jest", () => {const OriginalDate = Date;jest.useFakeTimers();if (typeof Bun === "undefined") {// In Jest, the Date constructor changes// That can cause all sorts of bugs because suddenly Date !== Date before the test.expect(Date).not.toBe(OriginalDate);expect(Date.now).not.toBe(OriginalDate.now);} else {// In bun:test, Date constructor does not change when you useFakeTimersexpect(Date).toBe(OriginalDate);expect(Date.now).toBe(OriginalDate.now);}
});

计时器 - 请注意,我们尚未实现用于模拟计时器的内置支持,但这在规划之中。

重置系统时间

要重置系统时间,不向 setSystemTime 传递任何参数:

import { setSystemTime, expect, test } from "bun:test";test("it was 2020, for a moment.", () => {// Set it to something!setSystemTime(new Date("2020-01-01T00:00:00.000Z"));expect(new Date().getFullYear()).toBe(2020);// reset it!setSystemTime();expect(new Date().getFullYear()).toBeGreaterThan(2020);
});

设置时区

要更改时区,可以将 $TZ 环境变量传递给 bun test。

TZ=America/Los_Angeles bun test

或在运行时设置 process.env.TZ:

import { test, expect } from "bun:test";test("Welcome to California!", () => {process.env.TZ = "America/Los_Angeles";expect(new Date().getTimezoneOffset()).toBe(420);expect(new Intl.DateTimeFormat().resolvedOptions().timeZone).toBe("America/Los_Angeles",);
});test("Welcome to New York!", () => {// Unlike in Jest, you can set the timezone multiple times at runtime and it will work.process.env.TZ = "America/New_York";expect(new Date().getTimezoneOffset()).toBe(240);expect(new Intl.DateTimeFormat().resolvedOptions().timeZone).toBe("America/New_York",);
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/723152.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux搭建SFTP服务器

案例&#xff1a;搭建SFTP服务器 SFTP&#xff08;SSH文件传输协议&#xff09; SFTP&#xff08;SSH文件传输协议&#xff09;是一种安全的文件传输协议&#xff0c;用于在计算机之间传输文件。它基于SSH&#xff08;安全外壳协议&#xff09;的子系统&#xff0c;提供了加密的…

1908_Arm Cortex-M3的实现

1908_Arm Cortex-M3的实现 全部学习汇总&#xff1a; g_arm_cores: ARM内核的学习笔记 (gitee.com) 这是第一次看一份这样的手册&#xff0c;之前的MCU编程基本上就是专注于软件接口方面。而OS等方面的一些功能基本上都是用了现成的解决方案&#xff0c;因此也就没有过多的关注…

git合并多次提交

简介 Git是一个分布式版本控制系统&#xff0c;它允许开发人员在不同的分支上进行并行开发&#xff0c;并将这些分支合并到主分支或其他分支中。在开发过程中&#xff0c;我们经常会创建多个commit来记录每次的代码变更。有时候我们希望将这些连续的commit合并为一个更有意义的…

CSS实现选中卡片样式操作

图一默认自动选中&#xff0c;并且不可取消选中&#xff0c;当选择其他卡片才可点击下一步 在 “ src/assets ” 路径下存放 save.png&#xff0c;代表选中的状态 <div class"cards"><ul class"container"><li v-for"image in image…

【前端系列】vue

这里写目录标题 一、Vue简介1.1 主流前端框架/库简介 二、下载和安装Vue2.1 下载2.2 安装完成后&#xff0c;检查2.3创建全局安装目录和缓存日志目录2.4 为了下载包快速&#xff0c;改源为淘宝镜像2.5 查看npm配置修改是否成功 三、配置环境变量环境变量—用户变量—选中Path—…

进程间通信 --->信号灯

有名信号量: 1.创建 semget int semget(key_t key, int nsems, int semflg); 功能: 创建一组信号量 参数: key:IPC对象名 nsems:信号量的个数 semflg:IPC_CREAT 返回值: …

Vue+SpringBoot打造实验报告管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 实验管理模块2.2 实验实例模块2.3 实验批阅模块2.4 实验咨询模块 三、系统展示四、核心代码4.1 查询实验4.2 新增实验咨询4.3 回复实验咨询4.4 新增实验实例4.5 查询实验实例 五、免责说明 一、摘要 1.1 项目介绍 基于…

【学习笔记】卫星基础知识

一、什么是卫星以及它如何工作&#xff1f; 通信卫星是一种人造卫星&#xff0c;通过使用转发器在源和接收器之间中继和放大无线电电信信号。卫星的工作原理是接收从地球发送的无线电信号并将无线电信号重新发送回地球。卫星使用从大型太阳能电池阵列收集的太阳能&#xff0c;…

Java面试题【必知必会】基础(2024)

近期一直在准备面试&#xff0c;所以为了巩固知识&#xff0c;也为了梳理&#xff0c;整理了一些java的基础面试题&#xff01;同时也希望各位英雄和女侠能够补充&#xff01;不胜荣幸&#xff01;&#xff01;&#xff01; 1. Final 有什么用&#xff1f; final 的意思是最后…

HTML标签分类,web微信开发者工具

第一个阶段&#xff0c;开发环境和工具准备 浏览器 &#xff08;Google&#xff0c;FireFox&#xff0c;…&#xff09;下载&#xff0c;安装前端开发工具vscode&#xff0c;下载、安装 node、npm、webpack、webpack-cli、cnpm&#xff0c;配置前端开发环境下载、配置PHP和MyS…

计算机常用的单位以及换算

通常买电脑时候&#xff0c;或者手机的时候&#xff0c;通常会问多大内存&#xff1f; 但是实际你了解内存如何换算吗&#xff1f; 内存可以是1G&#xff0c;2G&#xff0c;4G&#xff0c;等等 首先注意&#xff0c;单位不区分大小写&#xff0c;所以1GB 1Gb 1gB都是相同的。…

Centos安装Jenkins

1、更新系统 &#xff08;1&#xff09;更新下系统 sudo yum -y update 安装用于下载java 17二进制文件的wget命令行工具 sudo yum -y install wget vim 2、卸载centos自带的jdk 由于我们安装的版本比较高&#xff0c;需要jdk17&#xff0c;卸载centos自带的jdk。用 下面的…

软件为什么要做软件测试

软件要做测试的原因在于以下几个关键点&#xff1a; 发现和修复错误&#xff1a;软件测试的首要目的是识别并修复代码中的错误、缺陷或漏洞。这些错误可能导致程序崩溃、数据丢失、功能异常等&#xff0c;影响软件的正常运行。 保证质量与可靠性&#xff1a;通过系统性的测试活…

【vue/组件封装】封装一个带条件筛选的搜索框组件(多组条件思路、可多选)详细流程

引入&#xff1a;实现一个带有筛选功能的搜索框&#xff0c;封装成组件&#xff1b; 搜索框长这样子&#xff1a; 点击右侧筛选图标后弹出层&#xff0c;长这样子&#xff1a; 实际应用中有多组筛选条件&#xff0c;这里为了举栗子就展示一组&#xff1b; 预览&#xff1a;…

POST 请求,Ajax 与 cookie

POST 请求则需要设置RequestHeader告诉后台传递内容的编码方式以及在 send 方法里传入对应的值 xhr.open("POST", url, true); xhr.setRequestHeader(("Content-Type": "application/x-www-form-urlencoded")); xhr.send("key1value1&…

07-prometheus的自定义监控-pushgateway工具组件

一、概述 pushgateway用于自定义监控节点、节点中服务的工具&#xff0c;用户可以通过自定义的命令获取数据&#xff0c;并将数据推送给pushgateway中&#xff1b; prometheus服务&#xff0c;从pushgateway中获取监控数据&#xff1b; 二、部署pushgateway 我们可以“随便”找…

微服务高性能通信技术-gRPC实战落地

在微服务架构中&#xff0c;服务之间的通信是至关重要的。为了实现高性能、低延迟和跨语言的服务间通信&#xff0c;gRPC是一个流行的选择。gRPC是一个开源的、高性能的、通用的RPC&#xff08;远程过程调用&#xff09;框架&#xff0c;基于HTTP/2协议和Protocol Buffers序列化…

Pytorch学习 day03(Tensorboard、Transforms)

Tensorboard Tensorboard能够可视化loss的变化过程&#xff0c;便于我们查看模型的训练状态&#xff0c;也能查看模型当前的输入和输出结果 在Pycharm中&#xff0c;可以通过按住ctrl&#xff0c;并左键点击某个库来进入源文件查看该库的使用方法SummaryWriter是用来向log_dir…

文件上传到oss上以及下载

<template><!-- 批量渠道变更 --><div><div style"margin-bottom: 10px; display: flex;"><Download name"下载模板" type"Url" url"https://file.wonder-link.net/%E6%89%B9%E9%87%8F%E6%B8%A0%E9%81%93%E5%8F…

140 Linux 系统编程17 ,进程组,会话,创建会话,守护进程

1. 进程组&#xff0c;也称之为作业。代表一个或多个进程的集合。 每个进程都属于一个进程组。在waitpid函数和kill函数的参数中都曾使用到。操作系统设计的进程组的概念&#xff0c;是为了简化对多个进程的管理。 当父进程&#xff0c;创建子进程的时候&#xff0c;默认子进程…