code论坛系统测试

目录

  • 一 项目介绍
      • **项目名称**
      • **项目介绍**
      • **项目功能**
      • **项目展示**
  • 二 测试用例设计和功能测试
    • 1.测试用例设计
      • **①登录页面**
      • **②注册页面**
      • **③首页**
      • **④发布帖子页面**
      • **⑤修改个人信息页面**
    • 2.功能测试环境
    • 3.实际执行功能测试的部分操作
      • **①登录页面**
      • **②注册页面**
      • **③首页**
      • **④发布帖子页面**
      • **⑤修改个人信息页面**
  • 三 接口测试
    • 1.Junit单元测试
      • **①用户接口**
      • **②帖子接口**
    • 2.Swagger API测试
      • **①用户接口**
      • **②帖子接口**
      • **③回复接口**
      • **④版块接口**
      • **⑤站内信接口**
  • 四 自动化测试
    • 1.使用selenium进行自动化测试准备工作
      • 1.引入依赖
      • 2.创建公共类
      • 3.创建测试套件类
    • 2.对登录页面进行自动化测试
      • **①打开登陆网页**
      • **②对登陆页面上的文字进行判断**
      • **③测试窗口伸缩**
      • **④错误的登录测试**
      • **⑤正确的登录测试**
      • **⑥运行结果**
    • 3.对注册页面进行自动化测试
      • **①打开注册页面**
      • **②对注册页面上的文字进行判断**
      • **④错误的注册测试**
      • **⑤正确的注册测试**


一 项目介绍


项目名称

项目名称: code论坛

项目介绍

项目介绍: code论坛是一个基于Spring的前后端分离的在线论坛系统。使用了MySQL数据库来存储相关信息,项目完成后使用Xshell将其部署到云服务器上。

前端页面: 前端共由八个页面构成:注册页面,登录页面,首页,编辑帖子页面,帖子列表页面,个人中心页面,修改个人信息页面,帖子详情页面。

项目总结: 该项目可以实现通过发布帖子分享技术,并通过别人发布的帖子学习知识来进行技术交流,所以也可称之为技术交流社区。

项目功能

code论坛主要实现了以下功能
用户注册,用户登录,编辑帖子,删除帖子,查看帖子,点赞帖子,站内信,编辑个人信息等功能。

项目展示

项目展示链接: code论坛
项目源码链接: code论坛源码


二 测试用例设计和功能测试


1.测试用例设计

测试用例会从界面测试,功能测试,性能测试,易用性测试,安全性测试,兼容性测试六个方面进行设计。

①登录页面

在这里插入图片描述

②注册页面

在这里插入图片描述

③首页

在这里插入图片描述

④发布帖子页面

在这里插入图片描述

⑤修改个人信息页面

在这里插入图片描述

2.功能测试环境

测试环境: win11
项目运行: CentOS,maven,JDK1.8
浏览器: FireFox浏览器,Chrome浏览器

3.实际执行功能测试的部分操作

①登录页面

页面展示
在这里插入图片描述

给定一个正确的账号密码:
用户名:小纸
密码:111

操作

输入用户名输入密码操作预期结果实际结果
点击登录提示用户名不能为空,密码不能为空提示用户名不能为空,密码不能为空
张三(错误的用户名)点击登录提示用户名或密码错误提示用户名或密码错误
小纸(正确的用户名)点击登录提示密码不能为空提示密码不能为空
小纸(正确的用户名)123(错误的密码)点击登录提示用户名或密码错误提示用户名或密码错误
小纸(正确的用户名)111(正确的密码)点击登录登录成功成功登录

②注册页面

页面展示
在这里插入图片描述

操作

输入用户名输入昵称输入密码输入确认密码勾选同意条款点击注册预期结果实际结果
不勾选点击注册提示都不能为空每个输入框下面都提示不能为空
张三不勾选点击注册提示除用户名外都不能为空其余三个输入框下面提示不能为空
张三张三111123勾选点击注册提示密码和确认密码不相同提示请检查确认密码
张三张三111111不勾选点击注册提示请勾选勾选框标红,点击注册按钮无结果
张三张三111111勾选点击注册注册成功注册成功,跳转到登录页面,弹出是否要保存密码框

