Java笔试面试题AI答之单元测试JUnit(4)

news2024/11/25 22:41:09

文章目录

  • 19. 简述JUnit org.junit.TestSuite类的作用 ?
      • 1. 组织测试类
      • 2. 简化测试执行
      • 3. 灵活配置测试环境
      • 4. 嵌套测试套件
      • 注意事项
  • 20. 在JUnit中@Test注释的作用和用法 ?
      • 作用
      • 用法
  • 21. 简述Junit 基础注解(@BeforeClass、@Before、@Test、@After、@AfterClass) ?
  • 22. 编写代码实现Junit - 断言方法(Assert Methods)?
      • JUnit 4 示例
      • JUnit 5 示例
  • 23. 什么是Junit 参数化测试(Parameterized Test)?
      • 定义与目的
      • 实现方式
        • JUnit 4
        • JUnit 5
      • 优点
      • 示例
  • 24. 什么是Junit 套件测试(Suite Test)?

19. 简述JUnit org.junit.TestSuite类的作用 ?

org.junit.TestSuite 类在JUnit测试框架中扮演着重要的角色,特别是在JUnit 3及之前版本中。它的主要作用是将多个相关的测试类组织成一个测试套件(Test Suite),以便能够一次性执行这些测试类中的测试用例。以下是org.junit.TestSuite类作用的详细解释:

1. 组织测试类

在软件开发过程中,随着项目规模的扩大,测试类的数量也会逐渐增加。为了方便地管理和执行这些测试类,JUnit提供了TestSuite类,允许开发者将多个测试类组织成一个测试套件。这样,开发者就可以通过运行这个测试套件来一次性执行多个测试类中的测试用例,从而提高测试效率。

2. 简化测试执行

在没有TestSuite类之前,如果需要执行多个测试类,开发者需要手动编写代码或脚本来逐个执行这些测试类。这种方式不仅繁琐,而且容易出错。通过TestSuite类,开发者可以定义一个测试套件,然后在测试套件中指定要执行的测试类。JUnit测试框架会自动执行测试套件中指定的所有测试类,从而简化了测试执行的流程。

3. 灵活配置测试环境

在JUnit中,测试环境(如测试数据、测试资源等)的配置通常是在测试类中的setUp()tearDown()方法中完成的。然而,在某些情况下,开发者可能希望为整个测试套件配置一个统一的测试环境。虽然TestSuite类本身并不直接支持测试环境的配置,但开发者可以在测试套件中编写自定义的代码来实现这一需求。例如,可以在测试套件中定义一个静态的setUpBeforeClass()方法和tearDownAfterClass()方法,来分别为所有测试类配置和清理测试环境。

4. 嵌套测试套件

JUnit还支持测试套件的嵌套,即一个测试套件可以包含另一个测试套件。这种嵌套关系允许开发者根据项目的需求灵活地组织测试类。例如,可以将相关的测试类组织成一个测试套件,然后将这些测试套件再组织成一个更大的测试套件。通过这种方式,开发者可以构建出一个层次分明的测试结构,从而更好地管理和执行测试。

注意事项

  • 在JUnit 4及更高版本中,虽然org.junit.TestSuite类仍然可用,但JUnit引入了更灵活的测试执行方式,如使用@RunWith注解和Suite类来定义测试套件。因此,在JUnit 4及更高版本中,开发者可能会更倾向于使用这些新的特性来组织和管理测试。
  • 在编写测试套件时,需要注意测试类之间的依赖关系和测试顺序。如果测试类之间存在依赖关系,并且这些依赖关系对测试结果的正确性有影响,那么需要确保这些测试类按照正确的顺序执行。然而,在大多数情况下,单元测试应该是相互独立的,不依赖于其他测试类的执行结果。

20. 在JUnit中@Test注释的作用和用法 ?

在JUnit中,`@Test`注释扮演着非常重要的角色,它是JUnit框架用于识别测试方法的一个关键标识。当你在一个方法前使用`@Test`注释时,你告诉JUnit这个方法是一个测试方法,JUnit会在运行时执行它,并根据方法的执行结果来判断测试是否通过。

