当前位置: 首页 > news >正文

头歌JUnit单元测试相关实验进阶

JUnit是一个由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework),主要供 Java 开发人员编写单元测试。Junit在极限编程和重构中被极力推荐使用,因为它可以大大地提高开发的效率。

Junit的特性:

1、用于测试期望结果的断言(Assertion)

2、用于共享共同测试数据的测试工具

3、用于方便的组织和运行测试的测试套件

4、图形和文本的测试运行期

一、进阶实验

1.1Junit参数化测试

任务描述

根据所学内容,要求用户补全Junit的参数化测试代码。

相关知识
Junit参数化测试

如果测试代码大同小异,代码结构都是相同的,不同的只是测试的数据和预期值,那么Junit的参数化测试可以派上用场了:Junit的参数化测试允许开发人员使用不同的参数反复运行同一个测试。你将遵循以下 5 个步骤来创建参数化测试。

  1. 用 @RunWith(Parameterized.class) 来注释 test 类。
  2. 创建一个由 @Parameters 注释的公共的静态方法,它返回一个对象的集合(数组)来作为测试数据集合。
  3. 创建一个公共的构造函数,它接受和一行测试数据相等同的东西。
  4. 为每一列测试数据创建一个实例变量。
  5. 用实例变量作为测试数据的来源来创建你的测试用例。

在JUnit中,可以使用@RunWith@parameter这两个注解来为单元测试传递参数。

  • @RunWith注解:当类被@RunWith注解修饰,或者类继承了一个被该注解修饰的类,JUnit将会使用这个注解所指明的运行器(runner)来运行测试。
  • @Parameters注解:然后在该类提供数据的方法上加上一个@Parameters注解,这个方法必须是静态static的,不能带参数,并且返回一个集合Collection

在测试类的构造方法中为各个参数赋值,(构造方法是由JUnit调用的),最后编写测试类,它会根据参数的组数来运行测试多次。

注意:必须要为类的所有字段赋值,不管你是不是都用到!否则,Junit会出错。

代码示例

我们现在来看一个简单的 add 方法。

//MathUtils.java
package com.trustie.junittest;
public class MathUtils {public static int add(int a, int b) {return a + b;}
}

接下来我们创建一个为上面的JUnit测试类 MathUtilsTest.java

//MathUtilsTest.java
package com.trustie.junittest;
import java.util.Arrays;
import java.util.Collection;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import com.trustie.junittest.MathUtils;
/*** 参数化测试的类必须有Parameterized测试运行器修饰*/
@RunWith(Parameterized.class)
public class MathUtilsTest {private int input1;private int input2;private int expected;/*** 准备数据。数据的准备需要在一个方法中进行,该方法需要满足一定的要求:* 1)该方法必须由Parameters注解修饰* 2)该方法必须为public static的* 3)该方法必须返回Collection类型* 4)该方法的名字不做要求* 5)该方法没有参数* @return* 这里设置了四组参数,只有当四组参数都通过测试,才代表测试通过*/@Parameterspublic static Collection prepareData(){Object [][] bject = {{-1,-2,-3},{0,2,2},{-1,1,0},{1,2,3}};return Arrays.asList(bject);}public MathUtilsTest(int input1,int input2,int expected){this.input1 = input1;this.input2 = input2;this.expected = expected;}@Testpublic void testAdd(){MathUtils add = new MathUtils();int result = add.add(input1, input2);Assert.assertEquals(expected,result);}
}
编程要求

给定一个减法函数Calculator.java如下:

Calculator.java/** * 数学计算-->减法 */  
public class Calculator {  public int sub(int a, int b) {  return a - b;  }  
}

请按照上面索索的知识,补全题目中参数化测试 ParameterTest.javaprepareData()函数。

本关涉及的代码文件ParameterTest.java的代码如下:

见下述答案

评测说明

本关卡的测试文件是TestRunner.java,该文件进行了函数封装且学员不可见,用于验证学员的Junit测试代码是否正确。

具体测试过程如下:

1.平台自动编译生成TestRunner.exe;

2.平台运行TestRunner.exe

