使用单元测试框架Junit的正确姿势

大家好,我是G探险者。

不知道大家平时开发出来的功能,写不写单元测试?反正我是不咋写,写个单元测试有时候mock比开发实际功能都难搞,谁写谁懂得。

没办法,由于甲方爸爸的要求,我们必须得写单元测试,并且要配备相应的单元测试报告。惭愧啊,写个单元测试让我掉了不少头发。今天我就把写单元测试的一些流程梳理一下,供大家做个参考,让大家少踩点坑。

1. 什么是单元测试?

单元测试是软件开发中的一种测试方法,旨在验证代码中的最小可测试单元(通常是函数、方法或类)是否按照预期进行了设计、实现和行为。在单元测试中,开发者编写测试用例来测试代码的各种情况和边界条件,然后运行这些测试用例以验证代码的正确性。

单元测试的主要特点包括:

  1. 独立性:每个单元测试应该是独立的,不依赖于其他测试用例的执行结果。

  2. 自动化:单元测试应该可以自动运行,开发者不需要手动进行测试。

  3. 快速:单元测试应该能够快速执行,以便在开发过程中频繁地运行。

  4. 精确性:单元测试应该能够准确地验证代码的行为,覆盖各种情况和边界条件。

通过编写和执行单元测试,开发者可以提高代码的质量和稳定性,及早发现并修复潜在的问题,同时也增强了代码的可维护性和可扩展性。

2. 常见的java语言单元测试框架有哪些?

  1. JUnit:Java语言最常用的单元测试框架之一。它提供了一组断言方法来验证代码的行为,并支持测试的组织和运行。

  2. Spring Boot Test:针对Spring Boot应用程序的测试支持。它提供了一组注解和工具,用于编写和运行与Spring Boot应用程序相关的单元测试、集成测试和端到端测试。

  3. TestNG:另一个流行的Java单元测试框架,与JUnit类似,但提供了更多的功能和灵活性,如参数化测试、测试分组、依赖测试等。

  4. Mockito:用于Java的模拟框架,用于模拟和验证对象的行为。Mockito允许你创建模拟对象,并定义它们的行为和交互。

  5. PowerMock:扩展了其他模拟框架(如Mockito和EasyMock)的功能,以提供更多的模拟能力,如静态方法和final类的模拟。

  6. Spock:基于Groovy语言的测试框架,结合了JUnit、Mockito和其他测试框架的功能,并提供了更简洁和易读的语法。

  7. AssertJ:一个流畅的断言库,提供了丰富的断言方法,可以编写清晰、易读的测试代码。

  8. EasyMock:另一个Java模拟框架,用于创建模拟对象和定义它们的行为,相比Mockito,EasyMock在一些特定场景下可能更适用。

  9. WireMock:用于模拟HTTP服务的框架,可以帮助开发者进行对外部HTTP服务的集成测试。

  10. Arquillian:用于Java EE应用程序的集成测试框架,可以在真实的容器环境中运行测试,支持各种Java EE组件的测试。

这些框架在Java开发中广泛应用于单元测试、集成测试和功能测试等不同类型的测试场景,开发者可以根据具体需求选择合适的框架进行测试。

这些单元测试框架都有其各自的特点和适用场景。
下面是关于几种常见的单元测试框架的简要对比:

框架语言主要特点适用场景依赖
JUnitJava- 提供了一组断言方法来验证代码行为
- 支持测试的组织和运行
- 单元测试junit:junit
Spring Boot TestJava- 针对Spring Boot应用程序的测试支持- Spring Boot应用程序的单元测试、集成测试、端到端测试spring-boot-starter-test
TestNGJava- 支持更多功能和灵活性,如参数化测试、测试分组、依赖测试等- 单元测试、集成测试org.testng:testng
MockitoJava- 用于模拟和验证对象的行为- 单元测试、模拟测试、验证测试org.mockito:mockito-core
PowerMockJava- 扩展了其他模拟框架的功能,支持更多模拟能力- 单元测试、模拟静态方法和final类等场景org.powermock:powermock-api-mockito2:2.0.0
SpockGroovy- 结合了JUnit、Mockito等框架的功能
- 提供了更简洁和易读的语法
- 单元测试、集成测试org.spockframework:spock-core
AssertJJava- 提供丰富的断言方法,编写清晰易读的测试代码- 单元测试org.assertj:assertj-core
EasyMockJava- 用于创建模拟对象和定义行为- 单元测试、模拟测试org.easymock:easymock
WireMockJava- 用于模拟HTTP服务- 集成测试、功能测试com.github.tomakehurst:wiremock
ArquillianJava EE- 用于Java EE应用程序的集成测试,支持真实容器环境- Java EE应用程序的集成测试org.jboss.arquillian:junit-container

