实验05 单元测试

知识点

  • 单元测试的定义

  • 单元测试(Unit Testing)是一种软件开发的验证过程,旨在隔离并检测软件组件(通常是函数、方法或类)的单个单元的功能是否按照预期执行。每个测试用例验证特定的条件或功能,确保代码的每个部分都能独立地按预期工作。
  • 单元测试与集成测试、系统测试的区别。
    • 集成测试(Integration Testing):

      • 目的:验证多个单元或组件在一起工作时的交互和协作是否正确。
      • 范围:通常在完成单元测试后进行,关注组件间的接口和交互。
      • 特点:可能需要模拟外部系统或使用实际的外部系统。
    • 系统测试(System Testing):

      • 目的:验证整个系统的功能是否满足用户需求和系统规格。
      • 范围:在所有集成测试完成后进行,涵盖整个系统。
      • 特点:测试用例基于用户需求和系统规格,可能包括性能测试、安全性测试等。
    • 接受测试/验收测试(Acceptance Testing):

      • 目的:确保软件满足业务需求和用户验收标准。
      • 范围:通常在系统测试之后,由用户或用户代表执行。
      • 特点:测试用例通常由用户编写,关注用户的工作流程和业务规则。
    • 性能测试(Performance Testing):

      • 目的:评估软件应用的速度、响应时间、稳定性、资源消耗等性能指标。
      • 范围:可以是单个组件也可以是整个系统。
      • 特点:关注在高负载或特定条件下系统的行为。
    • 回归测试(Regression Testing):

      • 目的:确保软件变更没有引入新的错误。
      • 范围:可以是单个单元、多个组件或整个系统。
      • 特点:通常在代码修改或添加新功能后进行。
  • 单元测试的目的

  • 目的
    • 早期发现错误:在开发周期的早期阶段捕捉和修复缺陷。
    • 提供文档:测试用例可以作为代码行为的文档。
    • 支持重构:确保在修改代码后原有功能仍然正常工作。
  • 单元测试的基本原则

  • 关键特点

    • 独立性

      • 每个单元测试应该独立于其他测试运行,不依赖于系统的其他部分或外部环境的状态。
      • 测试不应依赖于数据库、文件系统、网络或任何全局状态。
    • 原子性
      • 每个单元测试应该只测试一个具体的功能点或逻辑分支。
      • 避免在一个测试中验证多个功能,以确保测试的明确性和易于理解。
    • 可重复性
      • 无论何时何地执行,测试都应该产生相同的结果。
      • 这意味着测试不应该依赖于系统状态或时间敏感的操作。
  • 测试框架的选择和介绍

    • JUnit (Java)

      • 特点:JUnit是Java语言中最流行的单元测试框架之一,广泛用于Java和Android应用开发。JUnit 4主要使用注解来标识测试方法,而JUnit 5(Jupiter)则引入了更多的功能和改进。
      • 适用场景:适用于Java和Kotlin项目,特别是需要大量自动化测试的企业级应用。
    • TestNG

      • 特点:TestNG是JUnit的一个增强版,提供了更多的功能,如参数化测试、并行测试执行等。它同样使用注解来定义测试方法。
      • 适用场景:适用于需要复杂测试配置和并行测试的大型Java应用。
    • pytest (Python)

      • 特点:pytest是一个简单而强大的Python测试框架,支持简单的断言和参数化测试,并且可以很容易地与持续集成系统结合。
      • 适用场景:适用于Python项目,特别是科学计算和数据分析领域。
    • NUnit (.NET)

      • 特点:NUnit是.NET平台上的一个单元测试框架,受到JUnit的启发。它支持属性、断言和测试运行程序。
      • 适用场景:适用于C#、F#和VB.NET项目,特别是需要集成.NET特定功能和特性的应用程序。
    • Mocha (JavaScript/Node.js)

      • 特点:Mocha是一个灵活的JavaScript测试框架,适用于Node.js和浏览器。它支持异步测试,并且可以与其他断言库(如Chai)结合使用。
      • 适用场景:适用于JavaScript项目,特别是在需要处理异步操作和Promise的场景。
    • RSpec (Ruby)

      • 特点:RSpec是一个用于Ruby语言的行为驱动开发(BDD)框架,提供了一种表达性强的语法来编写测试。
      • 适用场景:适用于Ruby on Rails项目,特别是那些采用BDD方法论的团队。
    • Google Test (C++)

      • 特点:Google Test是一个用于C++的测试框架,提供了丰富的断言和测试组织功能。
      • 适用场景:适用于C++项目,特别是需要高性能和复杂测试结构的应用程序。
    • Karma (JavaScript)

      • 特点:Karma是一个测试运行器,可以为JavaScript应用提供实时的测试反馈。它通常与Mocha和Chai等断言库一起使用。
      • 适用场景:适用于需要在不同浏览器上进行测试的JavaScript前端应用。
    • Selenium

      • 特点:虽然Selenium主要用于自动化Web浏览器交互,但它也可以用来执行Web应用的单元测试。
      • 适用场景:适用于Web应用的自动化测试,特别是需要模拟用户交互的场景。
    • 选择测试框架时的考虑因素

      • 语言和平台支持:选择与你的编程语言和开发平台兼容的框架。
      • 社区和文档:选择有良好文档和活跃社区支持的框架,以便在遇到问题时能够快速找到解决方案。
      • 功能需求:根据项目需求选择提供所需功能的框架,例如参数化测试、并行测试等。
      • 集成需求:考虑框架与现有开发工具和持续集成系统的集成能力。
      • 团队熟悉度:选择团队成员熟悉或愿意学习的框架,以减少学习曲线。
  • 编写测试用例

    • 正向测试(Positive Testing)

      ​​​​​​
      • 定义:验证程序在正常或预期条件下的行为。
      • 方法
        • 确定代码的正常使用场景。
        • 设计测试用例以验证主要功能和流程。
        • 确保测试覆盖了最常见的使用情况。
      • 边界条件测试(Boundary Value Analysis)

      • 定义:验证程序在边界或极端条件下的行为。
      • 方法
        • 确定输入或循环的边界值,如数组的最小长度、最大长度、空数组等。
        • 测试循环的开始和结束条件。
        • 检查输入值的上限和下限。
      •  等价类划分(Equivalence Partitioning)

      • 定义:将输入数据划分为若干等价类,每个类的行为预期是相同的。
      • 方法
        • 识别有效和无效的输入值集合。
        • 从每个等价类中选择至少一个测试用例。
      • 错误猜测(Error Guessing)

      • 定义:基于经验和直觉,猜测可能存在缺陷的代码区域。
      • 方法
        • 识别代码中可能出错的逻辑。
        • 设计测试用例来验证这些猜测。
      • 测试用例的结构

      • 标题:明确测试用例的目的。
      • 前提条件:测试执行前必须满足的条件。
      • 测试步骤:详细描述执行测试的每个步骤。
      • 预期结果:定义测试执行后的预期行为或输出。
      • 实际结果:记录测试执行后的实际行为或输出。
      • 测试状态:标记测试通过或失败的状态。
  • 断言的使用

    • 断言的作用:

      • 验证预期结果: 断言允许测试者明确地指出代码执行后应该产生的结果。

      • 提供明确的错误信息: 当测试失败时,断言可以提供关于期望值和实际值差异的具体信息,这有助于快速定位问题。

      • 简化测试逻辑: 通过使用断言,测试代码可以更加简洁和直观,因为断言通常集成在测试框架中。

      • 自动化测试验证: 断言使得测试结果的验证自动化,无需手动检查输出。

      • 提高测试覆盖率: 断言有助于确保测试覆盖了所有重要的执行路径和边界条件。

    • 相等性断言

      • 验证两个值是否相等。
      • assertEquals(expectedValue, actualValue);
    • 不等性断言

      • 验证两个值是否不相等。
      • assertNotEquals(notExpectedValue, actualValue);

    • 真值断言

      • 验证一个条件是否为真。
      • assertTrue(condition);

    • 假值断言

      • 验证一个条件是否为假。
      • assertFalse(condition);

    • 异常断言

      • 验证代码执行时是否抛出了特定的异常。
      • assertThrows(ExpectedException.class, () -> {// 调用可能抛出异常的方法
        });

    • 范围断言

      • 验证一个值是否在特定的范围内。
      • assertGreater(expectedMin, actualValue);
        assertLess(expectedMax, actualValue);

    • 正则表达式断言

      • 验证一个字符串是否匹配特定的正则表达式。
      • assertMatchesRegex("expectedPattern", actualString);

    • 同一度断言

      • 验证两个引用是否指向同一个对象。
      • assertSame(expectedObject, actualObject);

  • 测试的组织和管理

    • 测试代码的组织结构

    • 按功能组织

      • 测试代码通常按照被测试的功能模块组织,每个模块或类有自己的测试类。
    • 目录结构

      • 在项目中创建一个专门的测试目录,如testtests,在这个目录下进一步按模块划分子目录。
    • 测试类和方法

      • 测试类通常以被测试类的名字命名,后跟Test作为后缀。
      • 测试方法的命名应清晰表达测试的意图,如testAdditionPositiveNumbers
    • 使用命名空间(针对某些语言):

      • 在支持命名空间的语言中,使用命名空间来组织测试代码,避免命名冲突。
    • 模块化测试代码

      • 将测试代码分解为模块或包,每个模块包含相关的测试类和辅助类。
    • 命名约定:

    • 测试类命名

      • 遵循ClassNameTestTestClassName的命名模式。
    • 测试方法命名

      • 使用test_前缀,后跟测试的场景或行为描述,如test_addition_with_negative_numbers
    • 常量和变量

      • 测试中使用的常量和变量应有明确和一致的命名规则。
    • 避免使用缩写

      • 在命名测试用例和变量时,为了提高可读性,避免使用缩写。
    • 测试的管理和执行策略:

    • 自动化测试执行

      • 使用持续集成(CI)工具自动执行测试,确保代码提交后立即验证。
    • 测试依赖管理

      • 确保测试代码不依赖于特定的运行顺序,每个测试都能独立运行。
    • 测试数据管理

      • 使用工厂模式或测试数据构建器模式来管理测试数据,确保数据的一致性和可复用性。
    • 测试环境隔离

      • 为测试提供一个隔离的环境,确保测试不会受到外部因素的干扰。
    • 测试覆盖率目标

      • 设定代码覆盖率目标,使用工具持续监控测试覆盖率。
    • 测试分层

      • 根据测试的范围和目的,将测试分层,如单元测试、集成测试、系统测试等。
    • 测试报告

      • 生成详细的测试报告,包括通过率、失败的测试用例、测试覆盖率等信息。
    • 测试维护

      • 定期审查和更新测试用例,确保它们与代码的当前状态保持一致。
    • 测试代码审查

      • 将测试代码纳入代码审查过程,确保测试的质量。
    • 测试优先级

      • 根据风险和重要性为测试用例设置优先级,优先执行关键功能的测试。
    • 测试版本控制

      • 将测试代码纳入版本控制系统,与应用代码同步演进。
  • Mocking和Stubs

    • Mock对象

      • Mock对象是一个模拟的、假的实现对象,用于在单元测试中代替实际的依赖对象。
      • 它主要用于验证被测试对象的行为,而不是依赖对象的行为。
    • Stubs

      • Stubs(存根)是提供预定响应的简单对象,通常用于模拟函数或方法的返回值。
      • 它们用于设置测试环境,以便在测试中模拟外部依赖的特定行为。
    • 应用场景:

    • 当单元测试需要隔离外部依赖时,使用Mock对象和Stubs来模拟这些依赖的行为。
    • 在测试中验证对象之间的交互,而不是它们的内部逻辑。
    • 使用Mocking工具隔离外部依赖:

      假设有一个UserService类,它依赖于一个UserRepository来获取用户数据。在单元测试中,我们不想与数据库交互,而是想模拟UserRepository的行为:

      @Test
      public void testGetUser() {// 创建Mock对象UserRepository mockRepository = Mockito.mock(UserRepository.class);// 设置Mock行为Mockito.when(mockRepository.findById(1)).thenReturn(new User(1, "TestUser"));// 创建被测试对象,并注入Mock的依赖UserService userService = new UserService(mockRepository);// 调用方法并验证结果User user = userService.getUser(1);assertEquals("TestUser", user.getName());// 验证交互Mockito.verify(mockRepository).findById(1);
      }

    • 展示如何使用Mocking工具来隔离外部依赖。
  • 测试覆盖率

    • 重要性:

    • 衡量测试的完整性

      • 测试覆盖率提供了一个量化的指标,用于衡量测试用例覆盖代码的程度。
    • 发现未测试的代码

      • 高覆盖率可以减少未被测试的代码部分,从而降低引入缺陷的风险。
    • 提高代码质量

      • 通过关注未被测试覆盖的代码区域,开发者可以提高代码的质量和健壮性。
    • 使用工具衡量和提高测试覆盖率:

    • 集成覆盖率工具

      • 在构建过程或持续集成流程中集成覆盖率工具,如JaCoCo、Cobertura或Istanbul。
    • 分析覆盖率报告

      • 运行测试后,生成覆盖率报告,分析哪些代码区域没有被测试覆盖。
    • 改进测试用例

      • 根据覆盖率报告,添加或改进测试用例,以覆盖未测试的代码。
    • 设置覆盖率目标

      • 为项目设定合理的覆盖率目标,并持续跟踪达成情况。
    • 持续改进

      • 将覆盖率作为代码审查和质量控制的一部分,持续改进测试覆盖率。

