单元测试是软件开发中必不可少的一环,但是在平常开发中往往因为项目周期紧,工作量大而被选择忽略,这样往往导致软件问题层出不穷。

线上出现的不少问题其实在有单元测试的情况下就可以及时发现和处理,因此培养自己在日常开发中写单元测试的能力是很有必要的。无论是对自己的编码能力的提高,还是项目质量的提升,都是大有好处。

本文主要总结 Java 单元测试框架 JUnit 5 的基础认识和使用来编写单元测试。

工具版本
jdk1.8
JUnit5.5.2
lombok1.18.8

1. JUnit 5

要说什么是 JUnit 5,首先就得聊下 Java 单元测试框架 JUnit,它与另一个框架 TestNG 占据了 Java领域里单元测试框架的主要市场,其中 JUnit 有着较长的发展历史和不断演进的丰富功能,备受大多数 Java 开发者的青睐。

而说到 JUnit 的历史,JUnit 起源于 1997年,最初版本是由两位编程大师 Kent Beck 和 Erich Gamma 的一次飞机之旅上完成的,由于当时 Java 测试过程中缺乏成熟的工具,两人在飞机上就合作设计实现了 JUnit 雏形,旨在成为更好用的 Java 测试框架。

如今二十多年过去了,JUnit 经过各个版本迭代演进,已经发展到了 5.x 版本,为 JDK 8以及更高的版本上提供更好的支持 (如支持 Lambda ) 和更丰富的测试形式 (如重复测试,参数化测试)。

了解过 JUint 之后,再回头来看下 JUnit 5,这个版本可以说是 JUnit 单元测试框架的一次重大升级,首先需要 Java 8 以上的运行环境,虽然在旧版本 JDK 也能编译运行,但要完全使用 JUnit 5 功能, JDK 8 环境是必不可少的。

除此之外,JUnit 5 与以前版本的 JUnit 不同,拆分成由三个不同子项目的几个不同模块组成。

JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage

  • JUnit Platform: 用于JVM上启动测试框架的基础服务,提供命令行,IDE和构建工具等方式执行测试的支持。

  • JUnit Jupiter:包含 JUnit 5 新的编程模型和扩展模型,主要就是用于编写测试代码和扩展代码。

  • JUnit Vintage:用于在JUnit 5 中兼容运行 JUnit3.x 和 JUnit4.x 的测试用例。

基于上面的介绍,可以参考下图对 JUnit 5 的架构和模块有所了解:


2. 为什么需要 JUnit 5

说完 JUnit 5 是什么之后,我们再来想一个问题:为什么需要一个 JUnit 5 呢?

自从有了类似 JUnit 之类的测试框架,Java 单元测试领域逐渐成熟,开发人员对单元测试框架也有了更高的要求:更多的测试方式,更少的其他库的依赖。

因此,大家期待着一个更强大的测试框架诞生,JUnit 作为Java测试领域的领头羊,推出了 JUnit 5 这个版本,主要特性:

  • 提供全新的断言和测试注解,支持测试类内嵌

  • 更丰富的测试方式:支持动态测试,重复测试,参数化测试等

  • 实现了模块化,让测试执行和测试发现等不同模块解耦,减少依赖

  • 提供对 Java 8 的支持,如 Lambda 表达式,Sream API等。


3. JUnit 5 常见用法介绍

接下来,我们看下 JUni 5 的一些常见用法,来帮助我们快速掌握 JUnit 5 的使用。

首先,在 Maven 工程里引入 JUnit 5 的依赖坐标,需注意的是当前JDK 环境要在 Java 8 以上。

<dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-engine</artifactId><version>5.5.2</version><scope>test</scope>
</dependency>

3.1 第一个测试用例

引入JUnit 5,我们可以先快速编写一个简单的测试用例,从这个测试用例来认识初步下 JUnit 5:

@DisplayName("junit5测试用例")
public class Junit5CaseTest {@BeforeAllpublic static void init() {System.out.println("初始化数据");}@AfterAllpublic static void cleanup() {System.out.println("清理数据");}@BeforeEachpublic void tearup() {System.out.println("当前测试方法开始");}@AfterEachpublic void tearDown() {System.out.println("当前测试方法结束");}@DisplayName("我的第一个测试")@Testvoid testFirstTest() {System.out.println("我的第一个测试开始测试");}@DisplayName("我的第二个测试")@Testvoid testSecondTest() {System.out.println("我的第二个测试开始测试");}
}

直接运行这个测试用例,可以看到控制台日志如下:

左边一栏的结果里显示测试项名称就是我们在测试类和方法上使用 @DisplayName 设置的名称。这个注解就是 JUnit 5 引入,用来定义一个测试类并指定用例在测试报告中的展示名称,这个注解可以使用在类上和方法上,

  • 在类上使用它就表示该类为测试类
  • 在方法上使用则表示该方法为测试方法。
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@API(status = STABLE, since = "5.0")
public @interface DisplayName {String value();
}

示例代码中使用到的一对注解 @BeforeAll和 @AfterAll 。

它们定义了整个测试类在开始前以及结束时的操作,只能修饰静态方法,主要用于在测试过程中所需要的全局数据和外部资源的初始化和清理。与它们不同,@BeforeEach 和 @AfterEach 所标注的方法会在每个测试用例方法开始前和结束时执行,主要是负责该测试用例所需要的运行环境的准备和销毁。

在测试过程中除了这些基本的注解,还有更多丰富强大的注解,接下来就我们一一学习下吧。


3.2 禁用执行测试:@Disabled

当我们希望在运行测试类时,跳过某个测试方法,正常运行其他测试用例时,我们就可以用上 @Disabled 注解,表明该测试方法处于不可用,执行测试类的测试方法时不会被 JUnit 执行。

下面看下使用 @Disbaled 之后的运行效果,在原来测试类中添加如下代码:

@DisplayName("我的第三个测试")
@Disabled
@Test
void testThirdTest() {System.out.println("我的第三个测试开始测试");
}

运行后看到控制台日志如下,用 @Disabled 标记的方法不会执行,只有单独的方法信息打印:

@Disabled 也可以使用在类上,用于标记类下所有的测试方法不被执行,一般使用对多个测试类组合测试的时候。


3.3 内嵌测试类:@Nested

当我们编写的类和代码逐渐增多,随之而来的需要测试的对应测试类也会越来越多。

为了解决测试类数量爆炸的问题,JUnit 5提供了@Nested 注解,能够以静态内部成员类的形式对测试用例类进行逻辑分组。 并且每个静态内部类都可以有自己的生命周期方法, 这些方法将按从外到内层次顺序执行。 此外,嵌套的类也可以用@DisplayName 标记,这样我们就可以使用正确的测试名称。

下面看下简单的用法:

@DisplayName("内嵌测试类")
public class Junit5NestCaseTest {@BeforeEachvoid init() {System.out.println("测试方法执行前准备");}@Nested@DisplayName("第一个内嵌测试类")class FirstNestTest {@Testvoid test() {System.out.println("第一个内嵌测试类执行测试");}}@Nested@DisplayName("第二个内嵌测试类")class SecondNestTest {@Testvoid test() {System.out.println("第二个内嵌测试类执行测试");}}@Disabled@Nested@DisplayName("第三个内嵌测试类")class ThirdNestTest {@Testvoid test() {System.out.println("第三个内嵌测试类执行测试");}}
}

运行所有测试用例后,在控制台能看到如下结果:


3.4 重复性测试:@RepeatedTest

在 JUnit 5 里新增了对测试方法设置运行次数的支持,允许让测试方法进行重复运行。当要运行一个测试方法 N次时,可以使用 @RepeatedTest 标记它,如下面的代码所示:

@DisplayName("重复性测试类")
public class Junit5RepeatedCaseTest {@DisplayName("重复性测试")@RepeatedTest(value = 3)public void repeated_Test() {System.out.println("重复性测试");}
}

