WEB基础--单元测试与三层架构

单元测试

为什么要进行单元测试

减少创建类,我们希望在一个类中,并且测试时不需要改代码,那么我们就要用到junit单元测试

常见测试分类

  • 黑盒测试

    黑盒测试也叫功能测试,主要关注软件每个功能是否实现,并不关注软件代码是否有错误。测试人员完全不考虑程序内部的逻辑结构和内部特性。

  • 白盒测试

    白盒测试与黑盒测试相反,白盒测试主要检查软件内部逻辑结构、设计等是否符合规定。用代码来测试你的代码。

  • 灰盒测试

    灰盒测试是介于黑盒和白盒之间的一种测试,既关注功能也关注内部逻辑的实现,但并没有白盒测试那么细致。需要灰盒测试的目的是因为白盒测试效率较低。

  • 单元测试

    (模块测试)是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。比如一个方法是否正确,比如是否达到想要的效果等。这也是我们开发者最常用的一种方式。

测试类代码示例:

在每个测试方法前加上@Test,不用创建多个main方法也可执行对应功能性代码

public class MyTest {
    @Test
    public void test01(){
        Connection connection=null;
        PreparedStatement ps=null;
        try {
            connection=JDBCutils.getConnection();
            //插入数据
            ps=connection.prepareStatement("INSERT INTO `ronghuatest`.`user`(`id`, `name`, `pwd`, `gender`, `age`, `money`) VALUES (null , ?, ?, ?, ?, ?);\n");
            //id设置的为自增长,故直接写null即可
            ps.setString(1,"jack");
            ps.setString(2,"123456");
            ps.setInt(3,1);
            ps.setInt(4,22);
            ps.setBigDecimal(5, BigDecimal.valueOf(2000.00));
            ps.executeUpdate();//插入数据,运行
            System.out.println("插入数据成功");
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            JDBCutils.close(connection,ps,null);
        }
    }
    @Test
    public void  test02(){
        Connection connection=null;
        PreparedStatement ps=null;
        try {
            connection=JDBCutils.getConnection();//插入数据
            ps=connection.prepareStatement("INSERT INTO `ronghuatest`.`user`(`id`, `name`, `pwd`, `gender`, `age`, `money`) VALUES (null , ?, ?, ?, ?, ?);\n");
            ps.setString(1,"Ale");
            ps.setString(2,"123456");
            ps.setInt(3,1);
            ps.setInt(4,25);
            ps.setBigDecimal(5,BigDecimal.valueOf(3500.00));
            ps.executeUpdate();
            System.out.println("插入成功");
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            JDBCutils.close(connection,ps,null);
        }

    }
}

三层架构

DAO层

主要是用来做数据库的操作,模块化,分工明确,解耦(责任分离)

Service层

对获取到的数据进行处理

Entity层

收集数据; name,password,age....等等 需要传递很多东西;

三层架构图

使用三层架构完成一个简单的登录功能

项目结构:

DAO层当中用于编写对于数据库的操作

DAO中方法接口为UserDao代码如下

public interface UserDao {
    User userlogin(User user);//定义方法
}

Dao中重写userlogin方法