作用

  1. 标识测试方法@Test注释的主要作用是明确标记一个方法为测试方法。JUnit会寻找所有带有@Test注释的方法,并执行它们作为测试案例。

  2. 执行测试:JUnit会执行被@Test注释的方法,并捕获其执行过程中抛出的任何异常。如果方法执行成功且没有异常抛出,则JUnit认为测试通过。如果方法执行过程中抛出了异常(除非该异常被预期到,并且被特别处理),则JUnit认为测试失败。

  3. 提供测试元数据:虽然@Test注释本身不提供太多的元数据(即关于测试的信息),但它可以与其他JUnit注释(如@Before@After@BeforeClass@AfterClass@Ignore等)一起使用,以提供更丰富的测试上下文和生命周期管理。

用法

使用@Test注释非常简单。首先,确保你的项目中已经包含了JUnit库。然后,你可以在你的测试类中使用@Test注释来标记测试方法。以下是一个简单的示例:

import org.junit.Test;
import static org.junit.Assert.*;

public class SimpleTest {

    @Test
    public void testAdd() {
        int result = 1 + 1;
        assertEquals(2, result);
    }

    @Test
    public void testMultiply() {
        int result = 2 * 3;
        assertEquals(6, result);
    }
}

在这个示例中,SimpleTest类包含两个测试方法:testAddtestMultiply。这两个方法都使用了@Test注释来标记它们为测试方法。每个测试方法内部都使用assertEquals方法来验证某个操作的结果是否符合预期。如果assertEquals的两个参数相等,则测试通过;如果不相等,则JUnit会报告测试失败。

此外,JUnit还允许你通过@Test注释的参数来自定义测试的行为,例如设置测试的超时时间、预期异常等,但这些都是@Test注释的进阶用法。在大多数情况下,简单地使用@Test注释来标记测试方法就足够了。

21. 简述Junit 基础注解(@BeforeClass、@Before、@Test、@After、@AfterClass) ?

JUnit 是一个广泛使用的 Java 单元测试框架,它提供了一系列的注解(Annotations)来标记测试方法或测试类中的特定代码块,以便JUnit框架能够识别并执行这些测试。以下是JUnit中几个基础注解的简述:

  1. @BeforeClass

    • @BeforeClass 注解用于标记一个静态方法,该方法将在当前测试类中的所有测试方法执行之前运行一次。这通常用于执行一些只需要运行一次的初始化操作,比如加载配置文件、设置数据库连接等。需要注意的是,由于该方法是静态的,因此它不能访问类的实例变量。
  2. @Before

    • @Before 注解用于标记一个非静态方法,该方法将在每个测试方法执行之前运行。这通常用于执行一些在每个测试方法之前都需要进行的准备工作,比如设置测试数据、初始化测试环境等。由于该方法是非静态的,因此它可以访问类的实例变量。
  3. @Test

    • @Test 注解用于标记一个测试方法。JUnit框架会识别并运行所有带有@Test注解的方法。测试方法可以有返回值(通常是void),但不能有参数。如果测试方法执行过程中抛出了异常,或者断言失败,那么该测试方法将被视为失败。
  4. @After

    • @After 注解用于标记一个非静态方法,该方法将在每个测试方法执行之后运行。这通常用于执行一些清理工作,比如释放资源、恢复测试环境等。与@Before注解类似,@After注解标记的方法也是非静态的,可以访问类的实例变量。
  5. @AfterClass

    • @AfterClass 注解用于标记一个静态方法,该方法将在当前测试类中的所有测试方法执行之后运行一次。这通常用于执行一些只需要运行一次的清理工作,比如关闭数据库连接、释放资源等。与@BeforeClass注解一样,@AfterClass注解标记的方法也是静态的,不能访问类的实例变量。

这些注解共同构成了JUnit测试框架的基础,使得开发者能够以一种结构化和可预测的方式编写和执行测试代码。通过合理使用这些注解,开发者可以确保他们的代码在开发过程中保持高质量和稳定性。

22. 编写代码实现Junit - 断言方法(Assert Methods)?

在JUnit中,断言(Assertions)是用来验证测试中的假设是否成立的方法。JUnit 4 和 JUnit 5 都提供了丰富的断言方法,但它们的用法略有不同。以下是在JUnit 4和JUnit 5中如何使用一些常见的断言方法的示例。

