Java开发测试(第一篇):Java测试框架JUnit5

news2024/11/15 19:44:49

目录

1.基本介绍

2.maven中安装JUnit5

3.使用

 4.JUnit5命名规则

5.JUnit5常用注解

6.JUnit5断言

7.JUnit5多个类之间的继承关系

8.JUnit5参数化

(1)使用场景:

(2)使用前需在pom.xml文件中导入依赖

(3)参数化需要使用的注解

(4)@ValueSource单参数化

(5)@CsvSource多参数化

(6)@CsvFileSource多参数文件参数化

(7)@MethodSource方法参数化

(8)@EnumSource枚举参数参数化

(9)特殊的参数化

9.超时处理

10.JUnit设置显示名称

11.使用@Nested体现测试用例间的嵌套关系

 12.JUnit5指定用例的执行顺序

(1)方法排序

(2)类排序

(3)使用配置文件指定顺序

13.JUnit5重复测试

14.JUnit5标记测试用例

(1)使用步骤

(2)Tag的命名规范

(3)Tag表达式

(4)自定义注解标签

15.JUnit5设置禁用测试用例


1.基本介绍

(1)JUnit5是一个Java语言的单元测试框架

(2)JUnit5包括JUnit Platform、JUnit Jupiter和JUnit Vintage

2.maven中安装JUnit5

在pom.xml配置文件中添加以下依赖

<dependencies>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter</artifactId>
        <version>5.8.2</version>
        <scope>test</scope>
    </dependency>
</dependencies>

3.使用

在测试用例上添加@Test注解

@Test
void test1(){
    System.out.println("test1方法被运行");
}

在命令行执行需注意

(1)在pom.xml添加以下插件(可在include中指定命名规则)