3. JUint、 Mockito、PowerMock、 Spring Boot Test 的区别,如何选?如何搭配使用?

Spring Boot Test 和 JUnit 是两种不同的测试框架,它们之间有一些区别,主要体现在以下几个方面:

  1. 功能范围

    • JUnit:是一个通用的Java单元测试框架,用于编写和运行单元测试。它提供了一组断言方法和注解,用于验证代码的行为和组织测试。
    • Spring Boot Test:是Spring Boot框架提供的专门用于测试Spring Boot应用程序的测试框架。它建立在JUnit之上,提供了额外的功能和注解,用于编写和运行与Spring Boot应用程序相关的单元测试、集成测试和端到端测试。
  2. 集成环境

    • JUnit:可以与任何Java项目一起使用,不限于Spring Boot。
    • Spring Boot Test:专门针对Spring Boot应用程序设计,提供了特定于Spring Boot的测试支持,包括自动配置、内存数据库、Mock对象等。
  3. 注解

    • JUnit:提供了一些基本的注解,如 @Test 用于标记测试方法,@Before 和 @After 用于在测试方法执行前后执行一些准备和清理操作等。
    • Spring Boot Test:除了继承了JUnit的注解外,还提供了一些Spring Boot特有的注解,如 @SpringBootTest 用于加载Spring Boot应用程序上下文,@MockBean 用于模拟Bean对象等。
  4. 功能扩展

    • JUnit:提供了基本的单元测试功能,可以通过集成其他库来扩展功能,如Mockito用于模拟对象,AssertJ用于更丰富的断言等。
    • Spring Boot Test:除了提供基本的单元测试功能外,还集成了许多Spring Boot特有的功能,如自动配置、内存数据库(如H2)、Spring Boot测试切片等。

下面是关于Spring Boot Test 和 JUnit 的简要对比:

特点Spring Boot TestJUnit
用途用于测试Spring Boot应用程序的单元测试、集成测试和端到端测试通用的Java单元测试框架
扩展集成了Spring Boot特有的功能,如自动配置、内存数据库、测试切片等提供基本的单元测试功能,可以通过集成其他库来扩展
注解提供了Spring Boot特有的注解,如 @SpringBootTest、@MockBean 等提供了基本的注解,如 @Test、@Before、@After 等
集成环境专门针对Spring Boot应用程序设计可以与任何Java项目一起使用
功能范围提供了额外的功能,如测试Spring Boot应用程序的自动配置、集成等提供基本的单元测试功能
选择建议适用于Spring Boot项目,测试Spring Boot应用程序的功能适用于普通Java项目,进行基本的单元测试

这些是 Spring Boot Test 和 JUnit 的一些主要区别和特点。在选择使用哪个框架时,应该根据项目的需求和特点来决定。

至于Mockito和PowerMock如何选择和搭配请参照如下:

框架主要特点如何选?如何搭配使用?
Mockito- 用于模拟和验证对象的行为- 适用于需要模拟对象行为的场景通常与JUnit或Spring Boot Test一起使用进行单元测试
PowerMock- 扩展了其他模拟框架的功能,支持更多模拟能力- 适用于需要模拟静态方法、final类等的场景通常与JUnit和Mockito一起使用来扩展模拟功能

小结

  • 如果你正在开发一个普通的Java项目,并且只需要进行基本的单元测试,那么使用JUnit是一个不错的选择。
  • 如果你正在开发一个Spring Boot应用程序,并且需要测试Spring Boot的自动配置、集成以及与Spring框架相关的功能,那么Spring Boot Test是更合适的选择。
  • 在Spring Boot项目中,通常可以使用JUnit和Spring Boot Test结合使用,使用JUnit编写常规的单元测试,使用Spring Boot Test进行Spring Boot相关的集成测试。
  • 如果你需要模拟对象的行为以及验证对象的交互,可以选择搭配使用Mockito。
  • 如果你的项目中有需要模拟静态方法、final类等特殊情况,可以选择搭配使用PowerMock。