JUnit 4 示例

首先,确保你已经添加了JUnit 4的依赖到你的项目中。如果你使用的是Maven,可以在pom.xml中添加如下依赖:

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.2</version>
    <scope>test</scope>
</dependency>

然后,你可以编写如下的JUnit 4测试类和断言方法:

import static org.junit.Assert.*;
import org.junit.Test;

public class JUnit4TestExample {

    @Test
    public void testAssertions() {
        // 测试相等性
        assertEquals("Expected value is not equal to actual value", 1, 1);
        
        // 测试不相等性
        assertNotEquals("Expected value should not be equal to actual value", 2, 1);
        
        // 测试null值
        assertNull("Expected value should be null", null);
        
        // 测试非null值
        assertNotNull("Expected value should not be null", "Hello, World!");
        
        // 测试true
        assertTrue("This condition should be true", 1 > 0);
        
        // 测试false
        assertFalse("This condition should be false", 1 < 0);
        
        // 测试字符串内容
        assertEquals("Strings are not equal", "Hello, World!", "Hello, World!");
        
        // 测试异常
        try {
            throw new IllegalArgumentException("Test exception");
        } catch (IllegalArgumentException e) {
            assertEquals("Exception message is not as expected", "Test exception", e.getMessage());
        }
    }
}

JUnit 5 示例

对于JUnit 5,首先确保你添加了JUnit 5的依赖到你的项目中。在Maven的pom.xml中,你可以添加如下依赖:

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

然后,你可以编写如下的JUnit 5测试类和断言方法。注意,JUnit 5使用org.junit.jupiter.api.Assertions中的静态方法:

import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;

public class JUnit5TestExample {

    @Test
    public void testAssertions() {
        // 测试相等性
        assertEquals(1, 1, "Expected value is not equal to actual value");
        
        // 测试不相等性
        assertNotEquals(2, 1, "Expected value should not be equal to actual value");
        
        // 测试null值
        assertNull(null, "Expected value should be null");
        
        // 测试非null值
        assertNotNull("Hello, World!", "Expected value should not be null");
        
        // 测试true
        assertTrue(1 > 0, "This condition should be true");
        
        // 测试false
        assertFalse(1 < 0, "This condition should be false");
        
        // 测试字符串内容
        assertEquals("Hello, World!", "Hello, World!", "Strings are not equal");
        
        // 测试异常
        assertThrows(IllegalArgumentException.class, () -> {
            throw new IllegalArgumentException("Test exception");
        }, "Expected IllegalArgumentException to be thrown");
    }
}

在JUnit 5中,assertThrows方法用于测试是否抛出了预期的异常,这是JUnit 4中没有的。此外,JUnit 5的断言方法通常将期望值和实际值的参数顺序颠倒,并将消息参数放在最后,这是与JUnit 4的一个主要区别。

23. 什么是Junit 参数化测试(Parameterized Test)?

Junit 参数化测试(Parameterized Test)是一种在JUnit测试框架中使用的测试技术,它允许开发者使用不同的输入参数多次运行同一个测试方法,以此来减少重复代码并提高测试效率。这种测试特别适合于验证一个方法在多种不同输入下的行为。以下是关于Junit参数化测试的详细解释:

定义与目的

  • 定义:参数化测试是一种测试方法,它通过使用不同的输入数据集来重复运行相同的测试逻辑,以验证方法在不同条件下的行为。
  • 目的:减少测试代码的重复性,提高测试覆盖率,确保方法在各种输入条件下都能正常工作。

实现方式

JUnit 4

在JUnit 4中,参数化测试的实现需要以下步骤:

  1. 使用@RunWith(Parameterized.class)注解:在测试类上添加此注解,以指定JUnit使用参数化测试运行器来运行测试。
  2. 定义静态方法并提供测试数据:创建一个带有@Parameters注解的静态方法,该方法返回一个集合(如List或数组),其中包含测试数据。这些数据将被用作测试方法的输入。
  3. 定义构造函数:在测试类中定义一个构造函数,该构造函数接受与测试数据集中的每行相对应的参数。JUnit会自动调用此构造函数,并为每行测试数据创建一个测试实例。
  4. 编写测试方法:编写一个或多个测试方法,使用实例变量(由构造函数设置)作为测试数据的来源。这些方法将使用不同的输入数据多次运行。