实验 

一 实验目的:

1、了解什么是单元测试,单元测试的级别、单元测试的内容。

2、掌握单元测试框架JUnit的使用。

3、掌握参数化测试方法的运用及测试脚本的编写。

二 实验环境

1、JDK8.0或以上;

2、Intellij IDEA集成开发环境;

3、Maven构建工具。

三 实验准备

1、掌握JUnit测试框架的基本使用;

2、具备Java编程基础;

3、安装及配置好测试环境。

四 实验内容

(一)网上蛋糕购物系统中,针对蛋糕商品查询业务的持久类GoodsDao中的getGoodsById、getCountOfGoodsByTypeID方法编写单元测试类(一般情况下,单元测试要对每个方法进行测试)。

(1)创建GoodsDaoTest测试类,编写对应的测试方法。请提供GoodsDaoTest测试类代码,要求代码中要对每个方法进行注释说明。

import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;public class GoodsDaoTest {@Mockprivate GoodsDataAccess goodsDataAccess; // 假设这是访问数据库的接口@InjectMocksprivate GoodsDao goodsDao; // 被测试的持久类@BeforeEachpublic void setUp() {MockitoAnnotations.initMocks(this); // 初始化Mock对象}// 测试getGoodsById方法@Testpublic void testGetGoodsById_WithValidId_ShouldReturnCorrectGoods() {// 准备int validId = 1;Goods expectedGoods = new Goods(validId, "Chocolate Cake", 20.0);Mockito.when(goodsDataAccess.getGoodsById(validId)).thenReturn(expectedGoods);// 执行Goods result = goodsDao.getGoodsById(validId);// 验证assertNotNull(result, "返回的对象不应为空");assertEquals(expectedGoods, result, "返回的蛋糕应与预期相符");}@Testpublic void testGetGoodsById_WithInvalidId_ShouldReturnNull() {// 准备int invalidId = -1;Mockito.when(goodsDataAccess.getGoodsById(invalidId)).thenReturn(null);// 执行Goods result = goodsDao.getGoodsById(invalidId);// 验证assertNull(result, "使用无效ID查询时,应返回null");}// 测试getCountOfGoodsByTypeID方法@Testpublic void testGetCountOfGoodsByTypeID_WithValidTypeId_ShouldReturnCorrectCount() {// 准备int validTypeId = 1;int expectedCount = 10;Mockito.when(goodsDataAccess.getCountOfGoodsByTypeID(validTypeId)).thenReturn(expectedCount);// 执行int result = goodsDao.getCountOfGoodsByTypeID(validTypeId);// 验证assertEquals(expectedCount, result, "返回的数量应与预期相符");}@Testpublic void testGetCountOfGoodsByTypeID_WithInvalidTypeId_ShouldReturnZero() {// 准备int invalidTypeId = -1;Mockito.when(goodsDataAccess.getCountOfGoodsByTypeID(invalidTypeId)).thenReturn(0);// 执行int result = goodsDao.getCountOfGoodsByTypeID(invalidTypeId);// 验证assertEquals(0, result, "使用无效类型ID查询时,应返回0");}
}