③首页

页面展示

在这里插入图片描述

操作

操作预期结果实际结果
点击Java跳转至Java版块跳转至Java版块
点击发布帖子跳转至发布帖子页面跳转至发布帖子页面
点击“计算机秋招经验”跳转至帖子详情页跳转至帖子详情页
点击月亮标志切换为夜晚模式切换为夜晚模式

④发布帖子页面

页面展示
在这里插入图片描述

操作

输入标题输入内容操作预期结果实际结果
点击发布提示请输入帖子标题提示请输入帖子标题
测试标题点击发布提示请输入帖子内容提示请输入帖子内容
测试标题测试内容点击发布发布成功发布成功,跳转至首页

⑤修改个人信息页面

页面展示
在这里插入图片描述

操作

操作预期结果实际结果
点击修改头像,上传头像头像变为刚刚上传的图片图片无变化(上传图片功能还未实现)
输入邮箱地址,点击修改修改成功修改成功
输入电话号码,点击修改修改成功修改成功
输入错误原密码,点击提交修改提示密码校验失败提示密码校验失败
输入正确原密码,点击提交修改修改成功修改成功

三 接口测试


接口测试使用了:

  1. Junit单元测试
  2. Springfox Swagger 生成 API,完成 API 单元测试

1.Junit单元测试

单元测试类:

在这里插入图片描述

这里只列举用户接口和帖子接口的单元测试,其余的欢迎参考我的gitee链接:

code论坛

①用户接口

这里列举了注册,登录和修改个人信息的测试代码。

注册方法测试:

    @Test
    @Transactional
    void createNormalUser() {
        // 构造User对象
        User user = new User();
        user.setUsername("boy1");
        user.setNickname("boy");

        // 定义一个原始的密码
        String password = "123456";
        // 生成盐
        String salt = UUIDUtil.UUID_32();
        // 生成密码的密文
        String ciphertext = MD5Util.md5Salt(password, salt);
        // 设置加密后的密码
        user.setPassword(ciphertext);
        // 设置盐
        user.setSalt(salt);
        // 调用Service层的方法
        userService.createNormalUser(user);
        // 打印结果
        System.out.println(user);
    }

修改个人信息测试:

    @Test
    @Transactional
    void modifyInfo() {
        User user = new User();
        user.setId(3l); // 用户Id
        user.setUsername("testUser"); // 登录名
        user.setNickname("testUser1"); // 昵称
        user.setGender(null); // 性别
        user.setEmail("qqq@qq.com");// 邮箱
        user.setPhoneNum("15366668888"); // 电话
        user.setRemark("测试"); // 个人简介
        // 调用Service
        userService.modifyInfo(user);
    }

登录测试:

    @Test
    void login() {
        User user = userService.login("bitboy", "123456");
        System.out.println(user);
    }

②帖子接口

这里列举了发布帖子,查询所有帖子列表,删除帖子,点赞帖子的测试代码。

发布帖子测试:

    @Test
    @Transactional
    void create() {
        Article article = new Article();
        article.setUserId(2L); // boy
        article.setBoardId(1L); // java版块
        article.setTitle("单元测试");
        article.setContent("测试内容");
        articleService.create(article);
        System.out.println("发贴成功");
    }

查询所有帖子列表:

    @Test
    void selectAll() throws JsonProcessingException {
        // 调用Service
        List<Article> articles = articleService.selectAll();
        // 转换成JSON字符串并且打印
        System.out.println(objectMapper.writeValueAsString(articles));
    }

点赞帖子和删除帖子方法测试:

    @Test
    @Transactional
    void thumbsUpById() {
        articleService.thumbsUpById(1L);
        System.out.println("点赞成功");
    }

    @Test
    @Transactional
    void deleteById() {
        articleService.deleteById(11l);
        System.out.println("删除成功");
    }

2.Swagger API测试

测试链接:code论坛系统API

接口测试版块总览

在这里插入图片描述

回复接口:

在这里插入图片描述

帖子接口:

在这里插入图片描述

版块接口:

在这里插入图片描述

用户接口:

在这里插入图片描述

站内信接口:

在这里插入图片描述

⭐⭐⭐这里每个接口展示一个功能的测试过程。

①用户接口