3.获取TestRunner.exe输出,并将其输出与预期输出对比:如果一致则测试通过,否则测试失败。

预期输入: 预期输出:true

package step1;import static org.junit.Assert.assertEquals; //静态导入
import java.util.Arrays;
import java.util.Collection;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import step1.Calculator;
/*** JUnit4的参数化测试*/
@RunWith(Parameterized.class)
public class ParameterTest {private int input11;private int input22;private int expected;public ParameterTest(int input11, int input22, int expected){this.input11 = input11;this.input22 = input22;this.expected = expected;}@Parameterspublic static Collection prepareData(){/***该二维数组的类型必须是Object类型的*该二维数组中的数据是为测试Calculator中的sub()方法而准备的*该二维数组中的每一个元素中的数据都对应着构造方法ParameterTest()中的参数的位置*所以依据构造方法的参数位置判断,该二维数组中的第一个数减去第二个数等于第三个数*请在Begin/End内补全代码,要求为单元测试传递4组参数,来验证Calculator中的sub函数编写是否正确*提示:只需要补2行代码*//*********************************Begin*************************************************/return Arrays.asList(new Object[][] {{5, 3, 2},{10, 5, 5},{8, 4, 4},{15, 7, 8}});/**********************************End**************************************************/}@Testpublic void testSub(){Calculator cal = new Calculator();assertEquals(cal.sub(input11, input22), expected);}
}

1.2Junit异常测试

任务描述

学员写一个Junit异常测试,用来判断实例化的对象数据是否合法。

相关知识
Junit异常测试

Junit 用代码处理提供了一个追踪异常的选项。你可以测试代码是否它抛出了想要得到的异常。通过@Test元数据中的expected属性验证是否抛出期望的异常,expected属性的值是一个异常的类型,如果抛出了期望的异常,则测试通过,否则不通过。

现在让我们看下 @Test(expected=* .class)注解的具体使用。

代码示例
// ExceptionTest.java
public class ExceptionTest {@Test(expected = ArithmeticException.class)  // 使用@Test注解,期望抛出ArithmeticException异常public void divisionWithException() {  int i = 1/0; // 除数为0,将抛出ArithmeticException异常}  }

在上述例子中,divisionWithException()方法将抛出ArithmeticException异常,因为这是一个预期的异常,因此单元测试会通过。其实,Junit的异常测试我们追踪到了预期的异常信息,所以代码会执行成功而不是中断

编程要求

本关的任务是写一个Junit异常测试,用来判断实例化的对象数据是否合法。具体在JunitException.java中补全异常测试代码:要求判断Person类中实例化的对象年龄是否合法,如果不合法则抛出IllegalArgumentException异常。

Person类代码如下:

// 定义一个Person类
public class Person {// 定义私有变量name,表示人的姓名private String name;// 定义私有变量age,表示人的年龄private int age;// 定义公共方法getName,用于获取当前对象的姓名public String getName() {return name;}// 定义公共方法setName,用于设置当前对象的姓名public void setName(String name) {this.name = name;}// 定义公共方法getAge,用于获取当前对象的年龄public int getAge() {return age;}// 定义公共方法setAge,用于设置当前对象的年龄public void setAge(int age) {// 如果传入的年龄小于0,抛出异常,提示年龄无效if (age < 0) {throw new IllegalArgumentException("age is invalid");}// 否则,将传入的年龄赋值给当前对象的age变量this.age = age;}
}

测试类JunitException.java的代码如下

见下述答案

评测说明

本关卡的测试文件是TestRunner.java,该文件进行了函数封装且学员不可见,用于验证学员的Junit测试代码是否正确。

具体测试过程如下:

1.平台自动编译生成TestRunner.exe; 2.平台运行TestRunner.exe; 3.获取TestRunner.exe输出,并将其输出与预期输出对比:如果一致则测试通过,否则测试失败。

预期输入: 预期输出:true

package step2;
import static org.junit.Assert.*;import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import step2.Person;public class JunitException {/***请在Begin/End内加一行注解,要求检查Person对象的年龄是否合法,不合法则*抛出IllegalArgumentException异常*//************************************Begin**********************************************/@Test(expected = IllegalArgumentException.class)  /************************************End************************************************/public void checkage() {Person person = new Person();person.setAge(-1);}
}