代码解释

  • @Mock注解用于创建模拟对象。
  • @InjectMocks注解用于创建被测试类的实例,并将模拟对象注入到它的依赖中。
  • @BeforeEach注解的方法在每个测试方法执行之前都会运行,用于设置测试环境。
  • @Test注解的方法是实际的测试用例。
  • Mockito.when(...).thenReturn(...)用于定义模拟对象的行为。
  • assertNotNullassertEqualsassertNull是JUnit提供的断言方法,用于验证测试结果是否符合预期。

 

(2)请设计3条测试用例测试getCountOfGoodsByTypeID方法,执行测试。

测试用例:

序号

测试用例编号

测试用例名称

输入数据

预期结果

测试结果

测试用例1: 有效商品类型ID

序号测试用例编号测试用例名称输入数据预期结果测试结果
1TC001正常商品类型查询1>0[待测试]

说明:此测试用例验证当提供有效的商品类型ID时,方法应返回该类型下商品的正数数量。

测试用例2: 无效商品类型ID(负数)

序号测试用例编号测试用例名称输入数据预期结果测试结果
2TC002负数商品类型查询-10[待测试]

说明:此测试用例验证当商品类型ID为负数时,方法应返回0,表示没有商品匹配。

测试用例3: 边界商品类型ID(例如最大的正整数)