<build>
    <plugins>
        <!-- Maven Surefire Plugin for running tests during the build -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.2</version>
            <configuration>
                <includes>
                    <include>**/*.java</include>
                </includes>
                <excludes>
<!--                指定不运行的测试类-->
                    <exclude></exclude>
                </excludes>
            </configuration>
        </plugin>
    </plugins>
</build>

(1)要对对应module路径下面执行mvn test命令

(2)要符合JUnit5命令规则, 默认以Test开头或者以Test结尾

IDEA快速生成测试文件:在对应类名上鼠标右键->Go To->Test

命令行执行常用命令

  • 执行所有测试类:mvn test
  • 执行单个测试类:mvn test -Dtest=包名.类名
  • 执行单个测试方法:mvn test -Dtest=包名.类名#方法名
  • 执行同一个包下的多个测试类:mvn test -Dtest=包名.类名1,包名.类名2,.....
  • 正则匹配执行多个测试类:mvn test -Dtest="包名.*Test"

 4.JUnit5命名规则

(1)单元测试代码文件

  • 默认写在工程目录:src/test/java
  • 不允许写在业务代码目录下

(2)测试资源文件

  • 默认写在资源目录:src/test/resources

(3)默认命名规则:以Test开头或者以Test结尾

注意:idea并没有针对文件名做限制,但是使用mven构建时,则不会收集不满足规则要求的用例

5.JUnit5常用注解

(1)@DisplayName("参数"),该注解可为测试用例起一个别名,别名即为写入的参数

(2)@BeforeEach在方法上加上该注解,会让这个方法在(一个测试类中的)每个测试用例执行前都执行一次(即有几个测试用例就会执行几次,@AfterEach同理)

(3)@AfterEach注解,会让这个方法在每个测试用例执行之后都执行一次

(4)@BeforeAll注解,会让这个方法在所有测试用例执行之前执行一次(即不管有多少个测试用例都只会执行一次,@AfterAll同理)

(5)@AfterAll注解,会让这个方法在所有测试用例执行完成之后执行一次

总结:All和Each的区别

  • All在一个测试类中,只执行一次,但是Each是有多少个方法就执行几次
  • All注解只能修饰static方法,不能修饰普通方法。Each可以修饰普通方法
  • 如果是BeforeAll和BeforeEach同时存在,优先执行BeforeAll
  • 如果是AfterAll和AfterEach同时存在,优先执行AfterEach,最后执行AfterAll

6.JUnit5断言

使用Assertions类的断言方法,判断方法的实际执行结果和预期结果是否一致(断言失败,就会停止运行,后面的语句不会执行)

Assertions类的断言方法有

  • assertEquals(参数1, 参数2):参数1为预期结果,参数2为实际结果,如果一致无输出,不一致会报错
  • assertTrue(参数):参数为一个表达式,或者为布尔类型的值,如果为true则无输出,为false则报错
  • assertNotNull(参数):若参数不为null则无输出,参数为null则报错
  • assertAll("All", ()->断言1, ()->断言2,......):用于执行多个断言,其中一个断言失败,不影响其他断言的执行
assertAll("All",
        ()-> assertTrue(3 == 1),
        ()-> assertEquals(3, 1+1));
  • assertTimeout(参数1,()->{语句}):参数1为设置的运行时间,如果参数2运行时间超过参数1设置的就会报错
// 该用例设置的是3秒,后面的语句运行时间为4000毫秒即4秒,所以会报错,即断言失败
assertTimeout(Duration.ofSeconds(3), ()->{
    sleep(4000);
});
  • assertThrows(异常类型, 语句):如果第二个参数抛出了第一个参数指定的异常,则断言成功,反之断言失败
@Test
void main4() {
    //该语句抛出了参数指定的异常,所以断言成功,无输出
    assertThrows(ArithmeticException.class,()->{double a = 1/0;});
}

7.JUnit5多个类之间的继承关系

如果B类继承A类,两个类都有Test,BeforeAll,BeforeEach,AfterAll,AfterEach,执行子类B类时,执行顺序如下(不是所有注释都可以被继承,具体参考官网):

A-beforeAll --> B-beforeAll -->

A-beforeEach --> B-beforeEach --> A-testA1 --> B-afterEach --> A-AfterEach -->

(A-beforeEach --> B-beforeEach --> A-testA2--> B-afterEach --> A-AfterEach......这样循环执行完A的测试用例才会开始执行B的测试用例) -- > 

A-beforeEach --> B-beforeEach --> B-testB1 --> B-afterEach --> A-AfterEach -->

(A-beforeEach --> B-beforeEach --> B-testB2 --> B-afterEach --> A-AfterEach) -- >

B-afterAll --> A-afterAll

8.JUnit5参数化

(1)使用场景:

测试流程相同,测试数据需要根据业务需求切换

(2)使用前需在pom.xml文件中导入依赖
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-params</artifactId>
    <version>5.8.2</version>
    <scope>test</scope>
</dependency>
(3)参数化需要使用的注解
  • 将@Test换成@ParameterizedTest
  • 注意:如果@Test和@ParameterizedTest同时使用则会多执行一次
  • 单参数化注解为@ValueSource
  • 多参数化注解为@CsvSource
  • 多参数文件参数化注解为@CsvFileSource
  • 方法作为参数化的数据源,注解为@MethodSource
  • 枚举参数参数化注解为为@EnumSource
  • null参数的参数化注解为@NullSource
  • 参数为空的参数化注解为@EmptySource
  • 需要null和空都进行参数化,使用@NullAndEmptySource注解,还有其他参数可以使用@ValueSource继续提供
(4)@ValueSource单参数化

ValueSource支持的参数类型:

参数参数的类型
shortsshort
bytesbyte
intsint
longslong
floatsfloat
doublesdouble
charschar
booleansboolean
stringsjava.lang.String
classesjava.lang.Class

单参数使用步骤

1)将@Test注解换为@ParameterizedTest注解

2)传递测试数据

使用单参数注解@ValueSource传递参数化的数据内容

传递参数化过程中,需要通过@ValueSource定义的关键字进行类型声明

3)在测试方法上添加形参,接受参数化的数据

@ParameterizedTest
@ValueSource(strings = {"xiaoming","xiaowang"})
void main5(String name) {
    System.out.println(name);
}

注意:方法中的形参每次只接收一个参数,所以传入几个参数,方法就执行多少次。当@ValueSource注解只传入一个参数时,大括号可省略

(5)@CsvSource多参数化

使用步骤

1)将@Test注解换为@ParameterizedTest注解

2)传递测试数据

使用多参数注解@ValueSource传递参数化的数据内容

多个参数间需用默认分隔符“,”隔开

3)在测试方法上添加形参,接受多参数的数据

示例:

@ParameterizedTest
@CsvSource({"wangming,12","xiaoli,11","ssli,13"})
void main6(String name, Integer age) {
    System.out.println(name + "的年龄是" + age);
}

运行结果:

注意:使用CsvSource注解传递参数化数据,传递的参数格式是一个集合

也可通过以下方法指定分隔符:

@CsvSource(value = {"wangming|12","xiaoli|11","ssli|13"},delimiterString = "|")
(6)@CsvFileSource多参数文件参数化

使用步骤

1)在项目的test/resource中新增测试数据csv文件

2)将@Test注解换为@ParameterizedTest注解

3)传递文件路径@CsvFileSource(resources = "文件路径")

4)在测试方法上添加形参,接受多参数的数据

示例:

将以下数据添加到data.csv文件

wangming,12
xiaoli,11
ssli,13

代码

@ParameterizedTest
@CsvFileSource(resources = "/data.csv")
void main7(String name, Integer age) {
    System.out.println(name + "的年龄是" + age);
}

运行结果:

也可通过以下方法指定分隔符:

@CsvFileSource(resources = "/data2.csv",delimiterString = "|")
(7)@MethodSource方法参数化

说明

  • 该注解引用方法作为参数化的数据源信息
  • 该注解的参数必须是静态的工厂方法,除非测试类被注释为@TestInstance(Lifecycle.PER_CLASS)
  • 静态工厂方法的放回值需要和测试方法的参数对应
  • 如果在@MethodSource注解中未指明方法名,会自动调用与测试方法同名的静态方法

测试方法参数对应的工厂方法返回值

@ParameterizedTest方法工厂方法
void test(int)static int[ ] factory()
void test(int)static intString factory()
void test(String)static String[ ] factory()
void test(String)static List<String> factory()
void test(String)static Stream<String> factory()
void test(String, String)static String[ ][ ] factory()
void test(String, int)static object[ ][ ] factory()
void test(String, int)static Stream<object[ ]> factory()
void test(String, int)static Stream<Arguments> factory()
void test(int[ ])static int[ ][ ] factory()
void test(int[ ])static Stream<int[ ]> factory()
void test(int[ ][ ])static Stream<int[ ][ ]> factory()
void test(object[ ])static Stream<Object[ ][ ]> factory()

使用步骤

1)将@Test注解换为@ParameterizedTest注解

2)通过@MethodSource("method")指定数据源的方法

3)定义一个静态方法,提供参数化数据源

4)添加形参,形参的类型要和静态方法返回值内部的元素一致

单参数示例:

@ParameterizedTest
@MethodSource("stringProvider")
void main8(String name){
    System.out.println(name);
}

static Stream<String> stringProvider(){
    return Stream.of("张三", "李四");
}

运行结果:

多参数示例:

@ParameterizedTest
@MethodSource
void main8(String name, Integer age){
    System.out.println(name + "的年龄为" + age);
}

static Stream<Arguments> main8(){
    return Stream.of(
            Arguments.arguments("张三", 13),
            Arguments.arguments("李四", 17)
    );
}

运行结果:

(8)@EnumSource枚举参数参数化

说明

1)使用枚举类作为测试数据

2)必须与@ParameterizedTest结合使用

使用步骤

1)创建一个枚举类

2)枚举类作为参数传入测试方法

示例:

public enum Unit{
    Harry("Harry",21),
    my("my",22),
    tuble("tuble", 24);

    private final String name;
    private final Integer age;

    private Unit(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
}

@ParameterizedTest
@EnumSource
void main9(Unit unit){
    System.out.println(unit.name + "年龄为:" + unit.age);
}

运行结果:

可通过names关键字,指定枚举对象的范围

@EnumSource(names = {"Harry","my"})

运行结果:

通过mode关键字,指定规则

EXCLUDE规则代表取反,意思是names里面指定了什么,就不执行什么

@EnumSource(mode = EnumSource.Mode.EXCLUDE,names = {"my"})

运行结果:

MATCH_ALL规则代表正则匹配,names里面填写正则表达式,匹配到什么就执行什么

@EnumSource(mode = EnumSource.Mode.MATCH_ALL,names = {"my*"})

运行结果:

(9)特殊的参数化

  @NullSource提供null作为参数

@ParameterizedTest
@NullSource
void main10(String para){
    System.out.println(para);
}

运行结果:

@EmptySource提供空值作为参数

@ParameterizedTest
@EmptySource
void main11(String para){
    assertTrue(para.isEmpty());
}

@NullAndEmptySource注解,对null和空都进行参数化(还有其他参数可以使用@ValueSource继续提供)

@ParameterizedTest
@NullAndEmptySource
@ValueSource(strings = {"小明", "小李"})
void main12(String para){
    System.out.println(para);
}

运行结果:

9.超时处理

使用JUnit5自带的超时处理。当测试用例执行时间超过设置的执行时间,那么用例结果为执行失败

用法:使用@Timeout(5)注解配置超时时间,括号里的参数填的就是设置的执行时间,单位为秒

示例:

@Test
@Timeout(7)
void main4() throws InterruptedException {
    System.out.println("超时用例测试");
    sleep(10000);
}

运行结果:

 可以通过以下方式设置参数的单位

@Timeout(value = 42, unit = MILLISECONDS),表示42毫秒

unit值如下:

毫秒:MILLISECONDS

秒:SECONDS

分:MINUTES

小时:HOURS

天:DAYS

10.JUnit5设置显示名称

相当于给用例起别名,可以展示在IDE、报告中。

普通方式:使用注解@DisplayName("别名"),可以用在方法和类上

进阶:DisplayName生成器

  • 通过注解@DisplayNameGenerator实现生成器
  • 通过配置文件配置

DisplayName生成器配置

生成器配置含义案例
Standard默认配置h_test()->h_test()
Simple删除没有参数的方法的尾括号h_test()->h_test
ReplaceUnderscores用空格替换下划线,也会去除括号h_test()->h test
IndicativeSentence使用类名,方法名类名,h_test()

(1)例如在类上添加如下注解即为设置默认格式

@DisplayNameGeneration(DisplayNameGenerator.Standard.class)

(2)利用属性文件junit-platform.properties全局配置

步骤如下

1)在路径src/test/resource/junit-platform.properties中添加配置文件

2)在配置文件中添加对应的配置属性(以Simple为例)

junit.jupiter.displayname.generator.default=\
  org.junit.jupiter.api.DisplayNameGenerator$Simple

优先级:@DisplayName 》@DisplayNameGenerator 》配置文件

11.使用@Nested体现测试用例间的嵌套关系

方法:定义嵌套类,在每个嵌套类上添加@Nested注解

示例:

public class NestedExampleTest {
    @Nested
    class AuthorityManage{
        @Nested
        class Manager{
            @Test
            void addUser(){
                System.out.println("添加用户");
            }
            @Test
            void delUser(){
                System.out.println("删除用户");
            }
        }
        @Nested
        class EmployeeManage{
            @Test
            void employeeManage(){
                System.out.println("员工管理");
            }
        }
    }
    @Nested
    class UserManage{
        @Test
        void userManage(){
            System.out.println("用户管理");
        }
    }
}

运行结果:

 12.JUnit5指定用例的执行顺序

分为三种方式:方法排序、类排序、Suite

(1)方法排序

1)方法排序的类型

类型说明
OrderAnnotation使用@Order注解指定排序
DisplayName根据显示名称排序
Random随机排序
MethodName根据方法名称排序

2)order注解指定排序步骤:

  •  在类上添加注解@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
  • 在每个测试用例上添加@Order(1)、@Order(2).......

3)DisplayName根据显示名称排序步骤:

  • 在类上添加注解@TestMethodOrder(MethodOrderer.DisplayName.class)
  • 在每个测试用例上添加@DispalyName("显示名称")指定显示名称

4)随机排序步骤:

  • 在类上添加注解@TestMethodOrder(MethodOrderer.Random.class)

5)方法名称排序步骤:

  • 在类上添加注解@TestMethodOrder(MethodOrderer.MethodName.class)
(2)类排序

1)类排序的类型

类型说明
OrderAnnotation使用@Order注解指定排序
DisplayName根据显示名称排序
Random随机排序
ClassName根据方法名称排序

用在嵌套类中,需要和@Nested配合使用,使用步骤和方法排序一样

不同的地方在于,第一步中,在类上添加的注解为:

@TestClassOrder(ClassOrderer.类型.class)

(3)使用配置文件指定顺序

步骤如下

1)在配置文件src/test/resource/junit-platform.properties(没有就新建,有就直接写)中写入对应的配置信息

2)可以分别指定方法的默认配置和类的默认配置

#方法排序-设置默认排序方式为随机排序
junit.jupiter.testmethod.order.default=org.junit.jupiter.api.MethodOrderer$Random
#类排序-设置默认排序方式为随机排序
junit.jupiter.testclass.order.default=org.junit.jupiter.api.ClassOrderer$Random

13.JUnit5重复测试

使用注解@RepeatedTest(10)可进行同一个用例的重复测试,参数为重复次数(有了这个注解,不需要再添加@Test,如果添加,则会多执行一次)

可通过以下方式指定重复测试的显示名称(name关键字中只支持这三个变量,不可随意修改,改,其他可修改):

@RepeatedTest(value = 10, name = "{displayName} {currentRepetition} of {totalRepetitions}")

各变量含义

displayName:代表显示名称,如果没有设定,那么会使用方法名称

currentRepetition:当前是第几次重复

totalRepetitions:总共需要重复几次

14.JUnit5标记测试用例

通过Tag标签对用例分组

(1)使用步骤

1)设置标签(一条用例可以设置多个标签)

@Tag("dev")

2)根据标签执行

 1.结合Maven执行-修改pom文件

<build>
    <plugins>
        <!-- Maven Surefire Plugin for running tests during the build -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.2</version>
            <configuration>
                <includes>
                    <include>**/*.java</include>
                </includes>
                <excludes>
