前端单元测试的艺术:专业化策略与Vue项目高效实践指南

news2024/11/17 10:46:22

在这里插入图片描述

单元测试是软件开发中的基石,尤其对于前端领域,它为保证代码质量、提升开发效率、强化项目稳定性提供了不可或缺的支持。本文将深入剖析单元测试的核心理念,揭示其在前端开发中的独特价值,并提炼出一套专业且高效的实践策略,助力前端工程师构建坚固的测试防线,驱动项目迈向卓越。

一、单元测试的本质诠释

1. 定义与目标

单元测试,作为一种基础的软件测试手段,专注于对程序中最基本的可独立测试单元(如函数、类、组件等)进行验证。其核心宗旨在于:

  • 验证功能正确性:确保每个单元在特定输入下产生预期输出,遵循其设计规范,正确执行预定任务。
  • 隔离性测试:在与程序其余部分隔离的环境中运行,减少外部因素干扰,精确定位问题源头。
  • 提升代码质量:通过编写可测试代码,推动良好的编程风格和设计原则,降低潜在缺陷。
  • 提供文档价值:测试用例作为单元行为的详实描述,充当了代码的“活文档”,便于理解与维护。
  • 保障重构安全性:在代码结构调整过程中,单元测试充当安全网,确保改动不影响既有功能。

2. 前端单元测试的独特挑战

前端单元测试面临一些特有的挑战,包括:

  • UI交互模拟:前端组件往往涉及复杂的用户交互逻辑,需要巧妙模拟用户行为和DOM事件。
  • 外部依赖管理:前端代码常与API接口、第三方库、浏览器环境等外部资源紧密耦合,测试时需妥善隔离或模拟这些依赖。
  • 异步处理:前端开发中广泛存在的异步操作(如AJAX请求、定时器等)要求测试框架具备良好的异步支持能力。
  • 组件间通信:Vue、React等现代框架中的组件间通信(如props、context、event等)需仔细验证其正确性。

3.专业高效的前端单元测试策略

3.1. 选择合适的测试框架

选择一款契合团队技术栈、易于上手、功能完备且具有良好社区支持的测试框架至关重要。如针对React项目的Jest,Vue项目的Vue Test Utils + Jest,或是通用的Mocha、Chai等组合。框架应具备以下特质:

  • 深度渲染:能够对组件进行浅层或深层渲染,模拟真实DOM环境。
  • 断言库:提供丰富、直观的断言语句,方便验证预期结果。
  • 模拟功能:支持对函数、对象、模块等进行模拟或 spies,以隔离外部依赖。
  • 异步支持:原生支持Promise、async/await等异步模式,简化异步测试编写。
  • 性能与覆盖率报告:生成详细的测试覆盖率报告,帮助评估测试完备性,指导进一步测试工作。

3.2. 设计高质量测试用例

编写高效、有针对性的测试用例是单元测试的核心。遵循以下原则:

  • 明确测试目标:每个测试用例应聚焦于一个特定功能点或边界条件,避免过于复杂或模糊。
  • 覆盖典型场景与异常情况:不仅要测试常规路径,更要涵盖边界值、错误输入、空值等情况。
  • 遵循 Arrange-Act-Assert (AAA) 模式:组织测试用例结构清晰,先设定初始状态(Arrange),执行待测代码(Act),然后验证结果(Assert)。
  • 避免测试用例间的相互依赖:确保每个测试用例独立运行,不受其他测试影响,易于复现和调试问题。

3.3. 精细化模拟与stubbing

针对外部依赖,采取如下策略:

  • API请求模拟:利用Mock Server、Mock Service Worker (MSW) 或框架提供的Mock功能(如Jest的mockFn),模拟API响应,避免实际网络请求。
  • 第三方库模拟:使用如Sinon.js等库对第三方库进行stubbing或mocking,确保测试不受其不稳定或不可控因素影响。
  • 全局状态管理:对于Vuex、Redux等状态管理库,测试时可创建局部Store实例,精确控制状态变化,或使用库提供的测试工具进行模拟。

3.4. 强化组件间交互测试

对于组件间的通信:

  • Props验证:测试子组件接收的props是否正确,以及prop变更时子组件的响应是否符合预期。
  • 事件触发与监听:模拟触发组件事件,并验证父组件或其他监听者是否正确响应。
  • Context与Provide/Inject:针对Vue的provide/inject或React的Context API,验证上下文数据的传递与消费。

3.5. 工程化与持续集成