序号测试用例编号测试用例名称输入数据预期结果测试结果
3TC003最大正整数商品类型查询Integer.MAX_VALUE0或实际数量[待测试]

说明:此测试用例验证当商品类型ID为整数最大值时,方法的表现,可能是返回0或者实际的商品数量,取决于数据库中的数据。

 

(3)针对以上测试方法的不足(多条测试用例需要多次执行),根据参数化测试的规则,使用以上测试用例数据,修改测试方法并执行测试。请提供修改后的测试方法代码

import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;public class GoodsDaoTest {@Mockprivate GoodsDataAccess goodsDataAccess;@InjectMocksprivate GoodsDao goodsDao;@BeforeEachpublic void setUp() {MockitoAnnotations.initMocks(this);}// 参数化测试用例@ParameterizedTest@CsvSource({"1, 10, 应返回正数的商品数量","-1, 0, 应返回0表示没有商品","2147483647, 5, 应返回实际的商品数量或0"})public void testGetCountOfGoodsByTypeID(int typeId, int expectedResult, String caseDescription) {// 准备Mockito.when(goodsDataAccess.getCountOfGoodsByTypeID(typeId)).thenReturn(expectedResult);// 执行int result = goodsDao.getCountOfGoodsByTypeID(typeId);// 验证assertEquals(expectedResult, result, caseDescription);}
}

  1. 新建一个Foo类,使用Mockito框架对该类进行测试