功能:用户登录

账号:小纸
密码:111

过程:

在这里插入图片描述

结果:登录成功

在这里插入图片描述

②帖子接口

功能:获取用户列子列表

输入用户id:1

过程:

在这里插入图片描述

结果:获取成功,用户id为1的用户共发布一篇文章

在这里插入图片描述

③回复接口

功能:发布回复

输入发布回复的帖子id:19
输入回复内容:支持好文!!!

过程:

在这里插入图片描述

结果:回复成功

在这里插入图片描述

④版块接口

功能:获取首页版块列表

过程:直接点击Execute

在这里插入图片描述

结果:操作成功

在这里插入图片描述

⑤站内信接口

功能:发送站内信

输入接收用户id:2
输入内容:你好

过程:

在这里插入图片描述

结果:操作成功

在这里插入图片描述


四 自动化测试


1.使用selenium进行自动化测试准备工作

1.引入依赖

创建一个maven项目,在pop.xml中引入以下依赖

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>3.141.59</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.11.0</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.9.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-params -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-params</artifactId>
            <version>5.9.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.junit.platform/junit-platform-suite -->
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-suite</artifactId>
            <version>1.9.1</version>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.junit.platform/junit-platform-suite -->
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-suite</artifactId>
            <version>1.9.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.9.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

2.创建公共类

因为对每一个页面进行测试都需要创建浏览器驱动,所以我们可以把他提取出来并设置成静态的,就可以让创建和销毁驱动的操作只实现一次,其他类都继承这个类即可。

在这里插入图片描述

package org.example.common;

import org.openqa.selenium.chrome.ChromeDriver;

import java.time.Duration;
import java.util.concurrent.TimeUnit;

public class AutoTestUtils {

    private static ChromeDriver driver;

    public static ChromeDriver createDrive() {
        if (driver == null) {
            driver = new ChromeDriver();
            // 隐式等待, 渲染页面, 防止找不到页面元素
            driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS);
        }
        return driver;
    }
}

3.创建测试套件类

创建一个类,通过@Suite注解识别该类为测试套件类,使用@SelectClasses来注解声明我们要运行哪些类。

在这里插入图片描述

package org.example.tests;

import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.Suite;

/**
 * 测试套件类
 */
@Suite
@SelectClasses({loginTest.class, IndexTest.class})
public class RunSuite {
}

2.对登录页面进行自动化测试

①打开登陆网页

②对登陆页面上的文字进行判断

  1. 页面上的用户名,密码,登录按钮是否都正常显示
  2. 点击注册按钮能否正常跳转页面

③测试窗口伸缩

测试窗口缩小至指定大小,放大到最大

④错误的登录测试

  1. 用户名为空,提示用户名不能为空
  2. 密码为空,提示密码不能为空
  3. 用户名密码不匹配,提示用户名或密码错误

⑤正确的登录测试

输入正确的用户名与密码,登陆成功,跳转至首页,判断跳转的url是否正确,以及跳转页面上的文字是否显示正确

⑥运行结果

测试全部通过
在这里插入图片描述

⭐⭐⭐这里给出一个页面的详细代码,其他页面只展示步骤

package org.example.tests;

import org.example.common.AutotestUtil;
import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.openqa.selenium.By;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.chrome.ChromeDriver;

import java.util.concurrent.TimeUnit;

