应用junit测试工具进行数据库单元测试

Eclipse 中Junit 的配置
Eclipse IDE 中集成了JUnit 组件,无须另行下载和安装,但是为了更好的使
用Junit(更多细节请参考http://www.junit.org ),我们还要在Eclipse 中进行一些设
置。其中主要是就是类路径变量的设置。

工具:eclipse代码测试覆盖率小工具—coverage
安装教程看这里
入门案例

1.掌握白盒测试方法,并按单元测试的要求设计数据库测试用例。
2.能熟练应用junit测试工具进行数据库单元测试。
3.进行数据库代码覆盖检查。

Junit配置步骤(案例)【数据库使用的是Access数据库】

在这里插入图片描述
(1)首先新建一个项目叫database,我们编写一个PersonDB类,这是一个能够简单实现增查改删的数据库管理类。

package database;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class PersonDB {
	private ConDB db = new ConDB();	 
	 public void insert(Person person)
	 {
	  Connection con = null;
	  try 
	  {
	   con = db.getConnection();
	   String sql = "insert into person(username,password,age) values (?,?,?)";
	 //  String sql = "INSERT INTO person(username,password,age) VALUES(NULL," + person.getUsername()
	//			+ ",'" + person.getPassword() + ","+ person.getAge()+")";
 
	   PreparedStatement st = con.prepareStatement(sql);//现在都使用PreparedStatement 不用statement了 
	   st.setString(1, person.getUsername());
	   st.setString(2, person.getPassword());
	   st.setInt(3, person.getAge());   
	   st.executeUpdate();
	  } catch (Exception ex)
	  {
	   ex.printStackTrace();
	  } finally
	  {
	   try
	   {
	    con.close();
	   // st.close();
	    
	   } catch (SQLException e)
	   {
	    e.printStackTrace();
	   }
	  }
	  
	 }
	 
	 public Person getById(int id)
	 {
	  Connection con = null;
	  Person person = new Person();
	  
	  try
	  {
	   con = db.getConnection();
	   
	   String sql = "select * from person where id = "+id;
	   
	   PreparedStatement st = con.prepareStatement(sql);
	   
	   ResultSet rs = st.executeQuery();
	   
	   if(rs.next())
	   {
	    person.setId(id);
	    person.setUsername(rs.getString("username"));
	    person.setPassword(rs.getString("password"));
	    person.setAge(rs.getInt("age"));
	   }
	  } 
	  catch (Exception ex)
	  {
	   ex.printStackTrace();
	  }
	  finally 
	  {
	   try
	   {
	    con.close();
	   } catch (SQLException e)
	   {
	    e.printStackTrace();
	   }
	  }
	  return person;
	 }
	 
	 public void delete(int id)
	 {
	  Connection con = null;
	  
	  try
	  {
	   con = db.getConnection();
	   
	   String sql ="delete person where id = "+id;
	   
	   PreparedStatement st = con.prepareStatement(sql);
	   
	   st.executeUpdate();
	  }
	  catch (Exception ex)
	  {
	   ex.printStackTrace();
	  }
	  finally
	  {
	   try
	   {
	    con.close();
	   } catch (SQLException e)
	   {
	    e.printStackTrace();
	   }
	  }
	 }
	 
	 public void update(Person person)
	 {
	  Connection con = null;
	  
	  try
	  {
	   con = db.getConnection();
	   
	   String sql = "update person set username=? ,password=? ,age=? where id = ?";
	//	String sql = "UPDATE person SET username = '" + person.getUsername() 
	//	    	+ "', password = '" + person.getPassword()
	//	    	+ "', age = '" + person.getAge()+  
	//	  "' WHERE id = '" + person.getId() + "'"; 
		//+ "'  WHERE number = '" + id + "'";
		PreparedStatement st = con.prepareStatement(sql);
	   
	   st.setString(1, person.getUsername());
	   st.setString(2, person.getPassword());
	   st.setInt(3, person.getAge());
	   st.setInt(4, person.getId());
	   
	   st.executeUpdate();
	   
	   
	  } catch (Exception ex)
	  {
	   ex.printStackTrace();
	  }
	  finally
	  {
	   try
	   {
	    con.close();
	   } catch (SQLException e)
	   {
	    e.printStackTrace();
	   }
	  }
	 }	 
}

依赖的类有

import java.sql.Connection;
import java.sql.DriverManager;



public class ConDB
{
// private static String driver = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
// private static String url = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=person";
// private static String user = "sa";
// private static String password = "11";
	protected static String dbClassName = "com.hxtt.sql.access.AccessDriver";
	protected static String dbUrl = "jdbc:Access:///e://db_demo/db_student.accdb";
	protected static String dbUser = "";
	protected static String dbPwd = "";
 
 public static Connection getConnection()
 {
  Connection con = null;
  
  String path = "jdbc:Access:///" + System.getProperty("user.dir") + "/db_student.accdb";
	
	try {
		Class.forName(dbClassName).newInstance();
		// 加载数据库驱动
		con = DriverManager.getConnection(path, dbUser, dbPwd);
		// 获取数据库连接
		System.out.println("数据库连接成功");
	} catch (Exception e) {
		System.out.println("数据库连接失败!");
		e.printStackTrace();
	}
  return con;
 }

}


public class Person {
	private int id ;
	 private String username;
	 private String password;
	 private int age;
	 public int getId()
	 {
	  return id;
	 }
	 public void setId(int id)
	 {
	  this.id = id;
	 }
	 public String getUsername()
	 {
	  return username;
	 }
	 public void setUsername(String username)
	 {
	  this.username = username;
	 }
	 public String getPassword()
	 {
	  return password;
	 }
	 public void setPassword(String password)
	 {
	  this.password = password;
	 }
	 public int getAge()
	 {
	  return age;
	 }
	 public void setAge(int age)
	 {
	  this.age = age;
	 }
}

(2)将JUnit4单元测试包引入这个项目:在该项目上点右键,点“配置构建路径”,如图:
在这里插入图片描述
在弹出的属性窗口中,首先在左边选择“Java 构建路径”,然后到右上选择“库”标签,之后在最右边点击“添加库…”按钮,如下图所示:
在这里插入图片描述
然后在新弹出的对话框中选择JUnit4并点击确定,如上图所示,JUnit4软件包就被包含进我们这个项目了。第三步,生成JUnit测试框架:在Eclipse的Package Explorer中用右键点击该类弹出菜单,选择“JUnit测试用例”。如下图所示:
在这里插入图片描述
在弹出的对话框中,进行相应的选择,如下图所示:

在这里插入图片描述
点击“下一步”后,系统会自动列出你这个类中包含的方法,选择你要进行测试的方法。此例中,我们仅对“增加,删除,修改,查询”四个方法进行测试。如下图所示:
在这里插入图片描述
之后系统会自动生成一个新类PersonDBTest1,里面包含一些空的测试用例。

在这里插入图片描述
(3)你只需将这些测试用例稍作修改即可使用。完整的PersonDBTest代码如下:

package database;
import static org.junit.Assert.*;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import org.junit.Assert;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
public class PersonDBTest {
	private static Connection con = null;
	 private PersonDB personDB = null;
	 @BeforeClass
	 public static void setUpBeforeClass() throws Exception
	 {
	  con = ConDB.getConnection();//创建连接
	 }
	 @AfterClass
	 public static void tearDownAfterClass() throws Exception
	 {
	  con.close();
	 }
	 @Before
	 public void setUp() throws Exception
	 {
	  personDB = new PersonDB();
	 }

	 @Test
	 public void testInsert()
	 {
	  Person person = new Person();//创建Person对象,插入..

	  person.setUsername("chensi");
	  person.setPassword("123456");
	  person.setAge(20);

	  personDB.insert(person);

	  Person person2 = new Person();

	  person2 = personDB.getById(this.getMaxId());//这里用到了获取当前最大ID的方法.这个方法我设定为private类
	//型.是帮助方法..数据库的ID我设定为自增..每次加1..
	  this.Assert(person, person2);
	 // personDB.delete(this.getMaxId());
	  //最后删除这条数据...测试不要给数据库增加垃圾数据.
	 }
	 @Test
	 public void testGetById()//这里的测试和上面测试Insert方法的代码一样..这里我也有点不确定..你也可以在这里

	//重写一个getbyid方法.但是我觉得没必要..
	 {
	  Person person = new Person();
	  person.setUsername("chensi");
	  person.setPassword("123456");
	  person.setAge(20);
	  personDB.insert(person);
	  Person person2 = new Person();
	  person2 = personDB.getById(this.getMaxId());
	  this.Assert(person, person2);
	//  personDB.delete(this.getMaxId());
    //  personDB.delete(getMaxId());
	 }
	 @Test
	 public void testDelete()//思想是,先插入,然后删除 最后看是否为空
	 {
	  Person person = new Person();
	  person.setUsername("han");
	  person.setPassword("111");
	  person.setAge(11);
	  personDB.insert(person);
	  Person person2 = new Person();
	  person2 = personDB.getById(this.getMaxId());
	  this.Assert(person, person2);
	//  personDB.delete(this.getMaxId());
	  Person person3 = new Person();
	  person3 = personDB.getById(person2.getId());
//	  Assert.assertNull(person3.getUsername());//注意,断言的时候要断言具体的那个属性值.而不能断言person3为空.
	 // System.out.println(person2.getId());
	  //Assert.assertNull(personDB.getById(person2.getId()));
	  //Assert.assertNotNull(personDB.getById(this.getMaxId()));
	 }
	 @Test
	 public void testUpdate()
	 {
	  Person person = new Person();
	  person.setUsername("1111");
	  person.setPassword("pass");
	  person.setAge(111);
	  personDB.insert(person);
	  Person person2 = new Person();
	  person2 = personDB.getById(this.getMaxId());
	  this.Assert(person, person2);
	  Person person3 = new Person();
	  person3.setId(person2.getId());
	  person3.setUsername("2222");
	  person3.setPassword("word");
	  person3.setAge(0);
	 // System.out.println(person3.getId());
	  personDB.update(person3);
	  Person person4 = new Person();
	  person4 = personDB.getById(this.getMaxId());
	  this.Assert(person3, person4);
	//  personDB.delete(person2.getId());
	 }
	 private int getMaxId()//帮助方法.所以设置为private 
	 {
	  int id = 0;
	  try
	  {
	   String sql = "select max(id) from person ";
	   PreparedStatement st = con.prepareStatement(sql);
	   ResultSet rs = st.executeQuery();
	   if (rs.next())
	   {
	    id = rs.getInt(1);
	   }
	  } catch (Exception ex)
	  {
	   ex.printStackTrace();
	  }
	  return id;
	 }
	 private void Assert(Person person1, Person person2)//帮助代码.起到提取代码的作用.
	 {
	  assertEquals(person1.getUsername(), person2.getUsername());
	  assertEquals(person1.getPassword(), person2.getPassword());
	  assertEquals(person1.getAge(), person2.getAge());
	 }
}

(4)运行测试代码:按照上述代码修改完毕后,我们在PersonDBTest类上点右键,选择“JUnit测试”来运行我们的测试,如下图所示:
在这里插入图片描述
运行结果如下:
在这里插入图片描述
(5)导出覆盖率报告
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值