 1.3Junit套件测试

任务描述

根据所学内容,要求用户补全Junit的套件测试代码。 ####相关知识 #####本关必读

测试套件意味着捆绑几个单元测试用例并且一起执行他们。在 JUnit 中,@RunWith 和 @Suite 注释用来运行套件测试。

代码示例

对下面两个类进行单元测试 ,组成套件测试。

类代码:

//Car.java
public class Car {public int getWheels() {return 4;}
}//Rectangle.java
public class  Rectangle{public int getArea(int width,int height){return width*height;}
}

测试类代码:

// CarTest.java
public class CarTest {Car car; // 声明一个Car类型的变量car@Before // 使用@Before注解,表示在执行testGetWheels方法之前,会先执行setUp方法public void setUp() throws Exception {car = new Car(); // 创建一个新的Car对象,并将其赋值给car变量}@Test // 使用@Test注解,表示这是一个测试方法public void testGetWheels() {int result = car.getWheels(); // 调用car对象的getWheels方法,获取轮子数量,并将结果赋值给result变量assertEquals(4, result); // 使用断言方法assertEquals,判断result是否等于4,如果不等于4,则测试失败}
}
//RectangleTest.java
public class RectangleTest {Rectangle rectangle;@Beforepublic void setUp() throws Exception {rectangle=new Rectangle();}@Testpublic void testGetArea() {int result = rectangle.getArea(12, 2);assertEquals(24, result);}
}

测试套件代码:

@RunWith(Suite.class)
@Suite.SuiteClasses({ CalculateTest.class, CarTest.class, RectangleTest.class })
public class AllTests {
}

注意:套件测试代码需要紧靠测试类,不能有换行!

编程要求

本关卡的要求是让学员补全Junit的套件测试代码。具体要求如下:

给定一个类Calculate.java和对应的测试类CalculateTest.java,如下:

//Calculate.java
public class Calculate {public int add(int a, int b) {return a + b;}
}
//CalculateTest.java
public class CalculateTest {Calculate calculate;@Beforepublic void setUp() throws Exception {calculate = new Calculate();}@Testpublic void testAdd() {int result = calculate.add(12, 12);assertEquals(24, result);}
}

请在SuiteTest.java内补全CalculateTest和CarTest的套件测试代码。

本关涉及到的SuiteTest.java代码如下:

见下述答案

评测说明

本关卡的测试文件是TestRunner.java,该文件进行了函数封装且学员不可见,用于验证学员的Junit测试代码是否正确。

具体测试过程如下:

1.平台自动编译生成TestRunner.exe; 2.平台运行TestRunner.exe; 3.获取TestRunner.exe输出,并将其输出与预期输出对比:如果一致则测试通过,否则测试失败。

预期输入: 预期输出:true

package step3;import static org.junit.Assert.*;import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import step3.Calculate;
import step3.CalculateTest;
import step3.Car;
import step3.CarTest;/*
请在星号后加两行注解,要求实现CalculateTest类和CarTest类的套件测试
套件测试代码需要紧靠SuiteTest这个类,不能有换行
*/
/*************************************************************** 使用Suite类进行测试套件的创建* @RunWith(Suite.class) 表示使用Suite类作为测试运行器* @Suite.SuiteClasses({ CalculateTest.class, CarTest.class }) 表示将CalculateTest类和CarTest类添加到测试套件中*/
@RunWith(Suite.class)
@Suite.SuiteClasses({ CalculateTest.class, CarTest.class })
public class SuiteTest {}