4. 常用的注解及作用

下面是关于JUnit、Mockito、PowerMock和Spring Boot Test注解的对比表格:

框架注解主要作用
JUnit@Test标记测试方法
@Before在每个测试方法执行之前执行,用于初始化测试环境
@After在每个测试方法执行之后执行,用于清理测试环境
@BeforeClass在测试类加载时执行,只执行一次,用于初始化静态资源
@AfterClass在测试类执行完成后执行,只执行一次,用于清理静态资源
@Ignore标记测试方法为忽略测试,暂时跳过执行
Mockito@Mock创建模拟对象
@Spy创建部分模拟对象,部分方法保留原始行为
@InjectMocks注入模拟对象或部分模拟对象到被测试对象中
PowerMock@PrepareForTest准备被测试类,以支持对静态方法、final类、构造函数等的模拟
Spring Boot Test@SpringBootTest加载Spring应用程序上下文,以便在测试中使用Spring组件
@MockBean创建Spring应用程序上下文中的模拟Bean
@Autowired自动注入Spring组件
@RunWith(SpringRunner.class)指定使用SpringRunner来运行测试类

使用示例:

JUnit注解:

  1. @Test:标记测试方法。
@Test
public void testAddition() {Calculator calculator = new Calculator();int result = calculator.add(3, 4);assertEquals(7, result);
}
  1. @Before:在每个测试方法执行之前执行,用于初始化测试环境。
@Before
public void setUp() {// 初始化测试环境
}
  1. @After:在每个测试方法执行之后执行,用于清理测试环境。
@After
public void tearDown() {// 清理测试环境
}
  1. @BeforeClass:在测试类加载时执行,只执行一次,用于初始化静态资源。
@BeforeClass
public static void setUpClass() {// 初始化静态资源
}
  1. @AfterClass:在测试类执行完成后执行,只执行一次,用于清理静态资源。
@AfterClass
public static void tearDownClass() {// 清理静态资源
}
  1. @Ignore:标记测试方法为忽略测试,暂时跳过执行。
@Ignore
public void testThisMethodWillBeIgnored() {// 这个测试方法将被忽略
}

Mockito注解:

  1. @Mock:创建模拟对象。
@Mock
private CalculatorService calculatorService;
  1. @Spy:创建部分模拟对象,部分方法保留原始行为。
@Spy
private List<String> list = new ArrayList<>();
  1. @InjectMocks:注入模拟对象或部分模拟对象到被测试对象中。
@InjectMocks
private CalculatorController calculatorController;

PowerMock注解:

  1. @PrepareForTest:准备被测试类,以支持对静态方法、final类、构造函数等的模拟。
@PrepareForTest(Calculator.class)
public class CalculatorTest {// 测试代码
}

Spring Boot Test注解:

  1. @SpringBootTest:加载Spring应用程序上下文,以便在测试中使用Spring组件。
@SpringBootTest
public class MySpringBootTest {// 测试代码
}
  1. @MockBean:创建Spring应用程序上下文中的模拟Bean。
@MockBean
private CalculatorService calculatorService;
  1. @Autowired:自动注入Spring组件。
@Autowired
private CalculatorController calculatorController;
  1. @RunWith(SpringRunner.class):指定使用SpringRunner来运行测试类。
@RunWith(SpringRunner.class)
public class MySpringBootTest {// 测试代码
}

以上示例展示了每个注解在不同测试框架中的用法及其功能。

5. 几个完整的单元测试示例

controller的单元测试:

import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;@RunWith(MockitoJUnitRunner.class)
public class ControllerUnitTestTemplate {private MockMvc mockMvc;@Mockprivate ServiceClassTemplate service; // 如果需要,模拟您的服务@InjectMocksprivate ControllerClassTemplate controller;@Beforepublic void setup() {MockitoAnnotations.initMocks(this);this.mockMvc = MockMvcBuilders.standaloneSetup(controller).build();}@Testpublic void testExampleMethod() throws Exception {// 准备请求数据RequestClassTemplate request = new RequestClassTemplate();// 根据需要设置请求对象的属性// 发送请求并验证响应状态mockMvc.perform(MockMvcRequestBuilders.post("/endpoint/path").content(asJsonString(request)).contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk());}// 将对象转换为JSON字符串的实用方法private static String asJsonString(final Object obj) {try {return new ObjectMapper().writeValueAsString(obj);} catch (Exception e) {throw new RuntimeException(e);}}
}

