• 03.基于测试开发讲解和Cobertura框架介绍


    首先我们先

    CREATE TABLE `t_user` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `username` varchar(200) DEFAULT NULL,
      `password` varchar(200) DEFAULT NULL,
      `nickname` varchar(200) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

     我们使用jdbc来操作数据库

    我们首先导入需要使用到的jar包

    接下来我们编写对应的DButils工具

    package com.weiyuan.test;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    public class DBUtils {
    
        public static Connection getConnection() throws SQLException{
            Connection connection= null;
            connection = DriverManager.getConnection("jdbc:mysql://localhost/test_junit","root","123456");
            return connection;        
        }
        
        public static void  close(Connection connection) {
            if(connection !=null){
                try {
                    connection.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }        
        }
        
        public static void  close(PreparedStatement ps) {
            if(ps !=null){
                try {
                    ps.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }        
        }
        
        public static void  close(ResultSet rs) {
            if(rs !=null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }        
        }
    }
    package com.weiyuan.dao;
    
    import com.fjnu.model.User;
    
    public interface IUserDao {
    
        public void addUser(User user);
        
        public void deleteUser(String username);
        
        public User load(String username);
    }
    package com.weiyuan.dao;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    import com.fjnu.model.User;
    import com.weiyuan.test.DBUtils;
    
    public class UserDao  implements IUserDao{
    
        @Override
        public void addUser(User user) {
            // TODO Auto-generated method stub
            Connection connection = null;
            PreparedStatement ps = null;
            
            try {
                connection = DBUtils.getConnection();
                String sql = "insert into t_user (username,password,nickname) value (?,?,?)";
                ps= connection.prepareStatement(sql);
                ps.setString(1, user.getUsername());
                ps.setString(2, user.getPassword());
                ps.setString(3, user.getNickname());
                ps.executeUpdate();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally{
                DBUtils.close(connection);
                DBUtils.close(ps);
            }
            
        }
    
        @Override
        public void deleteUser(String username) {
            // TODO Auto-generated method stub
        
            
        }
    
        @Override
        public User load(String username) {
            
            Connection connection = null;
            PreparedStatement ps = null;
            User user = null;
            ResultSet rs = null;
            System.out.println("load is calle");
            try {
                connection = DBUtils.getConnection();
                String sql = "select * from t_user where username = ?";
                ps= connection.prepareStatement(sql);
                ps.setString(1, username);
                 rs= ps.executeQuery();
                 while(rs.next()){
                     if(user == null){
                         user = new User();
                     }
                     System.out.println("load is222 calle");
                     user.setId(rs.getInt("id"));
                     user.setUsername(rs.getString("username"));
                     user.setPassword(rs.getString("password"));
                     user.setNickname(rs.getString("nickname"));
                 }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally{
                DBUtils.close(connection);
                DBUtils.close(ps);
                DBUtils.close(rs);
            }
            return user;
        }
    
    }

    接下来是具体的业务实现类

    package com.fjnu.service;
    
    import com.fjnu.model.User;
    
    public interface IUserService {
        public void add(User user);
        
        public void delete(String username);
        
        public User load(String username);
        
        public User login(String username, String password);
    }
    package com.fjnu.service;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import com.fjnu.model.User;
    import com.weiyuan.dao.UserDao;
    
    public class UserService implements IUserService {
        
        private UserDao userDao;
        
        
        
        public UserService(UserDao userDao) {
            super();
            this.userDao = userDao;
        }
    
        
        
        public UserService() {
            super();
        }
    
    
    
        @Override
        public void add(User user) {
            // TODO Auto-generated method stub
            if(load(user.getUsername()) != null){
                try {
                    throw new Exception("用户名已存在");
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            userDao.addUser(user);
        }
    
        @Override
        public void delete(String username) {
            // TODO Auto-generated method stub
            userDao.deleteUser(username);
        }
    
        @Override
        public User load(String username) {
            // TODO Auto-generated method stub
            return userDao.load(username);
        }
    
    
    
        @Override
        public User login(String username, String password) {
            // TODO Auto-generated method stub
            return null;
        }
    
    
    
    }

    接下来在我们的test下编写我们的业务测试类,包名要和具体的src上的业务在同一个报下package com.fjnu.service;

    package com.fjnu.service;
    
    import static org.junit.Assert.*;
    
    import org.junit.Before;
    import org.junit.Test;
    
    import com.fjnu.model.User;
    import com.weiyuan.dao.UserDao;
    
    
    public class TestUserService {
        private IUserService us;
        private User baseUser;
        
        @Before
        public void setUp(){
            // 初始化
            us = new UserService(new UserDao());
            baseUser = new User("admin", "123", "管理员");
        }
        
        private void assertUserEquals(User u, User tu){
            assertEquals("add方法有错误!", u.getUsername(), tu.getUsername());
            assertEquals("add方法有错误!", u.getNickname(), tu.getNickname());
            assertEquals("add方法有错误!", u.getPassword(), tu.getPassword());
        }
        
        @Test
        public void testAdd(){
            User u = baseUser;
            us.add(u);
            User tu = us.load("admin");
            assertNotNull(tu);
            assertUserEquals(u, tu);
            //fail("请加入添加的测试代码");
        }
        
        @Test(expected=Exception.class)
        public void AddExistUsername(){
            us.add(baseUser);
            User tu = new User("admin", "1234", "alskdf");
            us.add(tu);
        }
        
        @Test
        public void testDelete(){
            us.add(baseUser);
            User tu = us.load(baseUser.getUsername());
            assertNotNull(tu);
            us.delete(baseUser.getUsername());
            tu = us.load(baseUser.getUsername());
            assertNull(tu);
        }
        
        @Test
        public void testLogin(){
             us.add(baseUser);
            String username=baseUser.getUsername();
            String password=baseUser.getPassword();
            User tu = us.login(username, password);
            assertUserEquals(baseUser, tu);
        }
        
        @Test(expected=Exception.class)
        public void testNotExistsUserLogin(){
            us.add(baseUser);
            String username="admin1";
            String password="123";
            us.login(username, password);
         }
        
        @Test(expected=Exception.class)
        public void testPasswordErrorUserLogin(){
            us.add(baseUser);
            String username="admin";
            String password="1235";
            us.login(username, password);
        }
    }

    这样就完成了测试,但是在测试的过程中会对数据库中的数据产生影响,我们可以使用下面的这种方式来解决

    Stub和Mock综述

    为何使用Stub和Mock呢?在现实的开发过程中,需要去测试的一个方法并不总是单独存在的,它可能依赖其他方法或者类,比如你要测试service层的逻辑,可能依赖于dao层的数据交互;测试dao层的数据库交互方法,可能会需要去连接数据库。有了Stub和Mock可以降低它们的复杂性,没必要说一定要有数据库连接才能去测试service层的业务逻辑,假如我开发service层的,就没有没必要等同事将DAO层的代码写好,来验证service层的业务逻辑是否正确。


    Stub简单介绍


    Stub是一个虚拟的物件,一个Stub可以使用最少的依赖方法来模拟该单元测试。简单的说,stub是代码的一部分。在运行时用stub替换真正代码,忽略调用代码的实现。目的是用一个简单一点的行为替换一个复杂的行为,从而独立地测试代码的某一部分。比如,要测试dao层的代码,势必要连接数据库,这时候就可以使用HashMap来模拟数据库操作,这个Stub对象就可以根据你想要的状态去模拟,通过方法去测试Stub的内部状态。可以使用map的方式以及dbUtil来实现stub测试。

    package com.weiyuan.dao;
    
    import java.util.HashMap;
    
    import com.fjnu.model.User;
    
    public class UserDaoByHashMapImpl  implements IUserDao{
        private HashMap<String,User> map = new HashMap<>();
    
        @Override
        public void addUser(User user) {
            // TODO Auto-generated method stub
            map.put(user.getUsername(), user);
        }
    
        @Override
        public void deleteUser(String username) {
            // TODO Auto-generated method stub
            map.remove(username);
        }
    
        @Override
        public User load(String username) {
            // TODO Auto-generated method stub
            return map.get(username);
        }
    
    }

    我们在测试的时候使用上面创建的类来代替操作真正的数据库

  • 相关阅读:
    中南财经政法大学深圳校友会政法分会上线
    我们为什么需要校友录 人脈存摺
    北京印刷学院校友录试运行
    南京理工大学校友会正式上线
    我们为什么需要校友录 校友录的传播学解读
    CC校友录贴吧 CCBarV0908 正式发布
    我们为什么需要校友录 快捷的校友信息云图
    我们为什么需要校友录 精英圈子准入证 一辈子的学分
    我们为什么需要校友录 某某大学深圳校友录年底盘点
    我们为什么需要校友录 又到一年毕业时毕业感怀文集
  • 原文地址:https://www.cnblogs.com/kebibuluan/p/8907080.html
Copyright © 2020-2023  润新知