 1.4命令行下进行Junit测试

任务描述

补全TestRunner.java中的代码,如果测试类JunitSubTest.java中的测试都通过,则main函数会打印true。

环境配置

环境配置:Linux主机+JDK 1.8+Junit 4.12。

首先确保自己在linux主机装好了java环境,配置好环境变量。

然后下载两个jar包:

junit 4.12 :Release JUnit 4.12 · junit-team/junit4 · GitHub

hamcrest-core-1.3.jar : http://central.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar

让后把这两个包放到jdk安装的lib目录下,本机的JDK安装目录如下:

/home/soft/jdk1.8.0_111/lib# ls
amd64           hamcrest-core-1.3.jar  jexec           packager.jar
ant-javafx.jar  ir.idl                 junit-4.12.jar  sa-jdi.jar
ct.sym          javafx-mx.jar          missioncontrol  tools.jar
dt.jar          jconsole.jar           orb.idl  

然后修改本机环境变量,

vim ~/.bashrc 

修改成如下:

export JAVA_HOME=/home/soft/jdk1.8.0_111
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/junit-4.12.jar:$JAVA_HOME/lib/hamcrest-core-1.3.jar:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOME/bin

这里着重看下CLASSPATH,JAVA_HOME和PATH如果设置过,就不用修改了。

然后source ~/.bashrc 让环境变量生效。

新建两个java文件:Calculate.java和CalculateTest.java。

//Calculate.java
package com.trustie.junitest;
public class Calculate {public int sum(int var1, int var2) {System.out.println("相加的值是: " + var1 + " + " + var2);return var1 + var2;}public static void main(String[] args) {System.out.println("hh");  }
}
//CalculateTest.java
package com.trustie.test;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import com.trustie.junitest.Calculate;
public class CalculateTest {Calculate calculation = new Calculate();int sum = calculation.sum(2, 5);int testSum = 7;@Testpublic void testSum() {System.out.println("@Test sum(): " + sum + " = " + testSum);assertEquals(sum, testSum);}
}

然后编译执行:

javac -d . Calculate.java
javac -d . CalculateTest.java
java org.junit.runner.JUnitCore com.trustie.test.CalculateTest

就可以看到如下打印:

JUnit version 4.12
相加的值是: 2 + 5
.@Test sum(): 7 = 7
Time: 0.003
OK (1 test)

至此,Junit环境配置成功,可以在本机命令行下运行Junit测试。

其实在命令行中运行JUnit测试,使用了org.junit.runner.JUnitCore类。 这个类提供了runClasses()方法,它允许运行一个或多个测试类。runClasses()方法返回类型是org.junit.runner.Result对象类型。 这个对象可以被用来收集关于测试信息。此外,如果有一个失败的测试,可以用org.junit.runner.notification.Failure对象保存失败测试的描述。

代码示例

之前各个关卡中的TestRunner.java我们现在揭开谜底吧:

// TestRunner.java
import org.junit.runner.JUnitCore; // 导入JUnit核心类库
import org.junit.runner.Result; // 导入测试结果类
import org.junit.runner.notification.Failure; // 导入失败通知类public class TestRunner {public static void main(String[] args) {// 使用JUnitCore运行Test类的测试用例,并将结果存储在result变量中Result result = JUnitCore.runClasses(Test.class);// 遍历result中的所有失败用例,并打印失败信息for (Failure failure : result.getFailures()) {System.out.println(failure.toString());}// 打印测试是否成功的信息System.out.println(result.wasSuccessful());}
}

如果你的测试类Test.java中所有测试都通过,以上代码会打印true。

本关任务

补全TestRunner.java中的代码,如果测试类JunitSubTest.java中的测试都通过,则main函数会打印true。

本关涉及的代码文件TestRunner.java的代码如下:

见下述答案

评测说明

本关卡的测试文件是TestRunner.java,用于验证学员的Junit测试代码是否正确。

具体测试过程如下:

1.平台自动编译生成TestRunner.exe; 2.平台运行TestRunner.exe; 3.获取TestRunner.exe输出,并将其输出与预期输出对比:如果一致则测试通过,否则测试失败。

预期输入: 预期输出:true

