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)导出覆盖率报告