您只需将 ControllerUnitTestTemplateServiceClassTemplateControllerClassTemplatetestExampleMethod() 和 RequestClassTemplate 替换为实际的类名和方法名,以及将 "/endpoint/path" 替换为要测试的实际接口路径。

service单元测试

@SpringBootTest(classes = {ExampleApplication.class})
@RunWith(PowerMockRunner.class)
public class ExampleServiceTest {@InjectMocksprivate ExampleService exampleService; // 被测试的服务对象@Mockprivate ExampleDao exampleDao; // 模拟的 DAO 对象@Testpublic void testSaveExample() throws Exception{// 准备测试数据DTOExample dtoExample = new DTOExample();ExampleEntity exampleEntity = new ExampleEntity();exampleEntity.setProperty("value");List<ExampleEntity> exampleEntityList = new ArrayList<>();exampleEntityList.add(exampleEntity);dtoExample.setExamples(exampleEntityList);// 模拟 DAO 对象的行为PowerMockito.doReturn(1).when(exampleDao).updateObject(dtoExample);// 执行被测试的方法exampleService.saveExample(dtoExample);}@Testpublic void testUpdateExample() throws Exception{// 准备测试数据DTOExample dtoExample = new DTOExample();ExampleEntity exampleEntity = new ExampleEntity();exampleEntity.setProperty("value");List<ExampleEntity> exampleEntityList = new ArrayList<>();exampleEntityList.add(exampleEntity);dtoExample.setExamples(exampleEntityList);// 模拟 DAO 对象的行为PowerMockito.doReturn(1).when(exampleDao).updateObject(dtoExample);// 执行被测试的方法exampleService.updateExample(dtoExample);}@Testpublic void testGetExampleData() throws Exception{// 准备测试数据DTOExample dtoExample = new DTOExample();ExampleEntity exampleEntity = new ExampleEntity();exampleEntity.setProperty("value");List<ExampleEntity> exampleEntityList = new ArrayList<>();exampleEntityList.add(exampleEntity);dtoExample.setExamples(exampleEntityList);// 模拟 DAO 对象的行为ExampleEntity exampleEntityResponse = new ExampleEntity();PowerMockito.doReturn(exampleEntityResponse).when(exampleDao).getObjectById("");// 执行被测试的方法exampleService.getExampleData("");}
}

6. 除了单元测试外,还有哪些类型的测试?

除了单元测试,还有许多其他类型的测试,其中一些主要类型包括:

  1. 集成测试(Integration Testing):测试不同组件之间的集成和交互,确保它们在一起工作时没有问题。集成测试可以测试模块、服务、子系统或整个应用程序的集成。

  2. 功能测试(Functional Testing):测试应用程序的功能是否按照规范和需求工作。功能测试通常从用户的角度出发,验证应用程序是否满足用户的功能要求。

  3. 验收测试(Acceptance Testing):通过验证应用程序是否符合业务需求和用户期望来确认项目交付的可接受性。验收测试通常由最终用户、产品所有者或业务代表执行。

  4. 回归测试(Regression Testing):在对代码进行更改之后,重新运行之前的测试,以确保新更改没有破坏现有功能。回归测试有助于捕获由于代码更改引入的新错误或导致的不良影响。

  5. 性能测试(Performance Testing):评估应用程序在各种条件下的性能和响应能力。性能测试可以包括负载测试、压力测试、并发测试等,以确定应用程序在正常和峰值负载下的性能表现。

  6. 安全测试(Security Testing):评估应用程序的安全性,检测和修复潜在的安全漏洞和弱点。安全测试可以包括漏洞扫描、渗透测试、认证和授权测试等。

  7. 可用性测试(Usability Testing):评估应用程序的用户界面和交互设计,以确保用户能够轻松、高效地使用应用程序。

  8. 兼容性测试(Compatibility Testing):评估应用程序在不同平台、设备、浏览器和操作系统下的兼容性和一致性。

  9. 非功能测试(Non-functional Testing):非功能测试包括各种类型,如性能测试、安全测试、可用性测试、兼容性测试等,以及特定于项目的测试类型,例如可扩展性测试、可靠性测试、容错性测试等。这些测试类型旨在评估软件系统在特定方面的表现和质量,并确保其符合用户的期望和需求。通过进行非功能测试,软件团队可以发现和解决潜在的性能问题、安全漏洞、用户体验问题等,从而提高软件系统的整体质量和可靠性。非功能测试通常与功能测试结合使用,以全面评估软件系统的质量和性能。
    这些测试类型通常结合使用,以确保软件在各个方面的质量和稳定性。

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

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