public class Foo {

    private Bar bar;

    public void setBar(Bar bar) {

        this.bar = bar;

    }

    public String doSomething() {

        return "Foo::doSomething " + bar.doSomethingElse();

    }

}

public class Bar {

    public String doSomethingElse() {

        return "Bar::doSomethingElse";

}

}

测试脚本截图为:

import static org.mockito.Mockito.*;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;public class FooTest {@Mockprivate Bar mockBar; // 创建Bar的Mock对象@InjectMocksprivate Foo foo; // 被测试的Foo对象@BeforeEachpublic void setUp() {// 初始化Mock对象MockitoAnnotations.openMocks(this);}@Testpublic void testDoSomething() {// 准备when(mockBar.doSomethingElse()).thenReturn("Bar::doSomethingElse");// 执行String result = foo.doSomething();// 验证verify(mockBar).doSomethingElse(); // 验证Bar的doSomethingElse方法被调用assertEquals("Foo::doSomething Bar::doSomethingElse", result);}
}

五 实验总结

(1)什么叫桩程序?桩程序有什么作用?

桩程序(Stub): 桩程序是一种模拟对象,用于在单元测试中代替实际的依赖项或外部系统。它通常用于模拟那些在测试环境中不可用或不适合使用的组件,如数据库、网络服务或复杂计算。

作用

  1. 隔离测试:桩程序允许开发者在不依赖外部系统或复杂逻辑的情况下测试代码。
  2. 控制测试环境:通过返回预定的响应,桩程序可以控制测试环境,确保测试的一致性和可重复性。
  3. 提高测试速度:使用桩程序可以避免耗时的外部调用,从而加快测试执行速度。
  4. 简化测试逻辑:桩程序可以简化测试逻辑,使测试用例更专注于验证被测试代码的行为。
  5. 模拟错误情况:桩程序还可以模拟错误情况或异常响应,帮助测试代码的健壮性和错误处理能力。