运行后测试方法会执行3次,在 IDEA 的运行效果如下图所示:

这是基本的用法,我们还可以对重复运行的测试方法名称进行修改,利用 @RepeatedTest 提供的内置变量,以占位符方式在其 name 属性上使用,下面先看下使用方式和效果:

	@DisplayName("自定义名称重复性测试")@RepeatedTest(value = 3, name = "{displayName} 第 {currentRepetition} 次")public void repeated_name_Test() {System.out.println("重复性测试");}

@RepeatedTest 注解源码

@Target({ ElementType.ANNOTATION_TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@API(status = STABLE, since = "5.0")
@TestTemplate
public @interface RepeatedTest {/*** @RepeatedTest方法的显示名称的占位符: {displayName}*/String DISPLAY_NAME_PLACEHOLDER = "{displayName}";/*** @RepeatedTest方法当前重复计数的占位符: {currentRepetition}*/String CURRENT_REPETITION_PLACEHOLDER = "{currentRepetition}";/*** @RepeatedTest方法的总重复次数占位符: {totalRepetitions}*/String TOTAL_REPETITIONS_PLACEHOLDER = "{totalRepetitions}";/*** 重复测试的短显示名称模式:“重复 {currentRepetition} of {totalRepetitions}”*/String SHORT_DISPLAY_NAME = "repetition " + CURRENT_REPETITION_PLACEHOLDER + " of " + TOTAL_REPETITIONS_PLACEHOLDER;/*** 重复测试的长显示名称模式:“{displayName} :: 重复 {currentRepetition} of {totalRepetitions}”*/String LONG_DISPLAY_NAME = DISPLAY_NAME_PLACEHOLDER + " :: " + SHORT_DISPLAY_NAME;/*** 重复次数。* 返回:重复次数; 必须大于零*/int value();/*** 重复测试的每次重复的显示名称。* 支持的占位符* DISPLAY_NAME_PLACEHOLDER* CURRENT_REPETITION_PLACEHOLDER* TOTAL_REPETITIONS_PLACEHOLDER* 默认为SHORT_DISPLAY_NAME ,产生诸如"repetition 1 of 2" 、 "repetition 2 of 2"等名称。* 可以设置为LONG_DISPLAY_NAME ,从而产生诸如"myRepeatedTest() :: repetition 1 of 2" 、         "myRepeatedTest() :: repetition 2 of 2"等名称。* 或者,您可以提供自定义显示名称,可选择使用上述占位符。* 返回:* 自定义显示名称; 绝不为空白或仅由空格组成*/String name() default SHORT_DISPLAY_NAME;}

@RepeatedTest 注解源码内用

  • currentRepetition 变量表示已经重复的次数
  • totalRepetitions 变量表示总共要重复的次数
  • displayName 变量表示测试方法显示名称

我们直接就可以使用这些内置的变量来重新定义测试方法重复运行时的名称。


3.5 新的断言

在断言 API 设计上,JUnit 5 进行显著地改进,并且充分利用 Java 8 的新特性,特别是 Lambda 表达式,最终提供了新的断言类: org.junit.jupiter.api.Assertions 。

许多断言方法接受 Lambda 表达式参数,在断言消息使用 Lambda 表达式的一个优点就是它是延迟计算的,如果消息构造开销很大,这样做一定程度上可以节省时间和资源。

现在还可以将一个方法内的多个断言进行分组,使用 assertAll 方法如下示例代码:

@Test
void testGroupAssertions() {int[] numbers = {0, 1, 2, 3, 4};Assertions.assertAll("numbers",() -> Assertions.assertEquals(numbers[1], 1),() -> Assertions.assertEquals(numbers[3], 3),() -> Assertions.assertEquals(numbers[4], 4));
}

如果分组断言中任一个断言的失败,都会将以 MultipleFailuresError 错误进行抛出提示。


3.6 超时操作的测试:assertTimeoutPreemptively

当我们希望测试耗时方法的执行时间,并不想让测试方法无限地等待时,就可以对测试方法进行超时测试,JUnit 5 对此推出了断言方法 assertTimeout,提供了对超时的广泛支持。

假设我们希望测试代码在一秒内执行完毕,可以写如下测试用例:

@Test
@DisplayName("超时方法测试")
void test_should_complete_in_one_second() {Assertions.assertTimeoutPreemptively(Duration.of(1, ChronoUnit.SECONDS), () -> Thread.sleep(2000));
}

这个测试运行失败,因为代码执行将休眠两秒钟,而我们期望测试用例在一秒钟之内成功。但是如果我们把休眠时间设置一秒钟,测试仍然会出现偶尔失败的情况,这是因为测试方法执行过程中除了目标代码还有额外的代码和指令执行会耗时,所以在超时限制上无法做到对时间参数的完全精确匹配。


3.7 异常测试:assertThrows

我们代码中对于带有异常的方法通常都是使用 try-catch 方式捕获处理,针对测试这样带有异常抛出的代码,而 JUnit 5 提供方法 Assertions#assertThrows(Class<T>, Executable) 来进行测试,第一个参数为异常类型,第二个为函数式接口参数,跟 Runnable 接口相似,不需要参数,也没有返回,并且支持 Lambda表达式方式使用,具体使用方式可参考下方代码:

@Test
@DisplayName("测试捕获的异常")
void assertThrowsException() {String str = null;Assertions.assertThrows(IllegalArgumentException.class, () -> {Integer.valueOf(str);});
}

当Lambda表达式中代码出现的异常会跟首个参数的异常类型进行比较,如果不属于同一类异常,就会控制台输出如下类似的提示:org.opentest4j.AssertionFailedError: Unexpected exception type thrown ==> expected: <IllegalArgumentException> but was: <...Exception>


4. JUnit 5 参数化测试

要使用 JUnit 5 进行参数化测试,除了 junit-jupiter-engine 基础依赖之外,还需要另个模块依赖:junit-jupiter-params,其主要就是提供了编写参数化测试 API。同样方式,把相同版本的对应依赖引入 Maven 工程中:

<dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-params</artifactId><version>5.5.2</version><scope>test</scope>
</dependency>

基本数据源测试: @ValueSource

@ValueSource 是 JUnit 5 提供的最简单的数据参数源,支持 Java 的八大基本类型和字符串,Class,使用时赋值给注解上对应类型属性,以数组方式传递,示例代码如下:

public class ParameterizedUnitTest {@ParameterizedTest@ValueSource(ints = {2, 4, 8})void testNumberShouldBeEven(int num) {Assertions.assertEquals(0, num % 2);}@ParameterizedTest@ValueSource(strings = {"Effective Java", "Code Complete", "Clean Code"})void testPrintTitle(String title) {System.out.println(title);}
}

@ParameterizedTest 作为参数化测试的必要注解,替代了 @Test 注解。任何一个参数化测试方法都需要标记上该注解。

运行测试,结果如下图所示,针对 @ValueSource 里每个参数都会运行目标方法,一旦哪个参数运行测试失败,就意味着该测试方法不通过。

CSV 数据源测试:@CsvSource

通过 @CsvSource 可以注入指定 CSV 格式 (comma-separated-values) 的一组数据,用每个逗号分隔的值来匹配一个测试方法对应的参数,下面是使用示例:

@ParameterizedTest
@CsvSource({"1,One", "2,Two", "3,Three"})
void testDataFromCsv(long id, String name) {System.out.printf("id: %d, name: %s", id, name);
}

运行结果如图所示,除了用逗号分隔参数外,@CsvSource 还支持自定义符号,只要修改它的 delimiter 即可,默认为 

JUnit 还提供了读取外部 CSV 格式文件数据的方式作为数据源的实现,我们只要用 @CsvFileSource 指定资源文件路径即可,使用起来跟 @CsvSource 一样简单这里就不再重复演示了。

@CsvFileSource 指定的资源文件路径时要以 / 开始,寻找当前测试资源目录下文件。

除了上面提到的三种数据源方式外,JUnit 还提供了以下三种数据源:

  • @EnumSource:允许我们通过参数值,给指定 Enum 枚举类型传入,构造出枚举类型中特定的值。
  • @MethodSource:指定一个返回的 Stream / Array / 可迭代对象 的方法作为数据源。 需要注意的是该方法必须是静态的,并且不能接受任何参数。
  • @ArgumentSource:通过实现 ArgumentsProvider 接口的参数类来作为数据源,重写它的 provideArguments 方法可以返回自定义类型的 Stream<Arguments> ,作为测试方法所需要的数据使用。

对上面三种数据源注解感兴趣的同学可以参考示例工程的 ParameterizedUnitTest 类,这里就不一一再介绍了。


5. 结语

到这里,想必你对 JUnit 5 也有了基本的了解和掌握,都说单元测试是提升软件质量,提升研发效率的必备环节,从会用 JUnit 5 写单元测试开始,培养写测试代码的习惯,在不断实践中提升自身的开发效率,让写出来的代码有更质量的保证。

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

相关文章

  1. Day-5-常用API 异常机制

    一 BigInteger 1、Integer类作为int的包装类&#xff0c;能存储的最大整型值为231-1&#xff0c;Long类也是有限的&#xff0c; 最大为263-1。如果要表示再大的整数&#xff0c;不管是基本数据类型还是他们的包装类 都无能为力&#xff0c;更不用说进行运算了。 2、j…...

    2024/4/14 16:58:07
  2. 计算机网络-无线网络和移动网络

    无线网络和移动网络 在电话技术领域&#xff0c;蜂窝电话的数量比地球上的人口还要多。蜂窝电话的优点是显而易见的&#xff0c;通过一个移动性强、重量轻的设备&#xff0c;能够在任何地方、任何时间无缝地接入全球电话网络、而如今的智能手机、平板电脑等能够以无线的方式经…...

    2024/4/14 16:58:07
  3. 想学软件测试福利来了,最全资料包,免费大放送

    软件测试零基础如何入门&#xff1f; 在职测试如何快速进阶为测试开发&#xff1f; 学历不行怎样才能内推进入一线名企大厂&#xff1f;...... 这里给你答案&#xff01; 200G软件测试教程资料&#xff0c;100名企大厂内推资源 点击下方名片&#xff0c;免费获取领取方式&…...

    2024/4/18 13:31:15
  4. HCIP笔记

    不同类型的LSA之间的比较 域内和域间——域内路由&#xff08;通过1类、2类LSA学习到的路由&#xff09;优先级高于域间路由&#xff08;通过3类LSA学到的路由&#xff09;优先级2、域间和域外——域间路由优先级高于域外路由&#xff08;通过5类&#xff0c;7类LSA学到的路由…...

    2024/4/23 7:27:10
  5. 人是否可以讲粗话

    人要表达自己的情绪&#xff0c;有时候就要用那种单刀直入的、痛痛快快的、活活泼泼的语言来表达。小罗斯福He may be a son of bitch, but hes our son of bitch杜鲁门And I told Bradley,"The son of bitch isnt going to resign on me, I want him fired."克林顿绯…...

    2024/4/19 19:41:11
  6. Fabric 各种配置文件梳理

    1.core.yaml : Peer节点的示例配置文件&#xff0c;有六个部分&#xff08;会随版本变化略加改动&#xff09; 日志部分&#xff1a;指定模块日志级别peer部分&#xff1a;Peer服务核心配置内容vm部分&#xff1a;配置链码运行的环境&#xff0c;比如Docker容器链码部分&#…...

    2024/4/20 2:54:32
  7. IP的含义、分类、子网划分、查。

    1.1 IP地址是什么&#xff1f; 21世纪关于网络&#xff0c;人们最长听见的用词之一便是&#xff1a;IP地址&#xff01;如&#xff1a;“电脑的IP地址是多少”&#xff0c;“路由器怎么设置IP地址”&#xff0c;“如何修改计算机IP地址”&#xff0c;“服务器IP地址是多少”..…...

    2024/4/18 12:44:49
  8. XCTF_BABYRE

    打开发现看不懂也不知道judge是个啥&#xff0c;只能用我自己会的方法来做试试。 在循环后面下个断点 动态调试后发现judge值改变了 现在需要弄清楚这个judge是什么 想了一会估计是个函数被怎么处理过就成了数据 重新生成汇编代码看看(按c&#xff09; 哎有东西的样子 鼠标放…...

    2024/4/7 4:22:10
  9. 2022最新人工智能、机器学习、深度学习、自然语言处理、计算机视觉和数据分析学习资料整理

    最近整理了下机器学习和数据分析的学习资料&#xff0c;里面包含学习社区、入门资料、机器学习、深度学习、自然语言处理、计算机视觉、数据分析、面试和相关书籍等资料。这些资料比较全面&#xff0c;非常适合想学习人工智能、机器学习、深度学习和数据分析方面知识的同学&…...

    2024/4/15 3:29:04
  10. 2022-1-16牛客C++项目——Linux多进程编程——进程间通信

    常见的面试题&#xff1a; 1、你知道进程间通信的方式有哪几种吗&#xff1f; 2、这个通信方式具体的实现原理是什么&#xff1f;怎么实现的&#xff1f; 复习时候需要使用的问题&#xff1a; 1、进程间的通信是什么&#xff1f;进程间为什么需要通信&#xff1f; 2、进程间通…...

    2024/4/23 2:29:55
  11. 蒋涛对话王成录:开发者的黄金十年

    作者 | 新程序员编辑部 “华为的领导层多数都是技术出身&#xff0c;从底层开始一步一步做上来&#xff0c;如果没有技术功底&#xff0c;做软件就只能跟在别人的后面&#xff0c;想要行业领先会非常困难。”在华为消费者业务软件部总裁王成录看来&#xff0c;身处当下软件的黄…...

    2024/4/14 16:57:57
  12. pandas 3----DataFrame运算

    文章目录一、算术运算-add&#xff0c;sub&#xff0c;mul,div二、逻辑运算1. 例如筛选p_change > 2的日期数据2. 完成一个多个逻辑判断&#xff0c; 筛选p_change > 2并且open > 153. 用逻辑运算函数query(values)和isin(values)三、统计运算1. describe() 一下子全部…...

    2024/4/18 12:04:53
  13. 【Python编程入门】笔记5:if语句

    5 if语句5.1 布尔表达式5.1.1 布尔变量与布尔表达式5.1.2 比较运算符5.1.3 逻辑运算符5.1.4 检查列表是否包含特定值5.2 if语句5.2.1 简单的if语句&#xff08;单分支结构&#xff09;5.2.2 if-else语句&#xff08;二分支结构&#xff09;5.2.3 if-elif-else结构&#xff08;多…...

    2024/4/14 16:58:17
  14. Android App开发之Jetpack架构

    还记得15年那个时候&#xff0c;好像Android就是解析数据&#xff0c;列表展示&#xff0c;了解下四大组件生命周期&#xff0c;已经可以干活了&#xff0c;还记得当年一个View只要能滑动&#xff0c;就大呼自定义控件牛逼。 不过&#xff0c;近几年的变化颇大。 为了丰富大家…...

    2024/4/14 16:58:07
  15. 软件测试理论

    软件测试理论 IEEE定义软件测试 IEEE 对 软件测试 的 定义 为&#xff1a;使用人工和自动手段来运行或测试某个系统的过程&#xff0c;其目的在于检测它是否满足规定的需求或是弄清预期结果与实际结果之间的 正向思维&#xff1a;软件正常操作&#xff0c;达到预期结果 反向…...

    2024/4/17 23:49:40
  16. 卷起来,抖音Android包体积优化探索

    众所周知&#xff0c;应用安装包的体积会十分影响用户的应用下载速度和安装速度。据 GooglePlay 平台对外发布相关的包大小对转化率影响的数据&#xff0c;我们可以看到随着包大小的增加&#xff0c;安装转化率总体呈下降的趋势。 因此对于我们的应用来说&#xff0c;为了提升我…...

    2024/4/14 16:57:57
  17. 第五章_System类与Runtime类

    System类与Runtime类 文章目录System类与Runtime类System类Runtime类System类 System类定义了一些与系统相关的属性和方法,它所提供的属性和方法都是静态的.引用这些属性和方法,直接使用System类调用即可. 方法声明功能描述static void exit(int status)该方法用于终止正在运…...

    2024/4/25 0:47:55
  18. HCIP第八天

    Type - 3LSA — 主要传递域间路由信息&#xff0c;通告者为域间的ABR设备&#xff0c;LSID为通告路由的网络号。本身携带的参数主要就两个&#xff0c;一个目标网段的子网掩码&#xff0c;还有一个是通告者到达目标网段的开销值。 Type - 5LSA — 主要传递的是域外路由信息&am…...

    2024/4/20 10:30:40
  19. [C++] 面向 C# 开发人员的 C++:第 3 部分 – 变量和初始化

    英文原文&#xff1a; https://www.jacksondunstan.com/articles/5543 今天我们继续这个系列&#xff0c;介绍变量以及它们是如何初始化的。对于 C# 开发人员来说&#xff0c;这是另一个具有惊人复杂性的基本主题。 声明 C# 开发人员应该非常熟悉变量声明的基本形式&#xff1…...

    2024/4/7 4:22:06
  20. Emacs高手修炼手册

    Emacs高手修炼手册 快捷键 C-n&#xff0c;下一行&#xff08;速记&#xff1a;Nextline&#xff09; C-p&#xff0c;前一行&#xff08;速记&#xff1a;Previous line&#xff09; C-f&#xff0c;向前移动一个字符&#xff08;速记&#xff1a;Forward&#xff09; C-b&a…...

    2024/4/19 11:23:37

最新文章

  1. LangChain 的 AI 代理的迷人思维

    我们将看另一种类型的代理&#xff0c;称为 ReAct 代理。这里的“ReAct”并不代表 React JavaScript 框架。它是 Reason&#xff08;推理&#xff09; Action&#xff08;行动&#xff09; ReAct 的组合。 让我们先创建 ReAct 代理&#xff0c;然后我们将学习它如何工作。 对…...

    2024/5/5 14:40:27
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. javaWeb网上零食销售系统

    1 绪 论 目前&#xff0c;我国的网民数量已经达到7.31亿人&#xff0c;随着互联网购物和互联网支付的普及&#xff0c;使得人类的经济活动进入了一个崭新的时代。淘宝&#xff0c;京东等网络消费平台功能的日益完善&#xff0c;使得人们足不出户就可以得到自己想要的东西。如今…...

    2024/5/5 8:40:41
  4. 多态--下

    文章目录 概念多态如何实现的指向谁调谁&#xff1f;例子分析 含有虚函数类的大小是多少&#xff1f;虚函数地址虚表地址多继承的子类的大小怎么计算&#xff1f;练习题虚函数和虚继承 概念 优先使用组合、而不是继承; 继承会破坏父类的封装、因为子类也可以调用到父类的函数;…...

    2024/5/5 8:35:37
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/4 23:54:56
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/4 23:54:56
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/5/4 23:54:56
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/4 23:55:17
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/5/4 23:54:56
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/5/4 23:55:05
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/5/4 23:54:56
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/5/4 23:55:16
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/5/4 23:54:56
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/4 18:20:48
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/5/4 23:54:56
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/5/4 23:55:17
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/5/4 23:55:06
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/5/4 23:54:56
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/4 23:55:06
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/5/5 8:13:33
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/5/4 23:55:16
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/5/4 23:54:58
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/4 23:55:01
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/5/4 23:54:56
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57