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