/**
 * wangcong
 * 2023/8/21
 * 登陆页面测试
 */
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class loginTest extends AutotestUtil {
    // 获取浏览器驱动
    public static ChromeDriver driver = createDrive();

    /**
     * 打开网页
     */
    @Test
    @BeforeAll
    static void init() {
        // 跳转到登录页面
        driver.get("http://47.109.128.149:6060/sign-in.html");
        // 隐式等待页面加载完成
        driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
    }

    /**
     * 对登陆页面的一些文字显示进行判断
     */
    @Test
    @Order(1)
    void loginPageTest() {
        // 检查系统名称
        String expect = "用户登录";
        String actual = driver.findElement(By.cssSelector("body > div > div > div > div:nth-child(1) > div > div.card.card-md > div > h2")).getText();
        Assertions.assertEquals(expect, actual);
        // 判断登录窗口的内容
        String expect2 = driver.findElement(By.cssSelector("#signInForm > div.mb-3 > label")).getText();
        Assertions.assertEquals(expect2, "用户名");
        String expect3 = driver.findElement(By.cssSelector("#signInForm > div.mb-2 > label")).getText();
        Assertions.assertEquals(expect3, "密码");
        // 检查登陆按钮是否存在
        driver.findElement(By.cssSelector("#submit"));
        // 检查注册按钮是否存在
        driver.findElement(By.cssSelector("body > div > div > div > div:nth-child(1) > div > div.text-center.text-muted.mt-3 > a"));
        // 点击注册按钮
        driver.findElement(By.cssSelector("body > div > div > div > div:nth-child(1) > div > div.text-center.text-muted.mt-3 > a")).click();
        // 判断跳转页面是否正确
        String url = driver.getCurrentUrl();
        Assertions.assertEquals(url, "http://47.109.128.149:6060/sign-up.html");
    }

    /**
     * 测试窗口伸缩
     */
    @Test
    @Order(2)
    public void windowSize() {
        driver.manage().window().setSize(new Dimension(900, 900));
        driver.manage().window().setSize(new Dimension(300, 300));
        driver.manage().window().maximize();
    }

    /**
     * 错误登录测试1
     */
    @ParameterizedTest
    @Order(4)
    @CsvSource(value = {"锦鲤, 12345"})
    void loginAbnormal1(String username, String password) {
        // 清空用户名和密码
        driver.findElement(By.cssSelector("#username")).clear();
        driver.findElement(By.cssSelector("#password")).clear();
        // 用户名为空
        driver.findElement(By.cssSelector("#username")).click();
        driver.findElement(By.cssSelector("#password")).sendKeys(password);
        String expect = driver.findElement(By.cssSelector("#signInForm > div.mb-3 > div")).getText();
        // 断言
        Assertions.assertEquals(expect, "用户名不能为空");
        // 密码为空
        driver.findElement(By.cssSelector("#username")).sendKeys(username);
        driver.findElement(By.cssSelector("#password")).clear();
        String expectPass = driver.findElement(By.cssSelector("#signInForm > div.mb-2 > div > div")).getText();
        // 断言
        Assertions.assertEquals(expectPass, "密码不能为空");
        // 返回上一个页面
//        driver.navigate().back();// 这里不需要返回,并未跳转页面
    }
    /**
     * 错误登录测试2
     */
    @ParameterizedTest
    @Order(4)
    @CsvSource(value = {"锦鲤, 12345","锦鲤呀,123456"})
    void loginAbnormal2(String username, String password) {
        // 清空用户名和密码
        driver.findElement(By.cssSelector("#username")).clear();
        driver.findElement(By.cssSelector("#password")).clear();
        // 输入用户名和密码
        driver.findElement(By.cssSelector("#username")).sendKeys(username);
        driver.findElement(By.cssSelector("#password")).sendKeys(password);
        // 点击登录
        driver.findElement(By.cssSelector("#submit")).click();
        // 等待弹窗内容
        driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        // 判断弹窗内容
        String expect = driver.findElement(By.cssSelector("body > div.jq-toast-wrap.bottom-right > div > h2")).getText();
        // 断言
        Assertions.assertEquals(expect, "警告");
        // 返回上一个页面
//        driver.navigate().back();// 这里不需要返回,并未跳转页面
    }

    /**
     * 正确登录测试
     */
    @ParameterizedTest
    @Order(4)
    @CsvSource(value = {"小金, 123456","锦鲤, 123456"})
    void loginNormal(String username, String password) {
        // 清空用户名和密码
        driver.findElement(By.cssSelector("#username")).clear();
        driver.findElement(By.cssSelector("#password")).clear();
        // 输入用户名和密码
        driver.findElement(By.cssSelector("#username")).sendKeys(username);
        driver.findElement(By.cssSelector("#password")).sendKeys(password);
        // 点击登录
        driver.findElement(By.cssSelector("#submit")).click();
        // 等待跳转页面
        driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        // 判断跳转页面url
        String url = driver.getCurrentUrl();
        // 断言url
        Assertions.assertEquals(url, "http://47.109.128.149:6060/sign-in.html");
        // 判断显示是否为首页
        String expect = driver.findElement(By.cssSelector("#article_list_board_title")).getText();
        // 断言
        Assertions.assertEquals(expect, "首页");
        // 返回上一个页面
        driver.navigate().back();// 这里不需要返回,并未跳转页面
    }


}