<!--                        指定不运行的测试类-->
                    <exclude></exclude>
                </excludes>
<!--                    要执行的标签-->
                <groups></groups>
<!--                    不要执行的标签-->
                <excludedGroups></excludedGroups>
            </configuration>
        </plugin>
    </plugins>
</build>
  •  groups表示执行包含标签或者标签表达式的用例
  • excludedGroups表示不执行包含该标签或者标签表达式的用例
  • 使用mvn clean test执行用例

 2.结合maven执行-使用命令行构建

#执行test标签的用例
mvn clean test -Dgroups="test"
#执行不含test标签的用例
mvn clean test -DexcludedGroups="test"

注意:如果使用命令行的同时也配置了pom文件,pom的配置优先级更高

(2)Tag的命名规范
  • 不准为空
  • 标签不得包含空格
  • 标签不得包含ISO控制字符
  • 标签不得包含以下任何保留字符
  • "," "(、)" "&" "|" "!"
(3)Tag表达式
Tag表达式含义示例
&(在pom文件要写成&amp;)表示与关系test1&test2表示执行既包含test1又包含test2的标签
!表示非关系!test1表示执行没有test1标签的用例
|表示或关系test1|test2表示执行包含test1或包含test2的标签
(4)自定义注解标签

可通过自定义标签,将test注解和tag注解结合到一个注解,减少代码冗余