JUnit 5

JUnit 5进一步简化了参数化测试的语法,并提供了更灵活的数据提供方式:

  1. 使用@ParameterizedTest注解:在测试方法上添加此注解,以指定该方法为参数化测试方法。
  2. 数据提供方式:JUnit 5提供了多种数据提供方式,如@ValueSource、@NullSource、@MethodSource、@CsvSource等,用于定义测试数据的来源。这些方法可以直接在测试方法上使用,无需像JUnit 4那样定义额外的静态方法。

优点

  • 减少代码重复:通过重复使用相同的测试逻辑和不同的输入数据,可以减少测试代码的重复性。
  • 提高测试覆盖率:通过为方法提供多种输入条件,可以确保方法在各种情况下都能正常工作,从而提高测试的覆盖率。
  • 易于维护:当需要为方法添加新的测试场景时,只需在数据提供方法中添加新的测试数据即可,无需修改测试逻辑。

示例

以JUnit 4为例,以下是一个简单的参数化测试示例:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

import java.util.Arrays;
import java.util.Collection;

import static org.junit.Assert.assertEquals;

@RunWith(Parameterized.class)
public class ParameterizedTestExample {

    private int input;
    private int expected;

    public ParameterizedTestExample(int input, int expected) {
        this.input = input;
        this.expected = expected;
    }

    @Parameters
    public static Collection<Object[]> data() {
        return Arrays.asList(new Object[][]{
                {1, 1},
                {2, 4},
                {3, 9}
        });
    }

    @Test
    public void testSquare() {
        assertEquals(expected, calculateSquare(input));
    }

    private int calculateSquare(int num) {
        return num * num;
    }
}

在这个示例中,ParameterizedTestExample类使用了参数化测试来验证calculateSquare方法在不同输入下的输出是否正确。通过定义静态方法data来提供测试数据,并在构造函数中设置这些数据,JUnit将使用这些数据多次运行testSquare方法。

24. 什么是Junit 套件测试(Suite Test)?

Junit 套件测试(Suite Test)是JUnit框架提供的一种机制,允许开发者将多个测试类组织成一个测试套件来一起运行。这种方式特别适用于大型项目,其中可能有多个测试类,每个测试类都包含了针对项目不同部分的测试。通过将相关的测试类组合成测试套件,开发者可以更容易地管理和运行这些测试,同时保证测试的全面性和一致性。

在JUnit 4中,实现测试套件通常涉及以下几个步骤:

  1. 定义一个测试套件类:这个类通常不包含任何测试方法,而是作为一个容器来组织其他测试类。这个类需要使用@RunWith(Suite.class)注解来表明它是一个测试套件。

  2. 指定要包含的测试类:在测试套件类中,使用@Suite.SuiteClasses({TestClass1.class, TestClass2.class, ...})注解来指定哪些测试类应该被包含在这个测试套件中。这些测试类将按照指定的顺序(如果有的话)被JUnit框架执行。

  3. 运行测试套件:像运行其他任何JUnit测试类一样,可以通过IDE(如Eclipse、IntelliJ IDEA等)或构建工具(如Maven、Gradle等)来运行测试套件。

例如,如果你有两个测试类TestClass1TestClass2,你可以创建一个名为AllTests的测试套件类来包含它们:

import org.junit.runner.RunWith;
import org.junit.runners.Suite;

@RunWith(Suite.class)
@Suite.SuiteClasses({
    TestClass1.class,
    TestClass2.class
})
public class AllTests {
    // 这个类不需要包含任何代码,它只是一个容器
}

通过这种方式,当你运行AllTests测试套件时,JUnit将自动执行TestClass1TestClass2中的所有测试方法。

值得注意的是,随着JUnit的发展,JUnit 5引入了一种新的测试引擎和API,其中不再直接使用@RunWith(Suite.class)@Suite.SuiteClasses注解来组织测试套件。JUnit 5通过@SelectClasses@SelectPackages注解在@Suite注解中提供了一种更灵活的方式来定义测试套件,但JUnit 5更推荐使用@Nested注解和@TestInstance注解来组织相关的测试类和方法,以实现更细粒度的测试组织和管理。

