网上聊天室设计
测试顺序:单元测试、集成测试、系统测试、验收测试等
测试用例分别从界面、功能、兼容性、易用性、安全性、性能等方面进行分析
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
<scope>testscope>
dependency>
(1)File——》Setting——》Plugins
2)安装JUnitGenerator.jar(建议找网盘下载然后本地导入)(这边懒的重新弄图,直接引用个人博客的环境安装步骤)
链接:JUnitGenerator.jar百度网盘
提取码:hhpn
环境准备完毕,开始测试
Junit创建单元测试快捷键:点击类名,ctrl+shift+T 将会在test文件夹下自动生成一个包存放创建的测试类
UserDao类
public class UserDao {
//1.新增一个用户(注册功能)
public void add(User user){
//1.获取数据库连接
Connection c=DBUtil.getConnection();
PreparedStatement ps=null;
try {
//2.拼装SQL语句
String sql="insert into user value (null,?,?,?,now())";
ps=c.prepareStatement(sql);
ps.setString(1,user.getName());
ps.setString(2,user.getPassword());
ps.setString(3,user.getNickname());
//3.执行SQL语句
int rs=ps.executeUpdate();
if(rs!=1){
//出现问题的处理方式有很多种
//此处可以抛出一个自定义异常
throw new ChatroomException("插入用户失败");
}
System.out.println("插入用户成功");
} catch (SQLException e) {
e.printStackTrace();
throw new ChatroomException("插入用户失败");
} finally {
//4.释放连接
DBUtil.close(c,ps);
}
}
//2.按用户名查找用户信息(登录功能)
public User selectByName(String name){
//1.获取到连接
Connection c=DBUtil.getConnection();
PreparedStatement ps=null;
ResultSet rs=null;
//2.拼装SQL
String sql= null;
try {
sql = "select userId,name ,password, nickname, lastLogout from user where name=?";
ps=c.prepareStatement(sql);
ps.setString(1,name);
//3.执行SQL
rs=ps.executeQuery();
if(rs.next()){
User user=new User();
user.setUserId(rs.getInt("userId"));
user.setName(rs.getString("name"));
user.setPassword(rs.getString("password"));
user.setNickname(rs.getString("nickname"));
user.setLastLogout(rs.getTimestamp("lastLogout"));
return user;
}else{
System.out.println("该用户不存在");
}
//throw new ChatroomException("查询用户信息失败");
} catch (Exception e) {
e.printStackTrace();
throw new ChatroomException("按用户名查询用户信息失败");
} finally {
//5.释放连接
DBUtil.close(c,ps,rs);
}
return null;
}
//3.按用户id查找用户信息(把userID转换成昵称的时候)
public User selectByID(int userId){
//1.获取到连接
Connection c=DBUtil.getConnection();
PreparedStatement ps=null;
ResultSet rs=null;
//2.拼装SQL
String sql= null;
try {
sql = "select userId,name ,password, nickname, lastLogout from user where userId= ?";
ps=c.prepareStatement(sql);
ps.setInt(1,userId);
//3.执行SQL
rs=ps.executeQuery();
if(rs.next()){
User user=new User();
user.setUserId(rs.getInt("userId"));
user.setName(rs.getString("name"));
user.setPassword(rs.getString("password"));
user.setNickname(rs.getString("nickname"));
user.setLastLogout(rs.getTimestamp("lastLogout"));
return user;
}else{
System.out.println("该用户不存在");
}
//throw new ChatroomException("查询用户信息失败");
} catch (Exception e) {
e.printStackTrace();
throw new ChatroomException("按id查询用户信息失败");
} finally {
//5.释放连接
DBUtil.close(c,ps,rs);
}
return null;
}
//4.更新用户的lastLogout时间,(用户下线的时刻更新,为了实现历史纪录功能)
public void updateLogout(int userID){
//1.获取连接
Connection c=DBUtil.getConnection();
PreparedStatement ps=null;
//2.拼装sql
try {
String sql="update user set lastLogout=now() where userId=?";
ps=c.prepareStatement(sql);
ps.setInt(1,userID);
//3.执行操作
int ret=ps.executeUpdate();
if(ret!=1) {
throw new ChatroomException("退出更新时间失败1");
}
System.out.println("更新退出时间成功");
} catch (SQLException e) {
e.printStackTrace();
throw new ChatroomException("退出更新时间失败1");
} finally {
DBUtil.close(c,ps);
}
}
}
测试UserDao类中的add(User user)模块
测试用例:
1.无用户昵称,无用户名,无密码
2.有用户昵称,无用户名,无密码
3.无用户昵称,有用户名,无密码
4.无用户昵称,无用户名,有密码
5.有用户昵称,有用户名,无密码
6.有用户昵称,无用户名,有密码
7.无用户昵称,有用户名,有密码
8.有用户昵称,有用户名,有密码
@Test
public void add() {
User user=new User();
user.setNickname("YIYI一一");
user.setName("abc");
user.setPassword("123");
UserDao userDao=new UserDao();
userDao.add(user);
}
测试UserDao类中的selectByName()模块
测试用例:
1.无用户名输入
2.用户名不存在数据库中
3.输入非法字符
4.输入正常用户名
@Test
public void selectByName() {
User user=new User();
UserDao userDao=new UserDao();
user=userDao.selectByName("abc");
System.out.println(user);
}
测试UserDao类中的selectByID()模块
测试用例:
1.不输入用户ID
2.输入不存在的ID
3.输入非int类型的基本类型
4.输入数组类型
5.输入int类型且存在的用户id
@Test
public void selectByID() {
User user=new User();
UserDao userDao=new UserDao();
user=userDao.selectByID(1);
System.out.println(user);
}
测试UserDao类中的updateLogout()模块
测试用例:
1.不输入用户ID
2.输入不存在的ID
3.输入非int类型的基本类型
4.输入数组类型
5.输入int类型且存在的用户id
@Test
public void updateLogout() {
User user=new User();
UserDao userDao=new UserDao();
userDao.updateLogout(1);
}
Junit创建单元测试快捷键:点击类名,ctrl+shift+T 将会在test文件夹下自动生成一个包存放创建的测试类
MessageDao类
public class MessageDao {
//1.新增消息
public void add(Message message){
//1.获取连接
Connection c=DBUtil.getConnection();
PreparedStatement ps=null;
//2.拼装sql
String sql="insert into message values (null,?,?,?,?)";
try {
ps=c.prepareStatement(sql);
ps.setInt(1,message.getUserId());
ps.setInt(2,message.getChannelId());
ps.setString(3,message.getContent());
ps.setTimestamp(4,message.getSendTime());
//3.执行SQL
int ret=ps.executeUpdate();
if(ret!=1){
throw new ChatroomException("消息发送失败");
}
System.out.println("插入消息成功");
} catch (SQLException e) {
e.printStackTrace();
throw new ChatroomException("消息发送失败");
} finally {
//4.关闭链接
DBUtil.close(c,ps);
}
}
//2.按时间段查询消息
public List<Message> selectByTimeStamp(Timestamp from, Timestamp to){
List<Message> messages=new ArrayList<>();
//1.获取到链接
Connection c=DBUtil.getConnection();
//2.拼装SQL
//MySQL中的datetime类型是可以直接比较大小
String sql="select messageId, userId, channelId, content, sendTime from message where sendTime>=? and sendTime<=?";
PreparedStatement ps=null;
ResultSet rs=null;
try {
ps=c.prepareStatement(sql);
ps.setTimestamp(1,from);
ps.setTimestamp(2,to);
//3.执行SQL
rs=ps.executeQuery();
while (rs.next()){
Message message=new Message();
message.setMessageId(rs.getInt("messageId"));
message.setUserId(rs.getInt("userId"));
message.setChannelId(rs.getInt("channelId"));
message.setContent(rs.getString("content"));
message.setSendTime(rs.getTimestamp("sendTime"));
messages.add(message);
}
return messages;
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBUtil.close(c,ps,rs);
}
return null;
}
}
测试MessageDao类中的add()消息发送模块
测试用例:
L=N(TC)=(2-1)*4+1=5
用户id,选择频道id,输入发送信息,发送时间
因素名称 | 用户id | 选择频道id | 输入发送信息 | 发送时间 |
---|---|---|---|---|
1 | Y | N | Y | N |
2 | N | Y | N | Y |
3 | Y | N | N | Y |
4 | N | Y | Y | Y |
5 | Y | N | Y | N |
特殊
因素名称 | 用户id | 选择频道id | 输入发送信息 | 发送时间 |
---|---|---|---|---|
6 | N | N | N | N |
7 | Y | Y | Y | Y |
@Test
public void add() {
MessageDao messageDao=new MessageDao();
Message message=new Message();
message.setUserId(1);
message.setChannelId(1);
message.setContent("java学习频道");
message.setSendTime(new Timestamp(System.currentTimeMillis()));
messageDao.add(message);
}
测试MessageDao类中的selectByTimeStamp()历史消息模块
测试用例:
1.不输入起始时间,不输入结束时间
2.不输入起始时间,输入结束时间
3.输入起始时间,不输入结束时间
4.输入起始时间,输入结束时间
@Test
public void selectByTimeStamp() {
MessageDao messageDao=new MessageDao();
//获取指定时间段的消息
//from 构造了:2020-07-28 12:20:25
//to 构造了:2020-07-28 12:35:25
//此处时间戳是一个很大的数字,已经超出了int的范围,因此加上L后缀,表示这是一个long的类型
List<Message> messages=messageDao.selectByTimeStamp(
new Timestamp(1595910025000L),new Timestamp(1595910925000L)
);
System.out.println(messages);
}
Junit创建单元测试快捷键:点击类名,ctrl+shift+T 将会在test文件夹下自动生成一个包存放创建的测试类
ChannelDao类
public class ChannelDao {
//1.新增频道
public void add(Channel channel){
//1.获取数据库连接
Connection c=DBUtil.getConnection();
PreparedStatement ps=null;
try {
String sql="insert into channel value (null,?)";
//2.拼装SQL
ps=c.prepareStatement(sql);
ps.setString(1,channel.getChannelName());
//3.执行SQL
int rs=ps.executeUpdate();
if(rs!=1){
throw new ChatroomException("新增频道失败");
}
System.out.println("新增频道成功");
} catch (SQLException e) {
e.printStackTrace();
throw new ChatroomException("新增频道失败");
} finally {
//4.断开连接
DBUtil.close(c,ps);
}
}
//2.删除频道
public void delete(int channelId){
//1.获取数据库连接
Connection c=DBUtil.getConnection();
PreparedStatement ps=null;
try {
String sql="delete from channel where channelId=?";
//2.拼装SQL
ps=c.prepareStatement(sql);
ps.setInt(1,channelId);
//3.执行SQL
int rs=ps.executeUpdate();
if(rs!=1){
throw new ChatroomException("删除频道失败");
}
System.out.println("删除频道成功");
} catch (SQLException e) {
e.printStackTrace();
throw new ChatroomException("删除频道失败");
} finally {
//4.断开连接
DBUtil.close(c,ps);
}
}
//3.查看频道列表
public List<Channel> selectAll(){
List<Channel> channels=new ArrayList<>();
//1.获取数据库连接
Connection c=DBUtil.getConnection();
PreparedStatement ps=null;
ResultSet rs=null;
try {
String sql="select channelId, channelName from channel";
//2.拼装SQL
ps=c.prepareStatement(sql);
//3.执行SQL
rs=ps.executeQuery();
while (rs.next()){
Channel channel=new Channel();
channel.setChannelId(rs.getInt("channelId"));
channel.setChannelName(rs.getString("channelName"));
channels.add(channel);
}
if(rs==null){
throw new ChatroomException("查询频道列表失败");
}
return channels;
} catch (SQLException e) {
e.printStackTrace();
//throw new ChatroomException("查询频道列表失败");
} finally {
//4.断开连接
DBUtil.close(c,ps,rs);
}
return null;
}
//4.关注频道,未实现
//5.取消关注频道,未实现
}
测试ChannelDao类中的add() 增加频道模块
测试用例:
1.不输入频道名
2.输入非法频道名
3.输入合法频道名
@Test
public void add() {
ChannelDao channelDao=new ChannelDao();
Channel channel=new Channel();
channel.setChannelName("ASMR");
channelDao.add(channel);
//不设置channelID是因为此字段是自增字段,由Mysql自行增加,避免ID冲突
}
测试ChannelDao类中的selectAll()查看所有频道模块
测试用例:
1.频道列表为空查询
2.频道列表不为空查询
@Test
public void selectAll() {
ChannelDao channelDao=new ChannelDao();
System.out.println(channelDao.selectAll());
}
测试ChannelDao类中的delete()删除频道模块
测试用例:
1.不输入id
2.输入不存在的id
3.输入数组
4.输入int类型已存在的id
@Test
public void delete() {
ChannelDao channelDao=new ChannelDao();
channelDao.delete(1);
}
from selenium import webdriver
import unittest,time
driver=webdriver.Chrome()
driver.get("http://127.0.0.1:8080/java13_chatroom/")
driver.implicitly_wait(10)
driver.maximize_window()
driver.find_element_by_xpath("//*[@id='app']/nav/div[1]/div[1]/div[2]/div[2]/div").click()
time.sleep(3)
driver.find_element_by_id("input-33").send_keys("tx")
driver.find_element_by_id("input-36").send_keys("1233")
driver.find_element_by_xpath("//*[@id='app']/div[3]/div/div/div[2]/div/div[3]/div[1]/button/span").click()
#登录
divs = driver.find_elements_by_class_name("v-list-item__icon")
time.sleep(2)
divs[1].click()
time.sleep(3)
#选择频道
driver.find_element_by_class_name("v-btn__content").click()
driver.find_element_by_id("input-23").send_keys("在吗?")
driver.find_element_by_xpath("//*[@id='app']/div/main/div/div[2]/footer/div/div/div[2]/button").click()
#发送消息
driver.find_element_by_xpath("//*[@id='app']/div/header/div/button[2]/span/i").click()
#退出频道
driver.find_element_by_class_name("v-btn__content").click()
driver.find_element_by_xpath("//*[@id='app']/nav/div[1]/div[2]/div[2]").click()
#退出登录