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

单元测试

为什么要进行单元测试

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

常见测试分类

黑盒测试

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

白盒测试

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

灰盒测试

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

单元测试

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

测试类代码示例:

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

java 复制代码
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代码如下

java 复制代码
public interface UserDao {
    User userlogin(User user);//定义方法
}

Dao中重写userlogin方法

java 复制代码
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当中写收集数据的方法,即实体类

代码如下

java 复制代码
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层中,这里不再展示

测试代码如下所示

java 复制代码
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全栈知识,希望与大家共同进步。

相关推荐
菜鸟求带飞_几秒前
算法打卡:第十一章 图论part01
java·数据结构·算法
骆晨学长17 分钟前
基于springboot的智慧社区微信小程序
java·数据库·spring boot·后端·微信小程序·小程序
AskHarries22 分钟前
利用反射实现动态代理
java·后端·reflect
@月落23 分钟前
alibaba获得店铺的所有商品 API接口
java·大数据·数据库·人工智能·学习
liuyang-neu28 分钟前
力扣 42.接雨水
java·算法·leetcode
z千鑫32 分钟前
【人工智能】如何利用AI轻松将java,c++等代码转换为Python语言?程序员必读
java·c++·人工智能·gpt·agent·ai编程·ai工具
楠枬33 分钟前
MySQL数据的增删改查(一)
数据库·mysql
goTsHgo38 分钟前
从底层原理上解释 clickhouse 保证完全的幂等性
数据库·clickhouse
Flying_Fish_roe1 小时前
Spring Boot-Session管理问题
java·spring boot·后端
赚钱给孩子买茅台喝1 小时前
智能BI项目第四期
java·spring boot·spring cloud·aigc