(2)使用参数化测试有什么好处?

参数化测试是一种测试方法,它允许使用不同的输入参数多次执行同一个测试方法。以下是使用参数化测试的一些好处:

  1. 减少重复代码:参数化测试可以减少编写和维护多个相似测试用例的代码量。
  2. 提高测试效率:通过一次性执行多个测试用例,参数化测试可以提高测试的效率和覆盖率。
  3. 简化测试数据管理:集中管理测试数据,便于更新和维护。
  4. 增强测试的灵活性:可以轻松地添加、修改或删除测试参数,以适应不同的测试需求。
  5. 提高测试的可读性:通过清晰的参数化表达,测试用例的意图和行为更容易被理解。
  6. 支持边界值分析:参数化测试可以方便地测试边界值和异常值,提高代码的边界条件覆盖率。
  7. 自动化测试执行:参数化测试通常与自动化测试框架结合使用,实现测试的自动化执行。
  8. 易于维护和扩展:随着软件需求的变更,参数化测试可以更容易地进行更新和扩展。
  9. 提供一致的测试结果:确保每个测试用例在相同的测试逻辑下运行,提供一致的测试结果。

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

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

相关文章

Apache Kylin: 大数据时代的分析引擎

在大数据时代,企业面临着数据量激增的挑战,传统的数据分析方法已经无法满足快速、高效的处理需求。Apache Kylin作为开源的分布式分析引擎,为超大规模数据集提供了快速的洞察能力。本文将介绍Kylin的基本概念、架构、特性以及如何部署和使用K…

音视频开发—使用FFmpeg将YUV文件编码成H264裸流文件 C语言实现

文章目录 1.准备工作2.压缩编码工作流程3.详细步骤1. 初始化日志和参数检查2. 输入/输出文件的打开3. 查找和初始化编码器4. 打开编码器5. 帧内存的分配和初始化6. 设置转换上下文(SWS)7. 读取和转换数据8. 编码过程9. 资源清理 4.完整示例代码 1.准备工…

熊海CMS漏洞练习平台的一次xss、sql注入、越权黑盒思路分析

简介 熊海CMS是由熊海开发的一款功能丰富的网站综合管理系统,广泛应用于个人博客、个人网站以及企业网站,本文章用于黑盒测试,如果需要「源码审计」后台回复【「CMS」】获取即可,精心准备了40多个cms源码漏洞平台,供宝…

代码随想录第七天(454、383、15、18)

题目一:四数相加II 链接: 代码随想录 思路:首先用双循环遍历构成ab的值和出现的次数,用字典接收,由于abcd0,因为在对c和d进行双循环后,在字典中找到0-c-d,得出它的值也就是出现次数…

在浏览器控制台中输出js对象,为什么颜色不同,有深有浅

打开console,输入自定义的javascript对象的时候,打开看发现对象的属性是深紫色,后面有一些对象是浅紫色的,比如Array对象和一堆SVG,HTML,CSS开头的对象,常用的prototype和__proto__也是浅紫色的。 请问这里深紫和浅紫…

【Unity】制作简易计时器

一、创建计时器相关的变量 我们需要创建三个变量,分别是:计时时长、计时剩余时长、是否处于计时状态。 public float duration;//计时时长 public float remain; //计时剩余时长 public bool isCount; //是否处于计时状态 二、初始化变量 我们可以直…

什么是Maven以及如何配置Maven

T04BF 👋专栏: 算法|JAVA|MySQL|C语言 🫵 今天你敲代码了吗 文章目录 1.Maven1.1什么是Maven1.2Maven的好处1.3使用idea创建一个Maven项目1.4Maven的核心功能1.4.1项目构建 1.5Maven仓库1.5.2 中央仓库1.5.3 私有服务器(私服) 1.6Maven设置国内源 1.Mave…

[pytorch]常用函数(自用)

一、公共部分 1、torch.linespace 返回一维张量,在start和end之间(包括start也包括end)的均匀间隔的steps个点,长度为steps。 print(torch.linspace(1,10,3)) #输出tensor([ 1.0000, 5.5000, 10.0000]) print(torch.linspace…