将单元测试融入开发流程,提升测试效率:

  • 自动化测试:配置持续集成(CI)工具(如GitHub Actions、CircleCI等),在代码提交时自动运行单元测试,及时反馈问题。
  • 代码覆盖率追踪:设定合理的覆盖率阈值,持续监控并改进测试覆盖率,确保关键代码得到有效测试。
  • 测试驱动开发(TDD):采用TDD实践,先写测试再编写业务代码,驱动设计并提前捕获问题。
  • 维护测试文档:保持测试用例与代码同步更新,作为项目文档的一部分,便于团队成员理解系统行为。

二、单元测试的关键概念

1. 测试隔离性

单元测试应尽可能只关注被测试单元的内部行为,不涉及其依赖项。为此,可能需要模拟(mocking)、存根(stubbing)或替换(spying)外部依赖,以确保测试仅针对目标代码。

2. 断言(Assertions)

断言是单元测试的核心,用于验证实际输出是否与预期相符。例如,使用expect(actual).toBe(expected)语句来判断某个函数的返回值是否等于期望值。

3. 覆盖率

覆盖率衡量测试用例对源代码的覆盖程度,通常包括行覆盖率、分支覆盖率等。虽然高覆盖率不代表测试质量一定高,但它能提供一个量化指标,帮助识别未被充分测试的代码区域。

三、前端单元测试工具与框架

  • Jest:流行的JavaScript测试框架,具有零配置、快照测试、Mock功能、并行测试等特性,支持多种断言库如expect

  • Mocha / Chai:Mocha是测试运行器,Chai是断言库,两者常搭配使用,提供灵活的测试结构和丰富的断言表达式。

  • Testing Library家族(如@testing-library/react@testing-library/vue等):专注于测试组件的使用者视角,鼓励写出更稳定、与实现细节解耦的测试。

  • Vue Test Utils / React Testing Library:专门针对Vue和React框架提供的测试实用工具,用于在测试环境中渲染和交互组件。

四、单元测试粒度

单元测试粒度是指在进行单元测试时,所针对的代码模块或逻辑片段的大小。理想的单元测试粒度应该是尽可能小,以便:

  • 精确定位问题:较小的测试粒度意味着每个测试用例只针对代码的一个非常具体且独立的部分。当测试失败时,能够迅速确定哪部分代码出现了问题,无需在大量代码中排查错误来源。

  • 高效测试:小粒度的测试通常执行速度快,因为它们不需要加载和初始化大量的相关代码。快速的测试有助于频繁运行(如在持续集成环境中),及时获取反馈,加速开发迭代。

  • 易于理解和维护:每个测试用例关注点单一,其意图和预期结果清晰明了。当代码发生变化时,只需相应更新受影响的小范围测试,降低了维护成本。

根据前面的信息和编程实践,单元测试的典型粒度包括以下几个层次:

方法级别
这是最常见的单元测试粒度。每个测试用例直接针对一个独立的方法或函数,验证其在给定输入下的输出或副作用(如数据库操作、事件触发等)。例如,在JavaScript中,测试一个计算平均数的函数,只关注该函数接收到一组数值后返回的结果是否正确。

类级别
在面向对象编程中,单元测试有时会扩展到整个类。尽管主要关注点仍然是类的各个方法,但可能会包括验证类的构造函数、静态方法、实例方法以及它们之间的交互(假设这些交互仍然在类的内部)。测试类时,通常会创建类的实例,并针对实例方法进行单独测试。

模块级别
在模块化编程环境中(如CommonJS、ES6模块),单元测试可能涵盖一个完整的模块。这里的“模块”指的是一个独立的功能单元,通常包含多个相关的函数或类。测试模块时,确保所有公开的API(包括导出的函数、类和变量)按照预期工作,同时内部逻辑得到适当隔离和测试。

尽管单元测试的理想粒度倾向于较小,但也有以下几点需要注意:

  • 避免过度测试:过于细化的测试可能导致冗余,如测试内部私有函数或过度关注实现细节,这不仅增加维护负担,也可能在代码重构时造成不必要的困扰。

  • 保持关注点分离:单元测试应关注被测试单元的业务逻辑,而非其依赖项。对于依赖的服务、数据库或其他外部资源,通常采用模拟(mocking)或存根(stubbing)技术来隔离测试环境。

  • 理解上下文:某些情况下,较大的粒度可能是合适的。例如,如果一个复杂的类或方法紧密耦合且难以合理拆分,可能需要作为一个整体进行测试。关键是确保测试能够有效验证关键业务逻辑,而不必拘泥于严格的粒度划分。