public class UserDAOImpl implements UserDao {
    @Override
    public User userlogin(User user) {
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;//初始化数据
        try {
            connection = JDBCutils.getConnection();//调用工具类
            statement = connection.createStatement();
            resultSet = statement.executeQuery("select * from user where name = '" + user.getName() + "' and pwd = '" + user.getPassword() + "'");
            while (resultSet.next()) {
                return new User(resultSet.getString("name"), resultSet.getInt("age"), resultSet.getString("pwd"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCutils.close(connection,statement,resultSet);
        }
        return null;
    }
}

Entity当中写收集数据的方法,即实体类

代码如下

public class User {
    private String name;
    private Integer age;
    private String password;
    public User(String name,Integer age,String password){
        this.name=name;
        this.age=age;
        this.password=password;
    }
    public User(){
        //用于接收返回的User实体
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

Service层

用实现功能,编写相关的方法,与上述重写接口方法代码一致,此处笔者将其就直接放入了DAO层中,这里不再展示

测试代码如下所示

public class LoginTest {
    @Test
    public void test01(){
        UserDAOImpl userDao = new UserDAOImpl();
        User user = userDao.userlogin(new User("哈哈",2 ,"111"));
        if (Objects.isNull(user)){
            System.out.println("用户名或密码错误");
        }else {
            System.out.println("登录成功");
        }
    }
}

数据库贴图:

测试运行结果:

提醒:Entity当中的变量名称,应当与数据库表中的字段名一致,操作数据库语句中的变量名称同理,不然会导致SQL报错。

写在最后:

单元测试是非常方便的一种自测试手段,对于后端程序员来说很友好,三层架构是一种基础架构,后期大项目中还可能会出现五层甚至七层架构,基础应当勤加练习,这样后续才能得心应手。笔者小,中,大厂均有面试经历,每日分享JAVA全栈知识,希望与大家共同进步。

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

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

相关文章

【websocket-客户端可视化工具】

postman 新版postman (版本v11以上) ,除了http协议,还支持了Websocket,MQTT,gRPC等多种连接协议,可以作为多种协议的客户端,使用起来非常方便。 使用 服务端代码 这里以websocket协议举例,代…

【Linux】网络接口绑定和组合的操作实例

网络接口绑定和组合的操作实例 (一)网卡1. 增2. 查3. 激活——设置网络接口 (二)网络接口绑定1. 概述2. 实验操作3. 删除绑定 (三)网络接口组合1. 概述2. 实验操作 (一)网卡 1. 增 …

分割模型Maskformer系列

maskformer:Per-Pixel Classification is Not All You Need for Semantic Segmentation 论文地址:https://arxiv.org/pdf/2107.06278 1.概述 传统的语义分割方法通常采用逐像素分类(per-pixel classification),而实…

【JAVA基础之装箱和拆箱】自动装箱和自动拆箱

🔥作者主页:小林同学的学习笔录 🔥mysql专栏:小林同学的专栏 目录 1.包装类 1.1 概述 1.2 Integer类 1.3 装箱和拆箱 1.4 自动装箱和自动拆箱 1.5 基本类型与字符串之间的转换 1.5.1 基本类型转换为字符串 1.5.2 字符串转…

带你破解晶振PCB的布局要点!

一、晶振的分类 01 无源晶振 无源晶振器是一种 passives 振荡器,它不需要外部电源来维持振荡。它的振荡频率由晶体的物理尺寸和材料特性决定(一般都采无源晶振)。 02 有源晶振 有源晶振器是一种 active 振荡器,它需要外部电源来…

计算机中GPU快不行的几个标志,看下有没有你遇到的

GPU是处理图形密集型任务的主要组件。尽管它非常耐用,但它最终会磨损并开始失效。在到达生命的终结之前,它通常会显示出即将发生故障的迹象,需要及时修复或更换。本指南详细介绍了这些标志。 在我们开始之前 在深入研究GPU故障的迹象之前,重要的是要承认,下面提到的一些…

卷积通用模型的剪枝、蒸馏---蒸馏篇--RKD关系蒸馏(以deeplabv3+为例)

本文使用RKD实现对deeplabv3+模型的蒸馏;与上一篇KD蒸馏的方法有所不同,RKD是对展平层的特征做蒸馏,蒸馏的loss分为二阶的距离损失Distance-wise Loss和三阶的角度损失Angle-wise Loss。 一、RKD简介 RKD算法的核心是以教师模型的多个输出为结构单元,取代传统蒸馏学习中以教…

Leetcode—394. 字符串解码【中等】

2024每日刷题&#xff08;131&#xff09; Leetcode—394. 字符串解码 实现代码 class Solution { public:string decodeString(string s) {string curstr;int curNum 0;stack<pair<string, int>> st; for(char c: s) {if(isdigit(c)) {curNum curNum * 10 (c…

电脑中的两个固态硬盘比一个好,想知道为什么吗

你当前的电脑很有可能有一个NVME SSD作为主驱动器&#xff0c;但可能至少还有一个插槽可以放另一个SSD&#xff0c;而且这样做可能是个好主意。 两个SSD可以提高性能 如果你有两个固态硬盘&#xff0c;你可以从中获得比有一个更好的性能。一种方法是使用RAID 0将两个驱动器组…

Python_AI库 Pandas的loc和iloc的区别与使用实例

Python中Pandas的loc和iloc的区别与使用实例 在Pandas中&#xff0c;loc和iloc是两个常用的方法&#xff0c;用于基于标签&#xff08;label&#xff09;和整数位置&#xff08;integer location&#xff09;来选择数据。尽管两者在功能上有重叠&#xff0c;但它们在用法和性能…

OceanBase开发者大会实录:SaaS 场景降本50%!石基零售应用 OB Cloud 实践

本文来自2024 OceanBase开发者大会&#xff0c;石基零售助理总裁 、 ROC 产品事业部负责人陈亮的演讲实录—《石基零售与 OB Cloud 零售行业应用实践》。完整视频回看&#xff0c;请点击这里&#xff1e;> 大家下午好&#xff01;我是石基零售的陈亮。今天和大家分享一下石基…

struct和union大小计算规则

Union 一&#xff1a;联合类型的定义 联合也是一种特殊的自定义类型&#xff0c;这种类型定义的变量也包含一系列的成员&#xff0c;特征是这些成员公用同一块空间&#xff08;所以联合也叫共用体&#xff09; 比如&#xff1a;共用了 i 这个较大的空间 二&#xff1a; 联合的…

数据分析从入门到精通 2.pandas修真之前戏基础

从爱上自己那天起&#xff0c;人生才真正开始 —— 24.5.6 为什么学习pandas numpy已经可以帮助我们进行数据的处理了&#xff0c;那么学习pandas的目的是什么呢? numpy能够帮助我们处理的是数值型的数据&#xff0c;当然在数据分析中除了数值型的数据还有好多其他类型…

信通院智能体标准发布,实在智能牵头编写

4月28日&#xff0c;由人工智能关键技术和应用评测工业和信息化部重点实验室、中国信息通信研究院&#xff08;以下简称&#xff1a;中国信通院&#xff09;人工智能研究所共同主办的“人工智能”高质量发展研讨会顺利召开&#xff0c;会上中国信通院正式发布全国首个Agent&…

【C++】string类的使用②(容量接口Capacity || 元素获取Element access)

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a; STL || C 目录 前言&#x1f525;容量接口&#xff08;Capacity&#xff09;size和lengthcapacitymax_sizereserveresizeclearemptyshrink_to_fit &#x1f525;元素获取&#xff08;Ele…

从零开始打造个性化生鲜微信商城小程序

随着移动互联网的普及&#xff0c;小程序商城已经成为越来越多商家的选择。本文将通过实战案例分享&#xff0c;教您如何在五分钟内快速搭建个性化生鲜小程序商城。 步骤一&#xff1a;登录乔拓云网后台&#xff0c;进入商城管理页面 打开乔拓云官网&#xff0c;点击右上角的“…

【连连国际注册_登录安全分析报告】

连连国际注册/登录安全分析报告 前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨…

队列 (Queue)

今日励志语句&#xff1a;别总听悲伤的歌&#xff0c;别总想从前的事&#xff0c;别让过去拖住脚&#xff0c;别让未来被辜负。 前言&#xff1a;前面写了一篇 栈的实现&#xff0c;接下来学习一下它的"兄弟" 一、队列的概念&#xff1a; 队列&#xff1a; 也是数据…

C++类和对象(三) 缺省值 | static成员 | 内部类

前言&#xff1a; 这是关于类和对象的最后一篇文章&#xff0c;当然还是基础篇的最后一篇&#xff0c;因为类的三大特性继承&#xff0c;封装和多态都还没有讲&#xff0c;少年&#xff0c;慢慢来。 缺省值&#xff1a; 之前讲过&#xff0c;在C11的新标准中&#xff0c;支持为…

百面算法工程师 | 支持向量机面试相关问题——SVM

本文给大家带来的百面算法工程师是深度学习支持向量机的面试总结&#xff0c;文章内总结了常见的提问问题&#xff0c;旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中&#xff0c;我们还将介绍一些常见的深度学习算法工程师面试问题&#xff0c;并提供参考的回答…