答案来自文心一言,仅供参考
在这里插入图片描述

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

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

相关文章

Java--集合进阶 Collection,迭代器,lambda表达式

集合体系结构 Collection&#xff1a;单列集合 LIst系列集合&#xff1a;添加的元素是有序、可重复、有索引 Set系列集合&#xff1a;添加的元素是无序、不重复、无索引 Collection集合常用方法 | 方法名 | 说明 || :---…

双设备同时快充不再是梦:揭秘一拖二快充线PD芯片的奥秘

一拖二快充线PD芯片&#xff1a;充电新纪元&#xff0c;让生活更“电”力十足&#xff01; 在这个快节奏的时代&#xff0c;手机、平板、耳机……我们的数字小伙伴们几乎从不离身&#xff0c;但它们的电量却总爱跟我们玩“躲猫猫”。每当夜幕降临&#xff0c;充电线就成了连接我…

【每日刷题】Day114

【每日刷题】Day114 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. LCR 166. 珠宝的最高价值 - 力扣&#xff08;LeetCode&#xff09; 2. 931. 下降路径最小和 - 力扣…

关于转行网络安全的一些建议

在当前就业形势下&#xff0c;不少朋友面临转行的困境。网络安全作为一个热门领域&#xff0c;自然也吸引了许多人的目光。本文将就转行网络安全这一话题&#xff0c;提供一些切实可行的建议。 网络安全行业概况 网络安全涵盖了从基础的脚本编写到高级的漏洞研究等多个层面。该…

【数学分析笔记】第3章第2节 连续函数(2)

3. 函数极限与连续函数 3.2 连续函数 【例3,2,4】证明 f ( x ) a x ( a > 0 , a ≠ 1 ) f(x)a^{x}(a>0,a\ne 1) f(x)ax(a>0,a1)在 ( − ∞ , ∞ ) (-\infty,\infty) (−∞,∞)上连续。 【证】 ∀ x 0 ∈ ( − ∞ , ∞ ) \forall x_{0}\in(-\infty,\infty) ∀x0…

2、PF-Net点云补全

2、PF-Net 点云补全 PF-Net论文链接&#xff1a;PF-Net PF-Net &#xff08;Point Fractal Network for 3D Point Cloud Completion&#xff09;是一种专门为三维点云补全设计的深度学习模型。 点云补全实际上和图片补全是一个逻辑&#xff0c;都是采用GAN模型的思想来进行补全…

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候&#xff0c;不知道如何选的好&#xff0c;本文针对常用的方案&#xff0c;做个大概的说明&#xff1a; 1. 使用VLC for Android VLC Media Player&#xff08;VLC多媒体播放器&#xff09;&#xff0c;最初命名…

【深度学习】LSTM模型,GRU模型计算公式及其优缺点介绍

一.LSTM介绍 LSTM&#xff08;Long Short-Term Memory&#xff09;也称长短时记忆结构, 它是传统RNN的变体, 与经典RNN相比能够有效捕捉长序列之间的语义关联, 缓解梯度消失或爆炸现象. 同时LSTM的结构更复杂, 它的核心结构可以分为四个部分去解析: 遗忘门输入门细胞状态输出…

基于SpringBoot的智能制造云平台系统的设计与实现计算机毕设

一、选题背景与意义&#xff08;300字左右&#xff09; 根据工业4.0智能制造生态链中云工厂在实际生产当中的工作流程进行充分调研和整理出来的&#xff0c;描述最终用户在本系统中对于生产订单的处理、排产、以及生产的完整在线处理流程和业务需求的文档。 针对制造业而言&a…

WebGL系列教程三(使用缓冲区绘制三角形)

目录 1 前言2 缓冲区介绍3 声明顶点的位置和颜色4 回忆Shader的初始化5 开始缓冲区的逻辑5.1 声明顶点坐标5.2 创建并绑定缓冲区5.3 获取顶点着色器中的变量5.4 使变量从缓冲区取值5.5 绘制5.6 完整代码 7 总结 1 前言 上一篇中我们介绍了WebGL的环境搭建及Shader的初始化&…