package step4;import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;public class TestRunner {public static void main(String[] args) {//请在Begin/End内加一行代码,要求如果测试类JunitSubTest.java中的测试都通过,则main函数会打印true/******************************Begin**************************************************/// 创建一个JunitSubTest对象JunitSubTest junitSubTest = new JunitSubTest();// 使用JUnitCore运行junitSubTest类中的所有测试用例,并将结果存储在result变量中Result result = JUnitCore.runClasses(junitSubTest.getClass());/******************************End****************************************************/for (Failure failure : result.getFailures()) {System.out.println(failure.toString());}System.out.println(result.wasSuccessful());}
}

相关文章:

头歌JUnit单元测试相关实验进阶

JUnit是一个由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架&#xff08;regression testing framework&#xff09;&#xff0c;主要供 Java 开发人员编写单元测试。Junit在极限编程和重构中被极力推荐使用&#xff0c;因为它可以大大地提高开发的效率。 Junit的特性&…...

【kafka实践】11|消费位移提交

消费者位移 消费者位移这一节介绍了消费者位移的基本概念和消息格式&#xff0c;本节我们来聊聊消费位移的提交。 Consumer 需要向 Kafka 汇报自己的位移数据&#xff0c;这个汇报过程被称为提交位移&#xff08;Committing Offsets&#xff09;。因为 Consumer 能够同时消费…...

Mac卸载、安装Python

卸载 说明 对于删除 Python&#xff0c;我们首先要知道其具体都安装了什么&#xff0c;实际上&#xff0c;在安装 Python 时&#xff0c;其自动生成&#xff1a; Python framework&#xff0c;即 Python 框架&#xff1b;Python 应用目录&#xff1b;指向 Python 的连接。 …...

算法——滑动窗口

滑动窗口大致分为两类&#xff1a;一类是窗口长度固定的&#xff0c;即left和right可以一起移动&#xff1b;另一种是窗口的长度变化&#xff08;例如前五道题&#xff09;&#xff0c;即right疯狂移动&#xff0c;left没怎么动&#xff0c;这类题需要观察单调性(即指针)等各方…...

带头双向循环链表:一种高效的数据结构

&#x1f493; 博客主页&#xff1a;江池俊的博客⏩ 收录专栏&#xff1a;数据结构探索&#x1f449;专栏推荐&#xff1a;✅cpolar ✅C语言进阶之路&#x1f4bb;代码仓库&#xff1a;江池俊的代码仓库&#x1f525;编译环境&#xff1a;Visual Studio 2022&#x1f389;欢迎大…...

C++基础 -34- 输入输出运算符重载

输出运算符重载格式 ostream & operator<<(ostream &out,person a) {cout << a.a << endl;return out; }举例输出运算符重载 #include "iostream"using namespace std;class person {public:person(int a):a(a){}int a; };ostream &…...

MimicGen论文分析与资料汇总

MimicGen论文分析与资料汇总 前言论文分析相关资料汇总 前言 论文分析 相关资料汇总 Paper:MimicGen: A Data Generation System for Scalable Robot Learning using Human Demonstrations mimicgen.github 破局利刃&#xff01;英伟达合成数据新成果&#xff1a;为机器人造…...

JAVA-每一页PDF转图片

结论&#xff1a;1、iText几乎找不到如何PDF转图片的信息&#xff0c;但能找到获取到PDF里面的图片并保存下来的信息&#xff1b;2、PDF box满大街都是参考代码&#xff08;下面会附上一个作为参考&#xff09;&#xff1b;3、收费的库使用起来更简单&#xff0c;但就是要收费&…...

VS安装QT VS Tools编译无法通过

场景&#xff1a; 项目拷贝到虚拟机内部后&#xff0c;配置好相关环境后无法编译&#xff0c;安装QT VS Tools后依旧无法编译&#xff0c;查找资料网上说的是QT工具版本不一致导致的&#xff0c;但反复试了几个版本后依旧无法编译通过。错误信息如下&#xff1a; C:\Users\Ad…...

【C语言之 CJson】学CJson看这一篇就够了

文章目录 前言一、下载CJson二、创建一个json2.1 创建json对象cJSON类型详解 2.2 创建键值对2.3 添加嵌套的 JSON 对象2.4 添加数组创建数组添加元素到数组添加数组到obj 2.5 将 JSON 对象转为字符串2.6 释放内存2.7 示例代码 三、解析json3.1 解析json root3.2 把一个key解析出…...

使用Java语言实现字母之间的大小写转换

这个类的作用为实现字母之间的大小写转换&#xff0c;通过加减32来完成。 输入的代码 import java.util.Scanner; public class WordChangeDemo {public static void main(String[] args){try (Scanner in new Scanner(System.in)) {System.out.println("请输入您要进…...

Docker的数据持久化;Docker网络;Dockerfile编写

Docker的数据持久化&#xff1b;Docker网络&#xff1b;Dockerfile编写&#xff1b; 文章目录 Docker的数据持久化&#xff1b;Docker网络&#xff1b;Dockerfile编写&#xff1b;**Docker的数据持久化**1&#xff09;将本地目录映射到容器里2&#xff09;数据卷3&#xff09;将…...

OpenHarmony亮相MTSC 2023 | 质量效率共进,赋能应用生态发展

11月25日&#xff0c;MTSC 2023第十二届中国互联网测试开发大会在深圳登喜路国际大酒店圆满举行。大会以“软件质量保障体系和测试研发技术交流”为主要目的&#xff0c;旨在为行业搭建一个深入探讨和交流的桥梁和平台。OpenAtom OpenHarmony&#xff08;简称“OpenHarmony”&a…...

windows11 调整鼠标灵敏度方法

首先 我们打开电脑设置 或者在 此电脑/此计算机/我的电脑 右击选择属性 然后 有的电脑 左侧菜单中 直接就有 设备 然后在设备中直接就可以找到 鼠标 选项 调整光标速度即可 如果操作系统和我的一样 可以直接搜索鼠标 然后 选择 鼠标设置 然后 调整上面的鼠标指针速度即可...

贪心算法个人见解

目录 基本思想&#xff1a; 贪心算法的步骤&#xff1a; 示例&#xff1a; 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种基于贪心策略的算法范式&#xff0c;它在每一步选择中都采取当前状态下的最优选择&#xff0c;而不考虑全局最优解。贪心算法通常适用于那些…...

Win中Redis部署与配置

1.下载msi版本 下载传送门 2.双击next-->next安装安装 3.密码配置以及开机自启 在配置文件中配置相应配置进行配置密码以及端口和ip port 6379指定 Redis 监听端口&#xff0c;默认端口为 6379&#xff0c;作者在自己的一篇博文中解释了为什么选用 6379 作为默认端口&…...

vue el-button 封装及使用

使用了 Element UI 中的 el-button 组件&#xff0c;并对其进行了封装和定制。 创建组件index.vue (src/common-ui/button/index.vue) <template><el-buttonclass"h-button":type"type":icon"hIcon":disabled"disabled"clic…...

QT之QMediaPlayer的用法

QT之QMediaPlayer的用法 成员函数例程 成员函数 1)setMedia(const QMediaContent &media, QIODevice *stream nullptr) 设置要播放的媒体内容&#xff0c;其中参数media指定了媒体内容&#xff0c;stream参数指定了用于读取媒体的输入设备&#xff08;如文件流&#xff0…...

