java基础巩固-宇宙第一AiYWM:为了维持生计,测试篇预热【单元测试、性能测试、灰度发布与回滚】~整起

news2024/12/23 22:55:05
  • 单元测试【就像买保险,希望自己不要用上】是重构的保护网:单元测试可以为重构提供信心,降低重构的成本。我们要像重视生产代码那样,重视单元测试【元测试(Unit Testing)是针对程序模块(软件设计的最小单位,面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法)进行的正确性检验测试工作。】。持续集成也要依赖单元测试,当持续集成服务自动构建新代码之后,会自动运行单元测试来发现代码错误。
    在这里插入图片描述
    • JVM默认的执行模式是JIT编译与解释混合执行。JVM通过热点代码统计分析,识别高频方法的调用、循环体、公共模块等,基于JIT动态编译技术,会将热点代码转换成机器码,直接交给CPU执行。所以,顺之,JMH出现了。JMH,全称 Java Microbenchmark Harness (微基准测试框架),是专门用于Java代码微基准测试的一套测试工具API,是由 OpenJDK/Oracle 官方发布的工具。何谓 Micro Benchmark 呢?简单地说就是 在 method 层面上的 benchmark,精度可以精确到微秒级
      • Java的基准测试需要注意的几个点:
        • 测试前需要预热。
        • 防止无用代码进入测试方法中。
        • 并发测试。
        • 测试结果呈现。
      • JMH的使用场景:定量分析某个热点函数的优化效果、想定量地知道某个函数需要执行多长时间,以及执行时间和输入变量的相关性、对比一个函数的多种实现方式
      • JMH的DEMO演示,和常用的注解参数:快速掌握JMH这工具的使用:使用maven构建JMH测试项目+运行 JMH 基准测试有两种方式,一个是生产jar文件运行,另一个是直接写main函数或者放在单元测试中执行。+相关的注解【@BenchmarkMode:微基准测试类型、@Warmup:预热,iterations = 3就是指预热轮数、@Measurement:正式度量计算的轮数、@Threads:每个进程中的测试线程、@Fork:进行 fork 的次数。如果 fork 数是3的话,则 JMH 会 fork 出3个进程来进行测试、@OutputTimeUnit:基准测试结果的时间类型。一般选择秒、毫秒、微秒。、@Benchmark:方法级注解,表示该方法是需要进行 benchmark 的对象,用法和 JUnit 的 @Test 类似。】
        • 基于JMH可以对很多工具和框架进行测试,比如日志框架性能对比、BeanCopy性能对比 等,(更多的example可以参考官方给出的JMH samples)
    • 需要经常使用postman或者swagger之类的进行代码自测,阿里巴巴开发手册,第8条规则(单元测试的基本目标:语句覆盖率达到 70%;核心模块的语句覆盖率和分支覆盖率都要达到 100%)
      • 配置覆盖:基于mockmvc的编写的测试用例,由于加载了Spring的配置,会对项目发起真实的调用。如果,环境的配置为线上配置,容易出现安全问题;一般,处于安全考虑,很多公司会对真实环境的修改操作做事务回滚操作,甚至根本就不会进行真实环境的调用,使用模拟环境替换,例如数据库的操作可以使用h2内存数据库进行替换
        在这里插入图片描述
    • 怎样才能算单元测试呢? 对于单元测试的定义主要取决于你的项目,一个函数甚至是一个类都可以看作是一个单元【在计算机编程中,单元测试(Unit Testing)是针对程序模块(软件设计的最小单位)进行的正确性检验测试工作。程序单元是应用的 最小可测试部件 。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。】。就比如说我们写了一个计算个人股票收益率的方法,我们为了验证它的正确性专门为它写了一个单元测试。再比如说我们代码有一个类专门负责数据脱敏,我们为了验证脱敏是否符合预期专门为这个类写了一个单元测试。一般api的单元测试用例,编写两类,如下
      • 业务参数的校验,和义务异常的校验。例如,名称是否为空,电话号码是否正确,用户未登陆则抛出未登陆异常
      • 各类业务场景的真实测试用例,例如,编写成功添加顶级菜单的测试用例,已经编写成功添加子级菜单的测试用例
    • 由于每个单元有独立的逻辑,在做单元测试时,为了隔离外部依赖,确保这些依赖不影响验证逻辑,我们经常会用到 Fake、Stub 与 Mock
    • Java开发springboot项目都是基于junit测试框架,比较MockitoJUnitRunner与SpringRunner与使用,MockitoJUnitRunner基于mockito,模拟业务条件,验证代码逻辑。SpringRunner是MockitoJUnitRunner子类,集成了Spring容器,可以在测试的根据配置加载Spring bean对象。在Springboot开发中,结合@SpringBootTest注解,加载项目配置,进行单元测试
      • 基于MockitoJUnitRunner的方法测试:
        在这里插入图片描述
      • 基于SpringRunner的Spring容器测试:
        在这里插入图片描述
  • TDD 测试驱动开发:TDD 即 Test-Driven Development( 测试驱动开发),这是敏捷开发的一项核心实践和技术,也是一种设计方法论。
    在这里插入图片描述
    • TDD 原理是开发功能代码之前,先编写测试用例代码,然后针对测试用例编写功能代码,使其能够通过
      • 越重要的代码,越要写单元测试;
      • 代码做不到单元测试,多思考如何改进,而不是放弃
      • 边写业务代码,边写单元测试,而不是完成整个新功能后再写
      • 多思考如何改进、简化测试代码
      • 测试代码需要随着生产代码的演进而重构或者修改,如果测试不能保持整洁,只会越来越难修改。
    • 任务分解是做好 TDD 的关键点。只有把任务分解到可以测试的地步,才能够有针对性地写测试。
      在这里插入图片描述