相关文章

如何系统地自学Python?

如何系统地自学Python&#xff1f; 如何系统地自学Python&#xff1f;1.了解编程基础2.学习Python基础语法3.学习Python库和框架4.练习编写代码5.参与开源项目6.加入Python社区7.利用资源学习8.制定学习计划9.持之以恒总结 如何系统地自学Python&#xff1f; 作为一个Python语…

爬虫基本库的使用(urllib库的详细解析)

学习爬虫&#xff0c;其基本的操作便是模拟浏览器向服务器发出请求&#xff0c;那么我们需要从哪个地方做起呢?请求需要我们自己构造吗? 我们需要关心请求这个数据结构怎么实现吗? 需要了解 HTTP、TCP、IP层的网络传输通信吗? 需要知道服务器如何响应以及响应的原理吗? 可…

32单片机基础:GPIO输出

目录 简介&#xff1a; GPIO输出的八种模式 STM32的GPIO工作方式 GPIO支持4种输入模式&#xff1a; GPIO支持4种输出模式&#xff1a; 浮空输入模式 上拉输入模式 下拉输入模式 模拟输入模式&#xff1a; 开漏输出模式&#xff1a;&#xff08;PMOS无效&#xff0c;就…

技术心得--如何成为优秀的架构师

关注我&#xff0c;持续分享逻辑思维&管理思维&#xff1b; 可提供大厂面试辅导、及定制化求职/在职/管理/技术辅导&#xff1b; 有意找工作的同学&#xff0c;请参考博主的原创&#xff1a;《面试官心得--面试前应该如何准备》&#xff0c;《面试官心得--面试时如何进行自…

三防加固平板在房地产行业的应用|亿道三防onerugged

近期&#xff0c;有一款引人注目的解决方案——亿道三防onerugged平板电脑&#xff0c;它以其出色的性能和多功能的设计&#xff0c;为房地产行业带来了全新的应用体验。 首先&#xff0c;亿道三防onerugged平板电脑的NFC功能在小区业主身份验证中发挥着重要作用。传统的身份验…

vue3组件通信方式汇总

前言&#xff1a;本文默认读者有JS基础和Vue基础&#xff0c;如果没有这个两个基础&#xff0c;可能阅读比较困难&#xff0c;建议先看下官方文档&#xff0c;当然&#xff0c;也欢迎评论交流&#x1f601; 通信方式总结 常见搭配形式 一、props&#xff08;使用频率最高&#…

HarmonyOS 鸿蒙应用开发(十二、paho-mqtt的mqtt客户端库移植)

PAHO MQTT 是 Eclipse Foundation 的一个开源项目&#xff0c;提供了用于 MQTT 协议的客户端库。这个库为使用 MQTT 协议的应用程序提供了丰富的功能和灵活性。轻量级mqtt服务器mosquitto也是其中有名的一个开源项目。 目录 PAHO MQTT介绍 移植过程 index.d.ts文件修改 写…

SOPHON算能科技新版SDK环境配置以及C++ demo使用过程

目录 1 SDK大包下载 2 获取SDK中的库文件和头文件 2.1 注意事项 2.2 交叉编译环境搭建 2.2.1 首先安装工具链 2.2.2 解压sophon-img包里的libsophon_soc__aarch64.tar.gz&#xff0c;将lib和include的所有内容拷贝到soc-sdk文件夹 2.2.3 解压sophon-mw包里的sophon-mw-s…

hadoop FileSystem是否要close