TCP_报文格式解读

报文格式 header部分字段含义解析 固定字段 对于header中固定部分字段含义&#xff0c;见之前的blog《TCP报文分析》&#xff1b; 对部分字段含义补充说明 Data Offset&#xff1a;4bit&#xff0c;tcp header的长度&#xff0c;单位&#xff1a;32bit&#xff08;4字节&…...

C语言面试之旅:掌握基础,探索深度(面试实战之c语言关键词下篇)

一.枚举&#xff08; enum&#xff09; 枚举是 C 语言中的一种基本数据类型&#xff0c;用于定义一组具有离散值的常量&#xff0c;它可以让数据更简洁&#xff0c;更易读。枚举类型通常用于为程序中的一组相关的常量取名字&#xff0c;以便于程序的可读性和维护性。定义一个枚…...

Java学习第十三天

Java多态 多态是同一个行为具有多个不同表现形式或形态的能力。 多态就是同一个接口&#xff0c;使用不同的实例而执行不同操作 多态性是对象多种表现形式的体现。 多态的优点 1. 消除类型之间的耦合关系2. 可替换性3. 可扩充性4. 接口性5. 灵活性6. 简化性 多态存在的三个…...

【Delphi】实现彩色日志显示框(TRichEdit Helper)

目录 一、前言 二、实现方法 1. 第一步 2. 第二步 3. 第三步 三、主程序代码 四、下载 1. 可执行程序 2. 程序源代码 一、前言 在用Delphi做日常开发的时候&#xff0c;经常需要显示程序运行的日志&#xff0c;一般我们会使用TMemo&#xff0c;使用起来简单&#xff0c…...