搭建Docker私有仓库管理本地的Docker镜像,通过harbor实现Web UI访问和管理私有仓库

要在本地搭建一个Docker私有仓库&#xff0c;你可以按照以下步骤进行设置&#xff1a; 安装Docker 确保你已经安装了Docker。如果还没有安装&#xff0c;可以按照官方指南进行安装&#xff1a; 对于Ubuntu系统&#xff0c;你可以运行以下命令来安装Docker&#xff1a; sudo ap…

区块链-P2P(八)

前言 P2P网络&#xff08;Peer-to-Peer Network&#xff09;是一种点对点的网络结构&#xff0c;它没有中心化的服务器或者管理者&#xff0c;所有节点都是平等的。在P2P网络中&#xff0c;每个节点都可以既是客户端也是服务端&#xff0c;这种网络结构的优点是去中心化、可扩展…

【JAVA入门】Day36 - 异常

【JAVA入门】Day36 - 异常 文章目录 【JAVA入门】Day36 - 异常一、异常结构体系综述1.1 错误&#xff08;Error&#xff09;1.2 异常&#xff08;Exception&#xff09;1.3 运行时异常&#xff08;RuntimeException&#xff09;1.4 其他异常 二、编译时异常和运行时异常三、异常…

WebDriver与Chrome DevTools Protocol:如何在浏览器自动化中提升效率

介绍 随着互联网数据的爆炸式增长&#xff0c;爬虫技术成为了获取信息的重要工具。在实际应用中&#xff0c;如何提升浏览器自动化的效率是开发者常常面临的挑战。Chrome DevTools Protocol&#xff08;CDP&#xff09;与Selenium WebDriver相结合&#xff0c;为浏览器自动化提…

vue中ES6的属性every使用@2@

every用于判断数组中的每一项是否均符合条件&#xff0c;并返回一个布尔值&#xff0c;都符合返回true&#xff0c;有一个不符合就返回false&#xff0c;并不再继续执行 //everyvar arr2 [1, 2, 3, 4, 5] let newArr2 arr2.every((num) > {return num < 3}) consol…

安卓13禁止声音调节对话框 删除音量调节对话框弹出 屏蔽音量对话框 android13

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析3.1 方法13.2 方法24.代码修改4.1 代码修改方法14.2 代码修改方法25.编译6.彩蛋1.前言 客户需要,调整声音,不显示声音调节对话框了。我们在系统里面隐藏这个对话框。 2.问题分析 android在调整声音的…

Chainlit集成Mem0使用一个拥有个性化AI记忆的网页聊天应用

前言 Mem0 简介&#xff0c;可以看我上一篇文章《解决LLM的永久记忆的解决方案-Mem0实现个性化AI永久记忆功能》。本篇文章是对Mem0 实战使用的一个示例。通过Chainlit 快速实现ui界面和open ai的接入&#xff0c;通过使用Mem0 实现对聊天者的对话记录的记忆。 设计实现基本原…

网络空间信息安全实验

实验1 基础实验&#xff08;加密与隐藏&#xff09; 一、实验目的 提高对加密与解密原理的认识&#xff1b;提高对信息隐藏原理的认识&#xff1b;学会使用加密与隐藏软件。 二、实验环境 Pentiuum III、600 MHz以上CPU , 128M 以上内存&#xff0c;10G 以上硬盘&#xff0…

Hoverfly api/v2/simulation 任意文件读取漏洞复现(CVE-2024-45388)

0x01 产品简介 Hoverfly是一个为开发人员和测试人员提供的轻量级服务虚拟化/API模拟/API模拟工具。 0x02 漏洞概述 Hoverfly api/v2/simulation 接口存在任意文件读取漏洞,未经身份验证攻击者可通过该漏洞读取系统重要文件(如数据库配置文件、系统配置文件)、数据库配置文…

CSS学习13--学成网例子

CSS例子 学成网 需要使用的图片&#xff1a; 代码&#xff1a; <html><head><style>/*CSS初始化*/* { /*清除内外边框*/padding: 0;margin: 0;}ul {list-style: none; /*清除列表样式*/}.clearfix:before,.clearfix:after { /*清除浮动*/content: &qu…