public class Homework02test {
    //使用自定义标签,该自定义标签名为Preprod
    @PreprodTest
    void main4() {
        assertThrows(ArithmeticException.class, () -> {
            double a = 1 / 0;
        });
    }
}

//自定义标签
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Tag("Preprod")
@Test
@interface PreprodTest{
}

15.JUnit5设置禁用测试用例

给用例添加禁用标识,被禁用的用例执行后会添加跳过的状态。

可以禁用测试类、也可以禁用测试方法。

使用方式:添加注解@Disabled,该注解可以有参数,也可以没有,参数为禁用说明,会体现在报告里

注意:如果禁用的是测试类,IDEA不支持,maven构建才支持。禁用的是测试方法,IDEA支持

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

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

相关文章

海纳斯删除广告位

找到文件 vim /var/www/html/home.php 删除代码段 <div class"adleft" id"adleftContainer"><button onclick"closeAd()">关闭</button><a href"https://www.ecoo.top/ad.html" target"_blank">&l…

怀俄明探空站数据解算PWV和Tm

1. Matlab 获取代码可关注公众号WZZHHH回复&#xff08;怀俄明探空站数据解算PWV和Tm&#xff09;&#xff0c;或者咸鱼关注&#xff1a;WZZHHH123 怀俄明探空站数据解算PWV和Tm&#xff1a; 有关 Matlab 获取代码可关注公众号WZZHHH回复&#xff08;怀俄明多线程下载&#…

