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

news2024/11/21 2:32:57

单元测试

为什么要进行单元测试

减少创建类,我们希望在一个类中,并且测试时不需要改代码,那么我们就要用到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全栈知识,希望与大家共同进步。

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

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

相关文章

【源码+文档+调试教程】基于微信小程序的电子购物系统的设计与实现

摘 要 由于APP软件在开发以及运营上面所需成本较高,而用户手机需要安装各种APP软件,因此占用用户过多的手机存储空间,导致用户手机运行缓慢,体验度比较差,进而导致用户会卸载非必要的APP,倒逼管理者必须改…

H5228 DCDC 6.5-75V LED升降压恒流芯片IC,支持12V24V36V48V60V PWM、模拟和数转模调光

PWM(脉冲宽度调制)、模拟和数转模调光DCDC电源管理芯片的工作原理涉及多个方面。 首先,对于PWM调光,其基本原理是通过控制脉冲的宽度来调节LED的亮度。具体来说,当PWM信号为高电平时,LED亮起;当…

数据结构的堆(c语言版)

一.堆的概念 1.堆的基本概念 在计算机科学中,堆是一种特殊的数据结构,通常用于实现优先队列和动态分配内存。 2.堆的特征 堆是一个完全二叉树,它具有以下两个主要特性: 堆序性:对于最大堆,在堆中的任意节…

LeetCode例题讲解:只出现一次的数字

给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。 示例 1 : 输入&#xff…

线程的常见方法

线程的常见方法 休眠: 让当前状态不再参与cpu的竞争,直到休眠结束; 结果:并不是完全交替进行的,因为只是休眠状态,也会存在争抢cpu 放弃: 让当前状态主动放弃时间片,下次再去争抢…

js原生手写一个拖拽小功能

先上效果图 附上代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" content"widthd…

压缩和归档库-LZ4介绍

1.简介 LZ4是一种快速的压缩算法&#xff0c;提供压缩和解压缩的速度&#xff0c;而牺牲了压缩率。它被设计用于快速的数据压缩和解压缩&#xff0c;特别是用于数据存储和传输。LZ4通常用于需要高速数据处理的场景&#xff0c;如数据库、日志文件处理和实时数据传输。 LZ4的特…

LeetCode例题讲解:快乐数

编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。如果这个过程 结果为 1&#xff0c…

C++青少年简明教程:基础知识

C青少年简明教程&#xff1a;基础知识 电脑程序设计&#xff08;Computer programming&#xff09;&#xff0c;或称程序设计&#xff08;programming&#xff09;&#xff0c;是给出解决特定问题程序的过程&#xff0c;程序设计往往以某种程序设计语言为工具&#xff0c;给出这…

每周一算法:传递闭包

题目描述 不等式排序 给定 n n n个变量和 m m m个不等式。其中 n n n小于等于 26 26 26&#xff0c;变量分别用前 n n n 的大写英文字母表示。 不等式之间具有传递性&#xff0c;即若 A > B A>B A>B 且 B > C B>C B>C&#xff0c;则 A > C A>C …

音转文工具,9.8k star! 【送源码】

我们经常会遇到将音频转为文字的情况&#xff0c;比如在开会时录音的会议纪要、上课时录下的老师讲课内容。虽然网上也有一些在线的工具可以将音频转为文字&#xff0c;但是考虑到数据安全和费用问题&#xff0c;使用起来也不是很方便。 今天了不起给大家介绍一款开源工具——…

存储或读取时转换JSON数据

一、 数据库类型 二、使用Hutool工具 存储时将数据转换为JSON数据 获取时将JSON数据转换为对象 发现问题&#xff1a; 原本数据对象是Address 和 Firend但是转换完成后数据变成了JSONArray和JSONObject 三、自定义TypeHandler继承Mybatis的BaseTypeHandler处理器 package …

javaMail快速部署——发邮件喽~

目录 功能阐述 前序步骤 &#xff08;1&#xff09;到QQ邮箱中获取到授权码 代码实现 坑 今天在写一个修改密码的功能的时候要用到邮箱的发送&#xff0c;然后因为这个项目比较老旧了&#xff0c;采用的是javaWeb和jsp的配置&#xff0c;对于我只使用过springBoot整合的ja…

进一步分析并彻底解决 Flink container exit 143 问题

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…

ASP.NET信息安全研究所设备管理系统的设计与实现

摘 要 以研究所的设备管理系统为背景&#xff0c;以研究所设备管理模式为研究对象&#xff0c;开发了设备管理系统。设备管理系统是设备管理与计算机技术相结合的产物&#xff0c;根据系统的功能需求分析与定义的数据模式&#xff0c;分析了应用程序的主要功能和系统实现的主…

最佳实践 | 八爪鱼采集器如何用PartnerShare做全民分销?

在数字化时代&#xff0c;数据采集和分析已经成为企业运营和决策的重要一环。八爪鱼采集器作为一款领先的SaaS产品&#xff0c;凭借其强大的数据采集和处理能力&#xff0c;成为了众多企业和个人用户的心头好。为了进一步拓展市场份额&#xff0c;提升品牌影响力&#xff0c;八…

nature《自然》期刊文献怎么在家查看下载

nature《自然》期刊我们都知道&#xff0c;是世界上历史悠久的、最有名望的科学杂志之一。下载该期刊文献是需要使用权限的&#xff0c;如果你没有nature《自然》期刊的资源&#xff0c;又该如何获取呢&#xff1f;请看本文的经验分享。 一、先百度“文献党下载器” 在文献党下…

PSCA电源管理软件栈示例

安全之安全(security)博客目录导读 目录 1、移动通讯系统 2、基础设施系统 本博客就PSCA电源管理软件栈进行举例&#xff0c;主要以移动通讯系统和基础设施系统为例来说明。 1、移动通讯系统 图3.4显示了一个可以在基于Linux的移动设备中实现的电源管理堆栈示例。 在Linux…

在uniapp中如何安装axios并解决跨域问题

目录 1、安装axios 2、导入 3、使用&#xff08;发请求&#xff09; 2.解决跨域问题 1.为什么要解决跨域问题&#xff1f; 2.前端如何解决跨域问题&#xff1f; 1、安装axios npm install axios 2、导入 在main.js中导入使用 import axios from axios; // 创建一个名…

【C++】STL-list模拟实现

目录 1、本次需要实现的3个类即接口总览 2、list的模拟实现 2.1 链表结点的设置以及初始化 2.2 链表的迭代器 2.3 容量接口及默认成员函数 1、本次需要实现的3个类即接口总览 #pragma once #include<iostream> #include<assert.h> using namespace std; templ…