巨人的肩膀:
javaGuide
Head First Java
effective Java
B站各位老师
极客时间Java基础讲解

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

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

相关文章

协同过滤CF

算法提出 如果让推荐系统领域的从业者选出业界影响力最大、应用最广泛的模型,那么笔者认为90%的从业者会首选协同过滤。1992年, Xerox的研究中心开发了一种基于协同过滤的邮件筛选系统,用以过滤一些用户不感兴趣的无用邮件。2003 年,Amazon …

MySQL数据表的基础知识

目录 一、增 二、查 a、全列查询 b、指定列查询 c、查询字段为表达式 d、别名查询 e、对查询结果进行去重 f、排序 ​g、条件查询 三、改 四、删 以下操作均以student表为基础: 一、增 insert into 表名 values(...); 例如:新增张三同学的…

举个栗子!Tableau 技巧(247):用震波图(Seismogram)查看数据变化

震波图(Seismogram)是一种像地震波或声波的图表,通常用于表达数据的变化。乍一看,它有点像 蝴蝶图(旋风图),数据都分布在轴的零点两侧,但其实两者完全不同。 如下震波图&#xff0c…

Stm32旧版库函数6——ov2640 串口显示图像 串口中断 使用旧版库 模拟IIC

/******************************************************************************* // // 使用单片机STM32F100C8T6 8 // 晶振:8.00M // 编译环境 Keil uVision4 // 在3.3V的供电环境下,就能运行 // 波特率 115200 // 使用:STM32F100C…

SpringCloud Config 分布式配置中心

分步式系统面临配置问题: 微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务。由于每个服务都需要必要的配置信息才能运行,所以一套集中式的、动态的配置管理设施是必不…

浅谈电气火灾监控系统在煤矿高层公寓中的应用分析

摘要: 煤矿高层公寓做为人员高度密集场所,使用的电器种类繁多,一旦发生电气火灾事故, 其严重性和危害性远高于其它场所。文章通过对煤矿公寓电气线路火灾主要形式的分析,对电气火灾监 控系统在煤矿公寓电气火灾预防及…

NLG解码策略

NLG解码策略 自然语言生成(Natural Language Generation,简称NLG),是自然语言处理领域的一个重要分支,在文本摘要生成任务中,另一个重要的分支是自然语言理解(Natural Language Understanding&…

传奇GOM引擎版本架设

传奇GOM引擎版本架设 传奇GOM引擎版本我们架设游戏需要用到的工具: 版本(游戏类型服务端)、DBC2000(游戏数据库)、RAR(解压工具)、传奇客户端、服务器、网盘 先把这些架设工具准备好&#xff…

性能测试——

目录 测试的分类 性能测试的指标 性能测试需求分析 ​编辑 性能测试计划及方案 ​编辑​编辑 测试用例设计及执行 梳理系统架构 压力测试报告 测试的分类 性能测试的指标 性能测试需求分析 性能测试计划及方案 测试用例设计及执行 估算系统的qps要了解什么: 系…

Hot100-最小路径和

1 前言 1.1 题目描述 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 如下图所示: 输入:grid [[1,3,1],[1,5,1…

ConversionService转换服务使用

前言 在最近分析和写的SpringBoot源码分析(面试官:你说说Springboot的启动过程吧(5万字分析启动过程))中,给自己留了一个关于ConversionService的使用的作业,这不就来补作业了。 使用出处 这个转换服务我这里的例子很简单,就是…

计算机研究生就业方向之去大厂做架构师

我一直跟学生们说你考计算机的研究生之前一定要想好你想干什么,如果你只是转码,那么你不一定要考研,至少以下几个职位研究生是没有啥优势的: 1,软件测试工程师(培训一下就行) 2,前…

RocketMQ详解及开发用例

概念 Apache RocketMQ作为阿里开源的一款高性能、高吞吐量的分布式消息中间件。 支持Broker和Consumer端消息过滤,支持发布订阅模型和点对点,支持拉pull和推push两种消息模式,单一队列百万消息、亿级消息堆积,支持单master节点&a…

力扣202.快乐数(java语言HashSet方法,类双指针方法)

前言:此题被分类到散列表算法题目中,但乍一看此题实在想不到如何去使用散列表,直到看了官方给的答案。。。。。。 题目描述: 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为: 对于一个正整数&#…

C++ 基本语法

📒博客主页: ​​开心档博客主页​​ 🎉欢迎关注🔎点赞👍收藏⭐留言📝 📌本文由开心档原创! 📆51CTO首发时间:🌴2022年12月12日🌴 ✉…

Python40个自动化办公实战案例,终于实现下班自由啦~

拿来就能用,这么爽的吗?! 今天我想聊聊,如何通过Python自动化工具,解决工作中常见的办公效率低下的问题。 你有没有想过,下班晚,加班,可能是因为自己工作比较低效? 回…

wireshark 分析理解DHCP流程

DHCP概念: 动态主机配置协议 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议),是一个应用层协议。该协议允许服务器向客户端动态分配 IP 地址和配置信息。 知识补充: BOOTP(Boots…

PVE使用cloud-init快速启动虚拟机

这里写目录标题关于cloud-init云镜像(cloud image)下载创建虚拟机模板,可反复使用DebianUbuntuCentOS使用模板关于cloud-init 传统ISO镜像装机时,需要一步一步规定虚拟机,比如系统盘安装在哪个磁盘里,ip是…

Vue Material - 基于谷歌 Material Design 打造的前端组件库,用 Vue 开发海外应用的绝佳选择

一位朋友问我用 vue 开发 APP 在谷歌商店上架,有什么简单的 UI 组件库,我推荐了这款,同样推荐给各位。 关于 Vue Material Vue Material 是一款简单、轻量级的 Vue 组件,组件的设计完全按照 Google Material Design 规范构建&am…

氟尿嘧啶/琥珀酰化壳聚糖偶联载药体(SUCS-5-FuOH)

氟尿嘧啶/琥珀酰化壳聚糖偶联载药体(SUCS-5-FuOH) 产品描述:以自制的琥珀酰化壳聚糖 (SUCS)和羟甲基-5-氟尿嘧啶(5-FuOH)为原料,制备了壳聚糖偶联载药体(SUCS-5-FuOH).结果表明,SUCS和5-FuOH间通过酯键化学键合,接枝率(载药率)为18.7%,在模拟体液和酶存在条件下均有…