最新怎么订阅OnlyFans上喜欢的博主,详细教程

大家好&#xff0c;本文教大家如何用虚拟信用卡在 Onlyfans 订阅&#xff0c;链接在浏览器打开地址https://bewildcard.com/i/GPT310&#xff0c;虚拟卡开好之后&#xff0c;用支付宝充值就可以进行订阅OnlyFans平台的博主了。 什么是OnlyFans&#xff1f; OnlyFans 是一个提…

毅速解析:金属3D打印模具工件性能如何?

3D打印技术&#xff0c;在模具随形水路、异形模具制造以及模具排气结构等方面的独特优势&#xff0c;已成为模具升级的重要技术方向&#xff0c;并受到众多注塑、压铸等模具行业的青睐。 然而&#xff0c;面对这一新兴技术&#xff0c;不少人不免心生疑虑&#xff1a;3D打印技术…

【c++练习】求3个长方柱的体积

【问题描述】编写一个基于对象数组的程序&#xff0c;用成员函数实现多个功能&#xff0c;求3个长方柱的体积。要求用成员函数实现以下功能&#xff1a; 1、由键盘分别输入3个长方柱的长、宽、高&#xff1b; 2、计算长方柱的体积&#xff1b; 3、输出3个长方柱的体积。 【…

MySQL基础【语句执行顺序】