3.对注册页面进行自动化测试

①打开注册页面

在这里插入图片描述

②对注册页面上的文字进行判断

  1. 判断用户注册,用户名,昵称,密码,确认密码,同意文字是否存在
  2. 注册按钮是否存在
  3. 登陆的超链接是否存在

④错误的注册测试

  1. 用户名,昵称,密码,确认密码,同意隐私政策,其中有任何一个不填写,注册失败

⑤正确的注册测试

  1. 用户名,昵称,密码,确认密码,同意隐私政策,所有都正确填写,注册成功
  2. 注册成功后,跳转到登陆界面

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ps怎么布尔运算多个图层合并?

我们经常使用Photoshop制作大型海报类&#xff0c;也可以用ps进行一些简单icon小图标的制作&#xff0c;这些icon图标多数应用在工具按钮上&#xff0c;比较小巧美观。但是对于ps对图形的操作经常会用到布尔运算的使用&#xff0c;今天小编就给大家详细讲解下ps布尔运算多个图层…

C语言和JavaScript中的默认排序行为对比

前言 今天在js里使用sort时遇见了一个不理解的现象 即使用sort默认排序后 9 从排序前的第一位被排到了最后一位.一开始我对js sort的理解和c一样&#xff0c;然后通过查阅后发现并不是这样. 正文 排序是一项常见而重要的操作。不同的编程语言提供了不同的排序函数&#xf…

常见的网络设备有哪些?分别有什么作用?

个人主页&#xff1a;insist--个人主页​​​​​​ 本文专栏&#xff1a;网络基础——带你走进网络世界 本专栏会持续更新网络基础知识&#xff0c;希望大家多多支持&#xff0c;让我们一起探索这个神奇而广阔的网络世界。 目录 一、网络设备的概述 二、常见的网络设备 1、…

华星时空展锐芯片5g随身WiFi改串教程

前段时间入手了一个华正易尚&#xff0c;发现插手机卡可以用&#xff0c;插微闯移植卡直接没网&#xff0c;于是研究出展锐改串的教程分享给大家 ⭐注意:理论上所有的展锐芯片棒子都可以用&#xff0c;至于电池机请自行测试 话不多说&#xff0c;教程开始: 1.下载展锐AT改串驱…

Lnton羚通算法算力云平台如何在OpenCV-Python中使用cvui库创建复选框

CVUI 之 复选框 Python import numpy as np import cv2 import cvuidef checkbox_test():WINDOW_NAME Checkbox-Testchecked [False]# 创建画布frame np.zeros((300, 400, 3), np.uint8)# 初始化窗口cvui.init(WINDOW_NAME)while True:# 画布填色frame[:] (100, 200, 100…

Python学习日志(二)

数据类型转换 num_strstr(11)# 整数转换为字符串 print(type(num_str), num_str) 输出结果为&#xff1a; <class str> 11 类型转换成功&#xff0c;并且原本内容没有发生变化。 float_strstr(13.14)#小数转字符串 print(type(float_str),float_str) 同理&#xff0c;…

变动的Python爬虫实现

在电商时代&#xff0c;了解商品价格的变动对于购物者和卖家来说都非常重要。本文将分享一种基于Python的实时监控电商平台商品价格变动的爬虫实现方法。通过本文的解决方案和代码示例&#xff0c;您将能够轻松监控商品价格&#xff0c;并及时做出决策。 一、了解需求和目标 在…

Python将网络文件下载到本地

Python将网络文件下载到本地 前言相关介绍Python将网络文件下载到本地 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&#xff0c;可点击进入Python日常小操作专栏、YOLO系列专栏、自然语言处理专栏或我的个人主页查看基于DETR的人脸伪…

线段树详解——影子宽度

OK&#xff0c;今天来讲一讲线段树~~ 线段树是什么线段树的实现线段树的时间复杂度线段树的应用线段树的节点结构其他操作和优化例题——影子宽度输入输出格式输入格式输出格式 输入输出样例输入样例输出样例 例题讲解 线段树是什么 线段树&#xff08; S e g m e n t Segmen…