文本分类--NLP-AI(八)

文本分类任务 任务简介1.字符数值化方式1方式2 2.池化(pooling)3.全连接层4.归一化函数(Sigmoid)5.总结 从任务抽象新的技术点Embedding层池化层 任务简介 任务介绍: 字符串分类,根据一句话的含妈量&#…

伊利25届校招24年社招网申入职北森测评题库全攻略!一文通!

伊利校招社招网申测评全攻略🚀 亲爱的求职小伙伴们,今天我要分享一份伊利校招社招网申测评的全攻略,希望能助你们一臂之力! 测评概览 伊利的网申测评分为六个部分,总共约60分钟的答题时间,涵盖了言语逻辑、…

避免 WebSocket 连接被拒绝

一、检查服务器配置和权限 (一)确认服务器访问权限 确保您的客户端有访问服务器的合法权限。如果服务器设置了访问控制列表(ACL)或仅允许特定的源(Origin)进行连接,您需要确保客户端的请求来源在允许的范围内。例如,如果服务器只允许来自特定域名的连接,而您的客户端从…

【微信小程序开发】如何定义公共的js函数,其它页面可以调用

在微信小程序开发中,可以通过以下步骤定义和使用公共的 JS 函数,使得其它页面可以调用: 1. 创建一个公共的 JS 文件:在项目的 utils 目录下创建一个 JS 文件,例如 utils/util.js。 2. 定义公共函数:在 uti…

在word中删除endnote参考文献之间的空行

如图,在References中,每个文献之间都有空行。不建议手动删除。打开Endnote。 打开style manager 删除layout中的换行符。保存,在word中更新参考文献即可。

Python和C++全球导航卫星系统和机器人姿态触觉感知二分图算法

🎯要点 🎯马尔可夫随机场网格推理学习 | 🎯二维伊辛模型四连网格模型推理 | 🎯统计物理学模型扰动与最大乘积二值反卷积 | 🎯受限玻尔兹曼机扰动和最大乘积采样 | 🎯视觉概率生成模型测试图像 &#x1f3…

从课本上面开始学习的51单片机究竟有什么特点,在现在的市场上还有应用吗?

引言 51单片机,作为一种经典的微控制器,被广泛应用于各种嵌入式系统中。尽管如今ARM架构的高性能低成本单片机在市场上占据主导地位,但51单片机凭借其独特的优势依然在某些领域保持着应用价值。本文将深入探讨51单片机的特点、架构、应用以及…

ubuntu22.04 安装boost

下载boost压缩包,我这里上传了一份1_81_0版本tar -xzvf boost_1_81_0.tar.gzcd boost_1_81_0/sudo apt install build-essential g autotools-dev libicu-dev libbz2-dev -ysudo ./bootstrap.sh --prefix/usr/./b2sudo ./b2 install 上述7步完成后,相关…

数学建模·模糊评价法

模糊评价法 一种解决评价问题或者得出最佳方案的方法 主观性仍比较强 具体定义 三集:因素集,评语集和权重集,通过模拟矩阵的处理得到最合理的评语 具体步骤 因素集 因素集的确定不难,难在对分级评价时,对因素集的分级…

LeetCode --- 134双周赛

题目 3206. 交替组 I 3207. 与敌人战斗后的最大分数 3208. 交替组 II 3209. 子数组按位与值为 K 的数目 一、交替组 I & II 题目中问环形数组中交替组的长度为3的子数组个数,主要的问题在于它是环形的,我们要考虑首尾相接的情况,如何…

阿里新开源GPU版本的FunASR安装避坑

#当前安装过程没有cpu版本顺利 1.个人在自己的电脑上安装ubantu系统,以便使用本身的显卡功能(本人显卡NVIDIA GeForce RTX 4060)(这里需要注意,更新里面有附加驱动安装驱动会导致黑屏,小伙伴不要心急重装系统,可以ctr…

ES索引模板

在Elasticsearch中,索引模板(Index Templates)是用来预定义新创建索引的设置和映射的一种机制。当你创建了一个索引模板,它会包含一系列的默认设置和映射规则,这些规则会在满足一定条件的新索引被创建时自动应用。 索…