一个SQL语句它的执行顺序对于我们思考题意有着很重要的关系 题意就是&#xff1a;找出哪些只逛超市不买单的人&#xff08;买单0元也算哦&#xff0c;可能是使用的是代金券吧&#xff09; 看到此题关键找出两个数据 参观过的人 和 买单的人 他们的差就是白嫖的人&#xff08;支…

C语言分支语句

一、什么是语句 C语句可分为以下五类&#xff1a; 表达式语句 函数调用语句 控制语句 复合语句 空语句 本周后面介绍的是控制语句。 控制语句用于控制程序的执行流程&#xff0c;以实现程序的各种结构方式&#xff0c;它们由特定的语句定义符组成&#xff0c;C语 言有…

远程过程调用(远程调用)

远程过程调用&#xff08;远程调用&#xff09; 1、什么是分布式计算 在计算机科学中&#xff0c;分布式计算&#xff08;英语&#xff1a;Distributed computing&#xff09;&#xff0c;又译为分散式运算。这个研究领域&#xff0c;主要研究分布式系统&#xff08;Distribu…

什么是MQ ?为什么用MQ?

什么是MQ&#xff1f; MQ(message queue)&#xff08;消息队列&#xff09;&#xff0c;从字面意思上看&#xff0c;本质是个队列&#xff0c;FIFO先入先出&#xff0c;只不过队列中存放的内容是message而已&#xff0c;还是一种跨进程的通信机制&#xff0c;用于上下游传递消息…

春招-实战项目冲刺直播课

春招-实战项目冲刺直播课 CCtalk 丰富多元的综合内容平台-专业的知识分享与在线教育平台https://www.cctalk.com/m/group/91161801

解决win7作为虚拟机无法复制粘贴共享文件的问题