数字化时代,数据仓库和商业智能BI系统演进的五个阶段

数字化在逐渐成熟的同时&#xff0c;社会上也对数字化的性质有了进一步认识。当下&#xff0c;数字化除了前边提到的将复杂的信息、知识转化为可以度量的数字、数据&#xff0c;在将其转化为二进制代码&#xff0c;引入计算机内部&#xff0c;建立数据模型&#xff0c;统一进行…

什么是CSS中的BFC?

①什么是BFC BFC 全称&#xff1a;Block Formatting Context&#xff0c; 名为 “块级格式化上下文”。 W3C官方解释为&#xff1a;BFC它决定了元素如何对其内容进行定位&#xff0c;以及与其它元素的关系和相互作用&#xff0c;当涉及到可视化布局时&#xff0c;Block Forma…

小航助学GESP_C++一级模拟测试卷第4套(含题库答题软件账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSDN博客 需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSD…

C++学习第十五天----循环和文本输入

昨天说到使用cin进行键盘输入的一些弊端&#xff0c;那么怎么解决呢&#xff1f; 1.使用cin.get&#xff08;char&#xff09;进行补救 使用下面这句代码替换掉cin >> ch;,这样就会回显空格&#xff1b; cin.get(ch);//读取输入中的下一个字符&#xff08;即使它是空格&…

面试题大揭秘!Java中== 与equals的区别?

大家好&#xff0c;我是你们的小米&#xff01;今天我们要来聊一个在Java面试中经常被问到的问题&#xff1a; 与 equals 的区别。这可是一个重要而且常常令人头疼的问题哦&#xff01;废话不多说&#xff0c;咱们马上开启今天的探索之旅吧&#xff01; 背景知识 在开始深入探…

HCIP 三层架构实验

三层架构实验 拓扑和思路拓扑思路LSW配置LSW1LSW2LSW3 DHCPLSW2LSW1 ACL外网冗余 拓扑和思路 拓扑 思路 首先划分网段&#xff0c;然后LSW1和LSW2和R1可以用ospf宣告就行&#xff0c;然后R1写条缺省指向R2 然后可以将LSW1和LSW2三合一&#xff0c;给交换机配置换分组&#x…

ThreadLocal内存泄漏问题

引子&#xff1a; 内存泄漏&#xff1a;是指本应该被GC回收的无用对象没有被回收&#xff0c;导致内存空间的浪费&#xff0c;当内存泄露严重时会导致内存溢出。Java内存泄露的根本原因是&#xff1a;长生命周期的对象持有短生命周期对象的引用&#xff0c;尽管短生命周期对象已…

FastDFS+Nginx - 本地搭建文件服务器同时实现在外远程访问「端口映射」

文章目录 前言1. 本地搭建FastDFS文件系统1.1 环境安装1.2 安装libfastcommon1.3 安装FastDFS1.4 配置Tracker1.5 配置Storage1.6 测试上传下载1.7 与Nginx整合1.8 安装Nginx1.9 配置Nginx 2. 局域网测试访问FastDFS3. 安装cpolar内网穿透4. 配置公网访问地址5. 固定公网地址5.…

基于swing的零件销售系统java jsp客户信息维护mysql源代码

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 基于swing的零件销售系统 系统有1权限&#xff1a;管…

mac垃圾清理软件有哪些

随着使用时间的增加&#xff0c;mac系统会产生一些垃圾文件&#xff0c;影响系统的性能和稳定性。为了保持mac系统的高效&#xff0c;用户需要定期使用mac垃圾清理软件来清理系统缓存、日志、语言包等无用文件。CleanMyMac是一款功能强大的mac垃圾清理软件&#xff0c;它可以帮…

mysql通过binlog日志恢复误删数据

1、先查看binlog功能是否开启 show variables like %log_bin%;log_bin为ON说明可以使用binlog恢复&#xff0c;如果为OFF说明没有开启binlog。 2、删除部分数据做测试 3、查找binlog文件位置 show variables like %datadir%;cd /var/lib/mysqlls -l删除数据时间是在文件154与…