Elasticsearch 优化查询中获取字段内容的方式,性能提升5倍!

1、背景 集群配置为&#xff1a;8 个 node 节点&#xff0c;16 核 32G&#xff0c;索引 4 分片 1 副本。应用程序的查询逻辑是按经纬度排序后找前 200 条文档。 1、应用对查询要求比较高&#xff0c;search 没有慢查询的状态。 2、集群压测性能不能上去&#xff0c;cpu 使用未打…...

图像批量设计软件Retrobatch Pro mac中文版功能特色

Retrobatch Mac是一款灵活的批量图像处理工具。用户可以自由创建Workflow来实现相应的功能&#xff0c;这些Workflow能取代大量的重复劳动&#xff0c;提高生产力。Retrobatch Mac的一般操作是从左边栏拖动相应动作到工作区形成节点&#xff08;Nodes&#xff09;&#xff0c;节…...

python第3天之函数

深入理解 Python 中的函数 简介 在编程中&#xff0c;函数是组织和复用代码的基本单元。Python 作为一门高级编程语言&#xff0c;提供了丰富的函数特性来帮助开发者编写清晰、模块化和高效的代码。在本文中&#xff0c;我们将深入探讨 Python 函数的定义、调用、参数、返回值…...

SQL Server 数据库,为products表添加数据

在插入数据的时候&#xff0c;需要注意以下事项。 > 每次插入一整行数据&#xff0c;不可能只插入半行或几列数据。 > 数据值的数目必须与列数相同&#xff0c;每个数据值的数据类型、精度和小数位数也必须与相应的 列匹配。 > INSERT语句不能为标识列指定值&#…...

C语言结构体详解(二)(能看懂文字就能明白系列)文章很长,慢慢品尝

系列文章目录 第一章 结构体的介绍和基本使用 &#x1f31f; 个人主页&#xff1a;古德猫宁- &#x1f308; 信念如阳光&#xff0c;照亮前行的每一步 文章目录 系列文章目录&#x1f308; *信念如阳光&#xff0c;照亮前行的每一步* 前言前面一篇文章主要介绍了结构体的基础…...

WPF不使用AllowsTransparency实现高性能透明背景异形窗体

前言 最近在WPF项目中使用到异形窗体结合Webbroswer组件做web界面的公告展示,当时不想太麻烦引入Cef组件,就想用自带的Webbroswer来做展示,为了美观还做了异形窗体,结果测试就杯具了,自带的Webbroswer在AllowsTransparency=“True” 模式下根本就无法显示,界面一片空白,…...

唯创知音WT2605C语音芯片MP3音频IC:轻松实现指令随机播放与无缝循环播放等功能

在现代化的电子产品中&#xff0c;音频功能的重要性日益凸显。无论是智能家居、玩具、医疗设备还是仪器仪表&#xff0c;富有吸引力的音效与语音提示都能显著提升用户体验。唯创知音WT2605C语音芯片MP3音频IC便是为了满足这一需求而诞生的&#xff0c;它具备指令随机播放、无缝…...

uniapp+微信小程序监听返回事件

代码附在最后 适用场景&#xff1a;uniapp开发微信小程序 需求是我点击列表进入数据信息的详情界面&#xff0c;点击详情界面的收藏&#xff0c;返回上一界面后&#xff0c;更新列表中的收藏情况。 目录 一、使用onUnload监听页面卸载 二、使用getCurrentPages()获取当前页…...