总的来说,单元测试的粒度应以能够准确、高效地验证代码行为,并在出现故障时能够快速定位问题为目标。实践中,大多数单元测试集中在方法级别,但也可能根据代码结构和项目需求适当调整到类或模块级别。关键在于保持测试的独立性、针对性和可维护性。

五、哪些代码需要单元测试

单元测试旨在确保代码的各个独立单元(如函数、方法、类、模块)在特定条件下的行为符合预期。以下是一些应进行单元测试的代码类别:

  1. 核心业务逻辑

    • 对于处理关键业务规则、算法或数据转换的代码,如财务计算、权限验证、数据过滤或格式化等,必须进行单元测试。这些逻辑直接影响系统的正确性和数据的准确性,是单元测试的重点关注对象。
  2. 公共函数和方法

    • 库、框架或服务中提供的公共API,包括那些会被多个组件或外部调用者使用的函数和方法。这些接口的稳定性对整个系统的运作至关重要,需要通过单元测试确保其功能完备、兼容性和性能符合要求。
  3. 复杂逻辑和条件分支

    • 包含多条路径、复杂条件判断或循环的代码段。这类代码容易隐藏边界条件错误、逻辑漏洞或非预期行为,通过单元测试覆盖所有可能的执行路径,确保在各种输入情况下都能正确工作。
  4. 异常处理和错误状态

    • 代码中的错误处理机制,如try-catch块、错误抛出和捕获逻辑、错误码处理等。单元测试应验证在预期的错误条件下,代码能否正确识别并妥善处理异常,不导致程序崩溃或产生不可控后果。
  5. 组件间接口

    • 在面向对象编程或微服务架构中,各组件之间的接口(如类的公共方法、服务间的API调用)应进行单元测试,确保接口契约得到遵守,数据交换格式正确,响应符合预期。
  6. 数据持久化操作

    • 与数据库、文件系统或其他持久化存储交互的代码,包括查询、插入、更新、删除等操作。单元测试应验证这些操作在各种场景下都能正确执行,不会导致数据丢失、不一致或性能瓶颈。
  7. 自定义数据结构和算法

    • 如果项目中实现了自定义的数据结构(如链表、树、图等)或算法(排序、搜索、加密等),这些代码应进行全面的单元测试,确保其基本功能、复杂度保证和边界条件处理正确无误。
  8. 第三方库或服务的封装

    • 对外部库、API或服务进行封装或适配的代码,即使这些外部资源本身已进行了测试。单元测试应确保封装层正确传递参数、处理响应、转换数据格式以及正确处理可能出现的异常情况。
  9. 重构后的代码

    • 当对已有代码进行重构时,新的实现应伴随相应的单元测试以验证其行为与原代码保持一致,防止引入新的错误或改变原有的功能。

总结来说,任何承载重要业务逻辑、对外提供接口、处理复杂条件、涉及异常处理、进行数据操作、封装外部资源,以及重构后的代码,都应纳入单元测试的范畴。通过全面、有效的单元测试,可以显著提高代码质量,降低维护成本,确保系统的稳定性和可靠性。

六、测试策略与最佳实践

  • 编写独立测试:每个测试用例应独立运行,互不影响,避免依赖于全局状态或特定执行顺序。

  • 测试边界条件:考虑正常情况之外的边界情况,如空输入、最大值、最小值、异常数据等。

  • 遵循TDD(测试驱动开发)原则:先写测试,再编写实现代码,以测试来驱动功能设计和实现。

  • 保持测试简洁:每个测试应聚焦于一个具体的预期行为,避免过于复杂或冗余的测试。

  • 及时更新测试:随着代码的迭代,确保测试用例同步更新,反映最新的业务逻辑和接口变化。

综上所述,前端单元测试是确保前端代码质量、可维护性和可靠性的重要手段。通过选择合适的测试框架、编写有针对性的测试用例,并遵循最佳实践,可以有效地构建和维护一套健全的单元测试体系。上述示例展示了使用Jest和React Testing Library对React组件进行单元测试的方法,但原理和策略同样适用于其他前端技术栈。

七、Vue项目单元测试实例

在Vue项目中,通常将页面视为由多个组件构成的整体。对一个完整的Vue页面进行全面的单元测试,实际上是针对组成该页面的所有组件进行单元测试,同时确保这些组件之间以及与页面级逻辑(如路由守卫、页面级状态管理等)的交互能够正确工作。以下是一个详细的步骤与示例:

步骤一:确定页面构成

首先,明确页面中包含哪些组件,包括顶级布局组件、主内容组件、辅助功能组件(如侧边栏、底部栏等)、嵌套子组件等。了解每个组件的功能、 Props、数据、方法、事件等。

步骤二:编写组件单元测试

为每个组件编写单元测试,遵循前面提到的针对Vue组件的全面单元测试方法。确保覆盖:

  • 组件挂载与渲染
  • Props 接收与响应
  • 数据模型(Data)
  • 计算属性(Computed)
  • 方法(Methods)
  • 生命周期钩子
  • 事件监听与触发
  • 条件与循环渲染
  • 模板指令(如 v-if, v-for, v-model 等)
  • 组件交互与状态变更
  • 依赖注入(如 Vuex Store)
  • 国际化(i18n)与主题支持(如果有)

具体请查看《Vue 组件单元测试深度探索:细致解析与实战范例大全》

步骤三:测试页面级逻辑

除了对单个组件进行测试外,还需考虑页面级别的逻辑,包括:

  • 路由相关

    • 路由参数:测试页面在不同路由参数下的渲染效果。
    • 路由守卫:确保页面在进入、离开时触发的路由守卫逻辑正确执行。
  • 页面级状态管理

    • 全局状态:如果页面依赖于全局状态(如 Vuex Store),测试当全局状态变化时,页面及其组件的响应是否正确。
    • 页面局部状态:如果页面有独立的局部状态管理(如使用 pinia),测试状态的初始化、更新以及对组件的影响。
  • 页面级事件处理

    • 全局事件监听:如果页面监听了全局事件(如通过事件总线实现的跨组件通信),测试事件触发及处理逻辑。
  • 页面级数据获取

    • 异步数据加载:测试页面初次加载时,异步获取数据的过程及数据到位后的页面渲染。
  • 页面级交互与过渡

    • 页面内导航:测试页面内部链接跳转、滚动行为等。
    • 页面过渡动画:如果页面有自定义的过渡动画,确保动画在不同状态切换时正确触发。

步骤四:集成测试

在完成所有组件和页面级逻辑的单元测试后,可以编写集成测试以验证整个页面作为一个整体的功能完整性。集成测试可以使用端到端(E2E)测试工具,如 Cypress 或 Puppeteer,模拟用户在页面上的完整交互流程,包括:

  • 页面加载:测试页面能否正常加载,初始状态是否正确。
  • 用户交互:模拟点击、填写表单、滚动等用户操作,验证页面反馈和状态变更。
  • 浏览器兼容性:如果有必要,针对不同的浏览器或版本进行兼容性测试。

示例

由于页面级的测试涉及多个组件及复杂的交互逻辑,此处仅给出一个简化的示例,假设有一个包含两个子组件(HeaderContent) 的 Page.vue 组件:

<template>
  <div>
    <Header :title="pageTitle" />
    <Content :data="pageData" />
  </div>
</template>

<script>
import Header from '@/components/Header.vue';
import Content from '@/components/Content.vue';

export default {
  components: {
    Header,
    Content,
  },
  data() {
    return {
      pageTitle: 'My Page',
      pageData: { /* ... */ },
    };
  },
  async created() {
    // 异步获取页面数据
    this.pageData = await fetchPageData();
  },
};
</script>

对应的测试文件 Page.spec.js 可能包含以下部分:

import { shallowMount } from '@vue/test-utils';
import Page from '@/views/Page.vue';
import Header from '@/components/Header.vue';
import Content from '@/components/Content.vue';
import { createMocks as createStoreMocks } from '@/store/__mocks__/store'; // 如果有Vuex

// 单独测试 Header 和 Content 组件(略)

describe('Page.vue', () => {
  let wrapper;
  let storeMocks; // 如果有Vuex

  beforeEach(() => {
    storeMocks = createStoreMocks(); // 如果有Vuex
    wrapper = shallowMount(Page, {
      global: {
        plugins: [storeMocks.store], // 如果有Vuex
      },
    });
  });

  afterEach(() => {
    wrapper.destroy();
  });

  // 测试页面级逻辑
  it('fetches page data on creation', async () => {
    // 使用 Jest 的 mock 函数替换 `fetchPageData`,验证其在 `created` 钩子中被调用
    // 并检查 `pageData` 是否正确设置
  });

  // 集成测试示例(使用 Cypress 或 Puppeteer)

  // 使用 Cypress 示例
  it('loads the page and checks component presence', () => {
    cy.visit('/my-page');

    cy.get('header').should('contain', 'My Page'); // 验证 Header 组件标题
    cy.get('main').should('exist'); // 验证 Content 组件的存在

    // ... 进一步进行页面交互和状态验证的测试
  });
});