先来说结论&#xff0c;最好不要close&#xff0c;让hadoop自己close&#xff0c;否则容易把进程里其他获取fs的地方一起关了。这是因为 FileSystem.get(Configuration)做了缓存的原因。当然可以设置 conf.setBoolean("fs.hdfs.impl.disable.cache", true); 就不缓存…

Django后台管理(一)

一、admin介绍 Django 最强大的部分之一是自动管理界面。它从你的模型中读取元数据,提供一个快速的、以模型为中心的界面,受信任的用户可以管理你网站上的内容 官网:https://docs.djangoproject.com/zh-hans/4.1/ref/contrib/admin/ 提示 后台管理系统是管理人员使用,不是…

Python之海象运算符

在 Python 3.8 及更高版本中&#xff0c;引入了一种新的语法特性&#xff0c;称为"海象运算符"&#xff08;Walrus Operator&#xff09;&#xff0c;它使用 : 符号。这个运算符的主要目的是在表达式中同时进行赋值和返回赋值的值。 使用海象运算符可以在一些情况下…

centos7下docker的安装

背景 总结下docker的一些知识 docker安装&#xff08;有网络版&#xff09; 参考文章我以前试过这个帖子&#xff0c;建议安装高版本的docker&#xff0c;&#xff08;20以上的&#xff0c;不然可能会有一些问题&#xff09; ## 1、安装依赖 [rootiZo7e61fz42ik0Z ~]#yum i…

laravel-admin的3个开发细节调整

在使用laravel-admin开发的过程中&#xff0c;根据官方开发文档Laravel admin | laravel-admin基本都能实现想要的效果&#xff0c;这里补充3个文档上没有描述的细节 Laravel8命令行创建控制器调整 在laravel-admin中可以使用php artisan admin:make UserController --modelAp…

WireShark 安装指南:详细安装步骤和使用技巧

Wireshark是一个开源的网络协议分析工具&#xff0c;它能够捕获和分析网络数据包&#xff0c;并以用户友好的方式呈现这些数据包的内容。Wireshark 被广泛应用于网络故障排查、安全审计、教育及软件开发等领域。接下将讲解Wireshark的安装与简单使用。 目录 Wireshark安装步骤…

Rasa:停止构建“代理”,并推出真正有效的LLM聊天机器人

Rasa:停止构建“代理”,并推出真正有效的LLM聊天机器人 带语言模型的对话式人工智能 (Conversational AI with Language Models CALM) 是一种用于构建可靠对话式人工智能的大模型方法。它是 Rasa 基于多年来帮助企业团队构建面向客户的助手而开发的。 CALM 的工作原理 CAL…

CSP-201809-1-卖菜

CSP-201809-1-卖菜 解题思路 #include <iostream> using namespace std; int main() {int n;cin >> n;int* array new int[n];for (int i 0; i < n; i){cin >> array[i];}cout << (array[0] array[1]) / 2 << " ";for (int i …

目录IO

目录IO 1.mkdir 创建目录文件 mkdir(const char *pathname, mode_t mode); (文件路径,文件的权限) 成功返回 0 失败返回 -1 r: 目录中是否能够查看文件 w: 目录中是否能够新建文件 x: 目录是否能够进入 2.rmdir 删除空目录文件 rmdir(const char *pathname); &am…

vivado FIR Filters

Vivado合成直接从RTL中推导出乘加级联来组成FIR滤波器。这种滤波器有几种可能的实现方式&#xff1b;一个例子是收缩滤波器在7系列DSP48E1 Slice用户指南&#xff08;UG479&#xff09;中进行了描述&#xff0c;并在8抽头偶数中显示对称收缩FIR&#xff08;Verilog&#xff09;…

2.20 Qt day1

一. 思维导图 二. 消化常用类的使用&#xff0c;以及常用成员函数对应的功能 按钮类QPushButton&#xff1a; mywidget.h&#xff1a; #ifndef MYWIDGET_H #define MYWIDGET_H#include <QWidget> #include<QPushButton>//按钮类 #include<QIcon>class MyW…

springboot+vue项目基础开发(17)路由使用

路由 在前端中,路由指的是根据不同的访问路径,展示不同的内容 vue Router的vue.js的官方路由 安装vue Router 再启动 在src下面新建router文件,创建index.js 代码 import {createRouter,createWebHashHistory} from vue-router //导入组件 import Login from @/views/Log…