第27章 测试驱动开发模式:深入测试技术
写在前面
这本书是我们老板推荐过的,我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后,我突然思考,对于测试开发工程师来说,什么才更有价值呢?如何让 AI 工具更好地辅助自己写代码,或许优质的单元测试是一个切入点。 就我个人而言,这本书确实很有帮助。第一次读的时候,很多细节我都不太懂,但将书中内容应用到工作中后,我受益匪浅。比如面对一些让人抓狂的代码设计时,书里的方法能让我逐步深入理解代码的逻辑与设计。 作为一名测试开发工程师,我想把学习这本书的经验分享给大家,希望能给大家带来帮助。因为现在工作中大多使用 Python 代码,所以我把书中JAVA案例都用 Python 代码进行了改写 。
在软件开发领域,测试驱动开发(TDD)模式凭借其独特的优势,成为保障代码质量的重要手段。继前文对TDD基础模式的探讨后,本篇将深入介绍测试模式中更具体的测试技术,涵盖子测试、模拟对象、自分流等多个方面,并配以完整示例代码,帮助开发者更好地理解和应用这些技术。
子测试(Child Test)
概念与应用场景
子测试是一种将大规模测试拆解为小规模测试的技术。当编写的测试规模过大难以调试和运行时,通过编写代表该测试某部分的较小规模测试,先让这些小规模测试运行,之后再引入更大规模的测试。这在遵循“测试 - 重构 - 通过”的TDD三部曲时尤为重要,有助于在测试过程中及时发现和解决问题,避免因测试规模过大而导致的复杂性和不确定性。
示例代码
假设我们要测试一个复杂的电商订单处理系统,该系统涉及订单创建、商品库存检查、价格计算等多个功能。我们可以先对子功能进行子测试,以下是一个简化的订单价格计算子测试示例:
# 定义订单类
class Order:def __init__(self, items):self.items = itemsdef calculate_total_price(self):total = 0for item in self.items:total += item['price'] * item['quantity']return total# 子测试用例
def test_order_price_calculation():order_items = [{'name': 'Item1', 'price': 10, 'quantity': 2},{'name': 'Item2', 'price': 15, 'quantity': 1}]order = Order(order_items)result = order.calculate_total_price()assert result == 35, "Order price calculation is incorrect"
在上述代码中,test_order_price_calculation
是一个子测试,它专注于订单价格计算功能的测试,通过模拟订单商品数据,验证价格计算的正确性。
模拟对象(Mock Object)
概念与作用
模拟对象是为测试依赖于价值昂贵或构成复杂资源的对象而创建的伪版本。例如在测试涉及数据库操作的代码时,由于数据库建立耗时、数据维护复杂且可能存在远程存储等问题,通常使用模拟对象替代真实数据库。模拟对象不仅能提升测试的性能和可靠性,还增强了测试的可读性,使测试结果更易于理解和分析。
示例代码
以测试一个用户数据查询功能为例,假设该功能原本依赖于真实数据库查询,现在使用模拟对象进行测试:
# 模拟数据库类
class MockDatabase:def __init__(self):self.data = {1: {'username': 'user1', 'email': 'user1@example.com'},2: {'username': 'user2', 'email': 'user2@example.com'}}def query(self, user_id):return self.data.get(user_id)# 被测试的用户查询类
class UserQuery:def __init__(self, db):self.db = dbdef get_user(self, user_id):return self.db.query(user_id)# 测试用例
def test_user_query():mock_db = MockDatabase()user_query = UserQuery(mock_db)result = user_query.get_user(1)assert result['username'] == 'user1', "User query result is incorrect"
在这个示例中,MockDatabase
模拟了真实数据库的查询功能,UserQuery
类依赖于该模拟数据库进行用户数据查询,test_user_query
测试用例验证了查询功能的正确性。
自分流(Self Shunt)
概念与原理
自分流用于测试一个对象与另一个对象是否正常交互。通过让测试对象与测试用例自身进行交互,而非与期望的对象交互,来判断交互的正确性。这一技术可以动态地更新测试用户界面的状态,例如在测试运行、失败或测试集启动/结束时,能够感知并作出相应反应。
示例代码
以下是一个简单的自分流测试示例,用于测试一个事件监听功能:
# 结果监听器类
class ResultListener:def __init__(self):self.count = 0def start_test(self):self.count += 1# 测试用例
def test_notification():listener = ResultListener()result = "Test Result"# 模拟测试运行时通知监听器listener.start_test()assert listener.count == 1, "Notification count is incorrect"
在这个示例中,ResultListener
类作为事件监听器,test_notification
测试用例模拟了测试运行时对监听器的通知,并验证了监听器的计数是否正确。
日志字符串(Log String)
概念与用途
日志字符串用于测试被调用的消息队列是否正确。通过设置一个存储日志的字符串,在消息被调用时将记录追加在字符串后面,从而可以清晰地了解测试过程中的消息调用顺序和内容,有助于排查和解决测试中出现的问题。
示例代码
假设我们有一个测试模板方法,其中包含设置、测试和清理方法,并使用日志字符串记录操作过程:
# 被测试类
class WasRun:def __init__(self, name):self.name = nameself.log = ""def setup(self):self.log += "setUp "def test_method(self):self.log += "testMethod "def tear_down(self):self.log += "tearDown "# 测试用例
def test_template_method():test = WasRun("testMethod")result = Nonetest.setup()test.test_method()test.tear_down()assert test.log == "setUp testMethod tearDown ", "Log string is incorrect"
在上述代码中,WasRun
类的方法在执行时会将操作记录到log
字符串中,test_template_method
测试用例验证了日志字符串的内容是否符合预期。
崩溃测试模拟(Crash Test Dummy)
概念与目的
崩溃测试模拟用于测试不太可能被触发的错误码。通过创建一个只抛出异常而不做任何实质工作的对象,使用特定方法触发错误码,以验证系统在面对异常情况时的处理能力,确保未被测试的代码在异常情况下也能正常工作。
示例代码
以测试文件系统满时的异常处理为例:
# 模拟满文件系统的文件类
class FullFile:def __init__(self, path):self.path = pathdef create_new_file(self):raise Exception("File system is full")# 测试用例
def test_file_system_error():file = FullFile("test_path")try:file.create_new_file()assert False, "Expected exception not raised"except Exception as e:assert str(e) == "File system is full", "Exception message is incorrect"
在这个示例中,FullFile
类模拟了文件系统满时创建新文件的异常情况,test_file_system_error
测试用例验证了系统是否能正确捕获和处理该异常。
中断的测试(Broken Test)
概念与技巧
当独自编写程序时,可能会遇到中途离开的情况。中断的测试技巧是让最后一个测试保持不完整状态,作为下次继续编程的切入点。通过这种方式,能够在重新开始编程时快速回忆起当时的思路,避免因长时间中断而导致的编程上下文丢失。
示例说明
假设我们正在编写一个计算斐波那契数列的程序,中途中断时可以保留一个未完成的测试:
# 斐波那契数列计算函数(未完成)
def fibonacci(n):if n == 0:return 0elif n == 1:return 1# 此处省略后续计算逻辑# return fibonacci(n - 1) + fibonacci(n - 2)# 未完成的测试用例
def test_fibonacci():result = fibonacci(5)# 暂时不进行断言,保留测试的中断状态# assert result == 5, "Fibonacci calculation is incorrect"
在上述示例中,test_fibonacci
测试用例在计算斐波那契数列的函数未完全实现时保留中断状态,方便开发者后续继续编写和测试。
干净签入(Clean Check - in)
概念与团队协作
在团队编程中,干净签入要求在签入代码时确保所有测试都能运行通过。这是一种良好的实践,有助于保持代码库的稳定性和可维护性。当团队成员共同开发时,未通过的测试可能会给其他成员带来困扰,因此每次签入前都应进行全面的测试,确保代码的质量和可靠性。
示例场景
假设团队正在开发一个项目管理系统,当某个成员完成了一个新功能的开发,准备签入代码时,需要先运行所有测试用例:
# 假设这里有多个测试用例类和方法
class TestProjectManagementSystem:def test_task_creation(self):# 测试任务创建功能passdef test_task_assignment(self):# 测试任务分配功能pass# 模拟运行所有测试
def run_all_tests():test1 = TestProjectManagementSystem()test1.test_task_creation()test1.test_task_assignment()# 假设还有其他测试用例,依次运行# 签入前调用运行所有测试的函数
if __name__ == "__main__":run_all_tests()# 只有当所有测试都通过后,才进行代码签入操作
在这个示例中,run_all_tests
函数模拟了运行项目管理系统所有测试用例的过程,只有当所有测试都通过后,才符合干净签入的要求。
总结
测试驱动开发模式中的这些具体测试技术,为开发者提供了丰富的测试手段,帮助我们在软件开发过程中更全面、深入地进行测试。从子测试的规模控制到模拟对象的资源替代,从自分流的交互测试到日志字符串的消息记录,再到崩溃测试模拟、中断的测试以及干净签入等,每一种技术都在不同场景下发挥着重要作用。通过合理运用这些技术,我们能够提高测试的效率和质量,确保软件系统的稳定性和可靠性,为软件开发的成功奠定坚实基础。在实际开发中,开发者应根据项目需求和特点,灵活选择和组合这些测试技术,不断优化测试流程,提升软件的整体质量。
相关文章:
第27章 测试驱动开发模式:深入测试技术
写在前面 这本书是我们老板推荐过的,我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后,我突然思考,对于测试开发工程师来说,什么才更有价值呢?如何让 AI 工具更好地辅助自己写代码,或许…...
C语言教程——文件处理(2)
目录 前言 一、顺序读写函数(续) 1.1fprintf 1.2fscanf 1.3fwrite 1.4fread 二、流和标准流 2.1流 2.2标准流 2.3示例 三、sscanf和sprintf 3.1sprintf 3.2sscanf 四、文件的随机读写 4.1fseek 4.2ftell 4.3rewind 五、文件读取结束的…...
QT TLS initialization failed
qt使用QNetworkAccessManager下载文件(给出的链接可以在浏览器里面下载文件),下载失败, 提示“TLS initialization failed”通常是由于Qt在使用HTTPS进行文件下载时,未能正确初始化TLS(安全传输层协议&…...
金融级分布式数据库如何优化?PawSQL发布OceanBase专项调优指南
前言 OceanBase数据库作为国产自主可控的分布式数据库,在金融、电商、政务等领域得到广泛应用,优化OceanBase数据库的查询性能变得愈发重要。PawSQL为OceanBase数据库提供了全方位的SQL性能优化支持,助力用户充分发挥OceanBase数据库的性能潜…...
在Kubernets Cluster中部署LVM类型的StorageClass - 上
适用场景 看到B站技术部门的文章,是关于如何在k8s集群部署Elastic Search和Click House等IO密集型数据库应用的。 因为要充分利用NvME SSD盘的IOPS,所有数据库应用都直接调用本地SSD盘做为stateful application的 Persistent Volumes。为了可用动态的分…...
mysql 学习6 DML语句,对数据库中的表进行 增 删 改 操作
添加数据 我们对 testdatabase 数据中 的 qqemp 这张表进行 增加数据,在这张表 下 打开 命令行 query console 在 软件中就是打开命令行的意思 可以先执行 desc qqemp; 查看一下当前表的结构。 插入一条数据 到qqemp 表,插入时要每个字段都有值 insert…...
【全栈】SprintBoot+vue3迷你商城(10)
【全栈】SprintBootvue3迷你商城(10) 往期的文章都在这里啦,大家有兴趣可以看一下 后端部分: 【全栈】SprintBootvue3迷你商城(1) 【全栈】SprintBootvue3迷你商城(2) 【全栈】Sp…...
2025年01月25日Github流行趋势
项目名称:it-tools 项目地址url:https://github.com/CorentinTh/it-tools项目语言:Vue历史star数:25298今日star数:212项目维护者:CorentinTh, apps/renovate, cgoIT, sharevb, marvin-j97项目简介…...
java后端之登录认证
基础登录功能:根据提供的用户名和密码判断是否存在于数据库 LoginController.java RestController Slf4j public class LoginController {Autowiredprivate UserService userService;PostMapping("/login")public Result login(RequestBody User user) {…...
2024年AI多极竞争:技术创新与商业突破
标题:2024年AI多极竞争:技术创新与商业突破 文章信息摘要: 2024年初,人工智能领域呈现多极竞争格局。OpenAI、Google和Mistral等公司在视频生成、大语言模型架构和模型能力方面实现突破性创新。这些进展体现了AI技术在多模态能力…...
25.1.25Java复习|数组
一、数组复习: import java.util.Scanner; import java.*; public class Example1 {public static void main(String[] args){Scanner scnew Scanner(System.in);String[] namesnew String[5];//创建了一个可以容纳5个字符串的数组for(int i0;i<5;i){System.ou…...
总结8..
#include <stdio.h> // 定义结构体表示二叉树节点,包含左右子节点编号 struct node { int l; int r; } tree[100000]; // 全局变量记录二叉树最大深度,初始为0 int ans 0; // 深度优先搜索函数 // pos: 当前节点在数组中的位置,…...
谈谈对JavaScript 中的事件冒泡(Event Bubbling)和事件捕获(Event Capturing)的理解
JavaScript 中的事件冒泡(Event Bubbling)和事件捕获(Event Capturing),是浏览器在处理事件时采用的两种机制,它们在事件的传播顺序上有显著区别。这两种机制帮助开发者在事件触发时,能够以不同…...
tcp/ip协议和ip协议,tcp/ip协议 ip协议
TCP/IP协议和IP协议在网络通信中扮演着重要的角色,它们之间既有联系又有区别。以下是对两者的详细解释: TCP/IP协议 定义: TCP/IP协议(Transmission Control Protocol/Internet Protocol)是网络通信协议的一种&…...
【JavaEE进阶】Spring留言板实现
目录 🎍预期结果 🍀前端代码 🎄约定前后端交互接口 🚩需求分析 🚩接口定义 🌳实现服务器端代码 🚩lombok介绍 🚩代码实现 🌴运行测试 🎄前端代码实…...
【模型】RNN模型详解
1. 模型架构 RNN(Recurrent Neural Network)是一种具有循环结构的神经网络,它能够处理序列数据。与传统的前馈神经网络不同,RNN通过将当前时刻的输出与前一时刻的状态(或隐藏层)作为输入传递到下一个时刻&…...
软件测试压力太大了怎么办?
本文其实是知乎上针对一个问题的回答: 目前在做软件测试,主要负责的是手机端的项目测试,项目迭代很快,每次上线前验正式都会发现一些之前验测试包时候没有发现的问题,压力太大了,应该怎么调整 看过我之前其…...
ES6 类语法:JavaScript 的现代化面向对象编程
Hi,我是布兰妮甜 !ECMAScript 2015,通常被称为 ES6 或 ES2015,是 JavaScript 语言的一次重大更新。它引入了许多新特性,其中最引人注目的就是类(class)语法。尽管 JavaScript 一直以来都支持基于…...
【时时三省】(C语言基础)二进制输入输出
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 二进制输入 用fread可以读取fwrite输入的内容 字符串以文本的形式写进去的时候,和以二进制写进去的内容是一样的 整数和浮点型以二进制写进去是不一样的 二进制输出 fwrite 字…...
【2024年华为OD机试】(A卷,200分)- 农场施肥 (JavaScriptJava PythonC/C++)
一、问题描述 题目描述 某农场主管理了一大片果园,fields[i] 表示不同果林的面积,单位:平方米(m)。现在需要为所有的果林施肥,且必须在 n 天之内完成,否则会影响收成。小布是果林的工作人员,他每次选择一片果林进行施肥,且一片果林施肥完后当天不再进行施肥作业。 …...
k8s服务StatefulSet部署模板
java 服务StatefulSet部署模板 vim templates-test.yamlapiVersion: apps/v1 kind: StatefulSet metadata:labels:app: ${app_labels}name: ${app_name}namespace: ${app_namespace} spec:replicas: ${app_replicas_count}selector:matchLabels:app: ${app_labels}template:la…...
跟我学C++中级篇——C++初始化的方式
一、初始化的方式 在前面的初级篇中对C的初始化有过一个说明。但随着新标准的迭代以及新的方式的应用,本篇对初始化再做一次整体的总结。下面把C的初始化按照时间线进行一个划分: 1、早期初始化 这种初始化中,开发者一般在初学时都会遇到&am…...
设计模式的艺术-代理模式
结构性模式的名称、定义、学习难度和使用频率如下表所示: 1.如何理解代理模式 代理模式(Proxy Pattern):给某一个对象提供一个代理,并由代理对象控制对原对象的引用。代理模式是一种对象结构型模式。 代理模式类型较多…...
【Nginx】【SSE】【WebSocket】Nginx配置SSE,WebSocket的转发请求
Nginx 配置 SSE 和 WebSocket 转发 一、配置背景(火狐游览器不支持,建议谷歌游览器开发测试) 在使用 Django 框架开发 Web 应用时,为了实现实时通信,可以选择使用以下两种技术: SSE (Server-Sent Events…...
Gin 应用并注册 pprof
pprof 配置与使用步骤 1. 引言 通过下面操作,你可以顺利集成和使用 pprof 来收集和分析 Gin 应用的性能数据。你可以查看 CPU 使用情况、内存占用、以及其他运行时性能数据,并通过图形化界面进行深度分析。 1. 安装依赖 首先,确保安装了 gi…...
国产编辑器EverEdit - 输出窗口
1 输出窗口 1.1 应用场景 输出窗口可以显示用户执行某些操作的结果,主要包括: 查找类:查找全部,筛选等待操作,可以把查找结果打印到输出窗口中; 程序类:在执行外部程序时(如:命令窗…...
【C++探索之路】STL---string
走进C的世界,也意味着我们对编程世界的认知达到另一个维度,如果你学习过C语言,那你绝对会有不一般的收获,感受到C所带来的码云风暴~ ---------------------------------------begin--------------------------------------- 什么是…...
安装 docker 详解
在平常的开发工作中,我们经常需要部署项目。随着 Docker 容器的出现,大大提高了部署效率。Docker 容器包含了应用程序运行所需的所有依赖,避免了换环境运行问题。可以在短时间内创建、启动和停止容器,大大提高了应用的部署速度&am…...
GCC之编译(8)AR打包命令
GCC之(8)AR二进制打包命令 Author: Once Day Date: 2025年1月23日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章请查看专栏: Linux实践记录_Once-Day的博客-C…...
自定义命令执行器:C++中命令封装的深度探索(C/C++实现)
在现代软件开发中,执行系统命令是一项常见的需求,无论是自动化脚本、系统管理工具,还是需要调用外部程序的复杂应用程序,都离不开对系统命令的调用。然而,直接使用系统调用(如 execve)虽然简单&…...
Android BitmapShader简洁实现马赛克/高斯模糊(毛玻璃),Kotlin(三)
Android BitmapShader简洁实现马赛克/高斯模糊(毛玻璃),Kotlin(三) 发现,如果把(二) Android BitmapShader简洁实现马赛克,Kotlin(二)-CSDN博客 …...
7.渲染管线——几何阶段的概述
几何阶段是渲染管线中的一个重要部分,主要负责处理3D模型的几何信息(比如顶点位置、形状、大小等),并将它们转换为屏幕上的2D图像。用通俗易懂的方式来解释: 通俗解释:几何阶段就像把3D模型“拍扁”成2D照片…...
微信小程序实现自定义日历功能
文章目录 1. 创建日历组件实现步骤:2. 代码实现过程3. 实现效果图4. 关于作者其它项目视频教程介绍 1. 创建日历组件实现步骤: 创建日历组件:首先,你需要创建一个日历组件,包含显示日期的逻辑。样式设计:为…...
Vue3 + TS 实现批量拖拽 文件夹和文件 组件封装
一、html 代码: 代码中的表格引入了 vxe-table 插件 <Tag /> 是自己封装的说明组件 表格列表这块我使用了插槽来增加扩展性,可根据自己需求,在组件外部做调整 <template><div class"dragUpload"><el-dial…...
私域流量池构建与转化策略:以开源链动2+1模式AI智能名片S2B2C商城小程序为例
摘要:随着互联网技术的快速发展,流量已成为企业竞争的关键资源。私域流量池,作为提升用户转化率和增强用户粘性的有效手段,正逐渐受到企业的广泛关注。本文旨在深入探讨私域流量池构建的目的、优势及其在实际应用中的策略…...
NFT Insider #166:Nifty Island 推出 AI Agent Playground;Ronin 推出1000万美元资助计划
引言:NFT Insider 由 NFT 收藏组织 WHALE Members、BeepCrypto 联合出品, 浓缩每周 NFT 新闻,为大家带来关于 NFT 最全面、最新鲜、最有价值的讯息。每期周报将从 NFT 市场数据,艺术新闻类,游戏新闻类,虚拟…...
Keepalived实现HAProxy高可用搭建
Keepalived实现HAProxy高可用 文章目录 Keepalived实现HAProxy高可用拓扑表格如下拓扑结构(示例)nginx安装(所有server)HAProxy安装(主备机相同)HAProxy配置(主备机相同) 注释如下内…...
HashTable, HashMap, ConcurrentHashMap 之间的区别
一、HashTable 只是将关键方法加上了锁(synchronized关键字)。 缺点:1.如果多线程访问同一个HashTable就回直接造成锁冲突。 2.HashTable的size属性也是通过 synchronized来控制同步的,效率比较低。 3.在扩容时会涉及大量的拷贝…...
如何确保Spring单例Bean在高并发环境下的安全性?
在Spring中,单例Bean就像是一个“公共的水杯”,整个应用程序中的所有线程都会共享这一个实例。在大部分情况下,这没什么问题,但如果多个线程同时想要修改这个“水杯”里的内容,就可能会出现问题了。 想象一下ÿ…...
【2024年华为OD机试】 (A卷,200分)- 工单调度策略(JavaScriptJava PythonC/C++)
一、问题描述 问题描述 华为工单调度系统需要根据不同的策略调度外线工程师(FME)修复工单。每个工单有一个修复时间要求(SLA时间),在SLA时间内完成修复的工单可以获得对应的积分,超过SLA时间完成的工单不获得积分,但必须完成该工单。目标是设计一种调度策略,使得外线…...
Linux 内核中的高效并发处理:深入理解 hlist_add_head_rcu 与 NAPI 接口
在 Linux 内核的开发中,高效处理并发任务和数据结构的管理是提升系统性能的关键。特别是在网络子系统中,处理大量数据包的任务对性能和并发性提出了极高的要求。本文将深入探讨 Linux 内核中的 hlist_add_head_rcu 函数及其在 NAPI(网络接收处理接口)中的应用,揭示这些机制…...
Alibaba Spring Cloud 六 Seata 的核心组件:RM
在 Alibaba Spring Cloud Seata 中,Resource Manager (RM) 是三大核心组件之一。它主要负责管理分支事务中的资源(如数据库、文件等),并与 Transaction Coordinator (TC) 协作完成分支事务的注册、提交和回滚。RM 是分布式事务实际…...
【Linux】列出所有连接的 WiFi 网络的密码
【Linux】列出所有连接的 WiFi 网络的密码 终端输入 sudo grep psk /etc/NetworkManager/system-connections/*会列出所有连接过 Wifi 的信息,格式类似 /etc/NetworkManager/system-connections/AAAAA.nmconnection:pskBBBBBAAAAA 是 SSID,BBBBB 是对…...
snippets router pinia axios mock
文章目录 补充VS Code 代码片段注册自定义组件vue routerpinia删除vite创建项目时默认的文件axiosmock3.0.x版本的 viteMockServe 补充 为文章做补充:https://blog.csdn.net/yavlgloss/article/details/140063387 VS Code 代码片段 为当前项目创建 Snippets {&quo…...
C#常考随笔2:函数中多次使用string的+=处理,为什么会产生大量内存垃圾(垃圾碎片),有什么好的方法可以解决?
在 C# 中,由于string类型是不可变的,当在函数中多次使用操作符来拼接字符串时,每次操作都会创建一个新的string对象,旧的对象则成为垃圾对象,这会导致大量的内存分配和垃圾回收,产生内存垃圾和碎片。 在需…...
GitLab配置免密登录和常用命令
SSH 免密登录 Windows免密登录 删除现有Key 访问目录:C:\Users\Administrator\ .ssh,删除公钥:id_rsa.pub ,私钥:id_rsa 2.生成.ssh 秘钥 运行命令生成.ssh 秘钥目录( ssh-keygen -t rsa -C xxxxxx126.…...
编码器和扩散模型
目录 摘要abstract1.自动编码器2.变分编码器(VAE)3.论文阅读3.1 介绍3.2 方法3.3 结论 4.总结参考文献 摘要 本周学习了自动编码器(AE)和变分自动编码器(VAE)的基本原理与实现,分析其在数据降维…...
three.js用粒子使用canvas生成的中文字符位图材质
three.js用粒子使用canvas生成中文字符材质 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Three.…...
数据结构与算法之堆: LeetCode 208. 实现 Trie (前缀树) (Ts版)
实现 Trie (前缀树) https://leetcode.cn/problems/implement-trie-prefix-tree/description/ 描述 Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景&am…...
在 Linux 中使用 nslookup命令
什么是 nslookup? nslookup 命令是名称服务器查找的缩写,是一种网络管理工具,用于获取域名的 IP 地址或其他 DNS 记录信息,通常用于解决 DNS 或名称解析问题 nslookup一般语法,<domain-name>是您要查询的域名,…...