实际项目中,针对一个完整的Vue页面进行全面的单元测试,需要结合具体的页面结构、业务逻辑和项目技术栈进行细致的规划和编写测试用例。同时,为了提升测试效率和覆盖率,可以合理运用测试金字塔原则,优先编写大量针对底层组件的单元测试,辅以适量的集成测试来验证页面级交互和流程。

综上所述,前端单元测试不仅是对代码质量的严谨把控,更是提升开发效率、保障项目稳定的重要实践。通过科学选择测试框架、精心设计测试用例、精细模拟依赖关系、强化组件间交互测试以及工程化测试流程,前端工程师可以构建一套专业且高效的单元测试体系,为项目保驾护航。

在这里插入图片描述

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

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

相关文章

闲谈工作边界

在程序员的日常工作中&#xff0c;会遇到很多边界问题。如果这些边界问题不处理好&#xff0c;会面临诸多问题。切不可忽略边界问题&#xff0c;因为这些边界很有可能是日后帮助你摆脱扯皮&#xff0c;避免被甩锅&#xff0c;甚至于好心办坏事。 那么我们来谈一下如何处理边界问…

关于螺栓的注意事项和正确操作方法——SunTorque智能扭矩系统

智能扭矩系统-智能拧紧系统-扭矩自动控制系统-SunTorque 螺栓&#xff0c;作为一种常见的紧固件&#xff0c;广泛应用于各种机械设备和结构中。在日常生活和工作中&#xff0c;我们经常需要接触到螺栓&#xff0c;因此了解螺栓的一些注意事项和正确操作方法对于确保设备的安全…

ASP.NET集成客户关系管理的企业网站的设计与开发

摘 要 企业要在激烈的市场竞争中立于不败之地&#xff0c;就必须找一种全新的管理理念和管理手段&#xff0c;对其内部和外部资源进行有效的整合。新一代ERP产品正在向客户端和供应端延伸&#xff0c;客户端的延伸即是客户关系管理。对于每个企业来说客户管理的完善程度将直接…

2024新版计算机网络视频教程65集完整版(视频+配套资料)

今日学计算机网络&#xff0c;众生皆叹难理解。 却见老师神乎其技&#xff0c;网络通畅如云烟。 协议层次纷繁复杂&#xff0c;ARP、IP、TCP、UDP。 路由器交换机相连&#xff0c;数据包穿梭无限。 网络安全重于泰山&#xff0c;防火墙、加密都来添。 恶意攻击时刻存在&#xf…

平衡二叉树、红黑树、B树、B+树

Tree 1、前言2、平衡二叉树和红黑树3、B树和B树3.1、B树的构建3.2、B树和B树的区别3.3、数据的存储方式 1、前言 本文侧重在理论方面对平衡二叉树、红黑树、B树和B树的各方面性能进行比较。不涉及编程方面的实现。而关于于平衡二叉树在C中的实现&#xff0c;我的上一篇文章平衡…

【openLooKeng-1.10.0集群环境安装部署】

openLooKeng-1.10.0集群环境安装部署 一、摘要二、正文1. 环境说明2. 集群拓扑图3. 安装过程(以root用户安装)3.1 在Coordinator和Worker两个节点都需要安装jdk1.8+3.2 在Coordinator上安装配置openLooKeng3.3 在Worker节点上进行配置openLooKeng3.4 在Coordinator节点上先启…

Oracle Analytics BIEE 操作方法(六)数据格式1:百分比

问题&#xff1a; 有如下公式&#xff0c;将数据显示为按行的百分比。此时数据显示只会有一位小数。想显示两位 解决方案 在分析中找到“高级”标签&#xff0c;将“分析XML”中内容复制出来 替换 将&#xff1a;minDigits“1” maxDigits“1” 替换为&#xff1a;minDigits…

Quarto Dashboards 教程 3:Dashboard Data Display

「写在前面」 学习一个软件最好的方法就是啃它的官方文档。本着自己学习、分享他人的态度&#xff0c;分享官方文档的中文教程。软件可能随时更新&#xff0c;建议配合官方文档一起阅读。推荐先按顺序阅读往期内容&#xff1a; 1.quarto 教程 1&#xff1a;Hello, Quarto 2.qu…