win7作为虚拟机经常会出现无法与主机的剪切板共享、文件共享。 归根结底是win7虚拟机里面没有安装VMware Tools 能够成功安装vmware tools的条件&#xff1a; 1&#xff09;win7版本为win7 sp1及以上 2&#xff09;安装KB4490628&#xff0c;KB4474419补丁 因此下面来详细介绍…

QA测试开发工程师面试题满分问答9: Python中内存管理的概念、原理、使用

概念原理 Python中的内存管理是由解释器自动处理的&#xff0c;它使用引用计数和垃圾回收机制来管理内存。以下是Python内存管理的一些关键概念、设计原理和最佳实践&#xff0c;以帮助您高效使用和管理内存&#xff1a; 引用计数&#xff1a;Python使用引用计数来追踪对象的引…

c++的学习之路:8、内存管理与模板

一、 C/C内存分布 首先在c语言的动态内存管理中我知道了代码是如何存储数据的&#xff0c;然后c是根据c语言底层变化来的&#xff0c;那么c语言的内存管理就是适用c的内存管理&#xff0c;在c语言中程序是分为几个部分存储&#xff0c;例如在栈堆等等&#xff0c;他们的分布如…

解决 macOS 系统向日葵远程控制鼠标、键盘无法点击的问题

解决 macOS 系统向日葵远程控制鼠标\键盘无法点击的问题 1、首先正常配置&#xff0c;在系统偏好设置 - 安全性与隐私内&#xff0c;将屏幕录制、文件和文件夹、完全的磁盘访问权限、辅助功能全部都加入向日葵客户端 2、通过打开的文件访达&#xff0c;使用command shift G…

c++ Constraints 和 concepts介绍

C++20 引入了 Concepts,以改进模板编程的体验。Concepts 是一种用于模板编程的新机制,它允许程序员在编译时对模板参数进行约束和限制,从而提高模板的可读性、可维护性和错误检测能力。 Constraints(约束)是 Concepts 的一部分,它定义了模板参数必须满足的条件。一个约束…

入门微调预训练Transformer模型

大家好&#xff0c;HuggingFace 为众多开源的自然语言处理&#xff08;NLP&#xff09;模型提供了强大的支持平台&#xff0c;让这些模型能够通过训练和微调来更好地服务于各种特定的应用场景。在大型语言模型&#xff08;LLM&#xff09;迅猛发展的今天&#xff0c;HuggingFac…

100 个网络基础知识,看完成半个网络高手

100 个网络基础知识&#xff0c;看完成半个网络高手。 1)什么是链接? 链接是指两个设备之间的连接。它包括用于一个设备能够与另一个设备通信的电缆类型和协议。 2)OSI 参考模型的层次是什么? 有 7 个 OSI 层&#xff1a;物理层&#xff0c;数据链路层&#xff0c;网络层&…

Rustdesk二次编译,新集成AI功能开源Gpt小程序为远程协助助力,全网首发

环境&#xff1a; Rustdesk1.1.9 sciter版 问题描述&#xff1a; Rustdesk二次编译&#xff0c;新集成AI功能开源Gpt小程序为远程协助助力,全网首发 解决方案&#xff1a; Rustdesk二次编译&#xff0c;新集成开源AI功能Gpt小程序&#xff0c;为远程协助助力&#xff0c…

何为HTTP状态码?一文清楚基本概念。

在客户端与服务器之间的信息传输过程中&#xff0c;我们可以将其比喻为客户与快递员之间的包裹传递。那么服务器是如何通知客户端&#xff0c;操作是成功还是失败&#xff1f;或者有其他的一些情况呢&#xff1f;&#xff08;就像客户可以查询快递的状态&#xff09; 而这背后…

C++分析程序各模块耗时-perf火焰图

C分析程序各模块耗时-perf火焰图 1. 简介2. 安装3. 测试示例4. 从火焰图可以获得的信息5. 生成火焰图常见问题 Reference: Perf Wiki【性能】perf 火焰图分析软件性能瓶颈【火焰图&#x1f525;】Linux C/C性能优化分析工具Perf使用教程 perf: Linux profiling with perform…