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

相关推荐

  1. spring-ioc架构测试

    2024-05-10 08:38:10       35 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-10 08:38:10       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-10 08:38:10       101 阅读
  3. 在Django里面运行非项目文件

    2024-05-10 08:38:10       82 阅读
  4. Python语言-面向对象

    2024-05-10 08:38:10       91 阅读

热门阅读

  1. Django3 个人开发笔记

    2024-05-10 08:38:10       22 阅读
  2. Linux Nano 编辑器

    2024-05-10 08:38:10       27 阅读
  3. 信息系统架构_2.信息系统架构分类

    2024-05-10 08:38:10       36 阅读
  4. vlan和vxlan的区别与联系,以及他们对应的设备

    2024-05-10 08:38:10       58 阅读
  5. python的zip函数

    2024-05-10 08:38:10       36 阅读
  6. How to Install PySpark on Mac(Mac上安装PySpark)

    2024-05-10 08:38:10       30 阅读