FineBi中创建自定义的图表

FineBi中增加自己的自定义图表组件,比如: 的相关笔记: 1 获取有哪些BI自定义图表组件:http://localhost:8080/webroot/decision/v5/plugin/custom/component/list?_=1713667435473[{"name": "图表DEMO_EK","chartType": "amap_demo&q…

知识付费平台的搭建重点,会用到哪些三方服务?

知识付费平台的搭建重点主要包括以下几个方面&#xff1a; 确定目标用户群体&#xff1a;首先需要明确平台的目标用户是谁&#xff0c;他们有什么样的学习需求和付费习惯。这有助于为平台制定合适的内容策略和推广策略。内容策划与制作&#xff1a;知识付费平台的核心是内容&a…

AOI在SMT生产线的关键作用

在SMT&#xff08;表面贴装技术&#xff09;的生产过程中&#xff0c;AOI&#xff08;自动光学检测&#xff09;技术发挥着不可替代的作用。通过本文&#xff0c;我们将深入探讨AOI在提升SMT生产线效率和产品质量方面的关键优势。 AOI技术在SMT生产线的核心作用 精确检测元件位…

柱形图“变个装”,跟上时尚步伐!

前言 职场中&#xff0c;日报、周报、月报、年度总结&#xff0c;都离不开图表的制作&#xff0c;而柱状图又是最常用的一种&#xff0c;怎样的柱状图&#xff0c;才能让领导更容易阅读&#xff0c;甚至是眼前一亮呢&#xff1f;今天小编就将为大家介绍一下如何借助葡萄城公司…

Nginx基本使用 反向代理与负载均衡

什么是Nginx Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器。 其特点是占有内存少&#xff0c;并发能力强&#xff0c;nginx的并发能力在同类型的网页服务器中表现较好&#xff0c;而且几乎可以做到7*24不间断运行&#xff0c;即使运行数个月也不需要重新启动。 …

JavaEE——spring MVC请求处理

目录 主要目的&#xff1a; 1. Spring web 项目搭建 2. 添加依赖 3. 配置插件 4. 配置设置类 5. 编写controller层类 6. 编写测试的http请求 主要目的&#xff1a; 创建一个spring web项目&#xff1b; 创建控制类&#xff1b; 掌握如何配置MVC&#xff1b; 编写htt…

前端调用DRI后端API出现跨域资源共享(CORS)问题解决办法

目录 1. 引言2. 跨源资源共享和实现方法3. 在Django项目中配置django-cors-headers库Reference 1. 引言 在进行后端API开发时&#xff0c;有时会遇到“跨域资源共享 (CORS) 请求…被阻止“的错误&#xff0c;如图1所示。本文讲解如何在使用DRF&#xff08;Django REST Framewo…

区块链技术与应用学习笔记(12-13节)——北大肖臻课程

目录 12.BTC-匿名性 一、什么是匿名&#xff1f; 1&#xff0c;有可能破坏比特币匿名性的两个方面 2&#xff0c;如何提高匿名性 一个比特币用户能采用什么样的方法尽量提高个人的匿名性? 分解&#xff1a; 1、网络层怎么提高匿名性? 2、应用层怎么提高匿名性? 零知…

微信小程序开发:1.微信开发者工具应用

app.json文件作用 pages 记录所有的页面路经 window 全局定义小程序样式 style v2代表使用全新样式 sitemapLocation 指名sitemap.json存放路经 Project.config.json 是项目配置文件&#xff0c;用来记录我们对小程序个性化配置 setting保存了编辑相关配置projectna…

mac 教程 终端如何拆墙

一直觉得自己写的不是技术&#xff0c;而是情怀&#xff0c;一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的&#xff0c;希望我的这条路能让你们少走弯路&#xff0c;希望我能帮你们抹去知识的蒙尘&#xff0c;希望我能帮你们理清知识的脉络&#xff0…

FFmpeg下载教程(Windows版)

文章目录 下载地址步骤 下载地址 https://ffmpeg.org/download.html 步骤

保姆级银河麒麟V10高级服务器离线安装mysql5.7数据库

离线在银河麒麟高级操作系统v10安装mysql5.7 下载mysql5.7 MySQL :: Download MySQL Community Server (Archived Versions) 2、把下载好的包上传到服务器 3、解压 [root1-0001 ~]# cd /data/mysql[root1-0001 mysql]# tar -zxvf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz…