图书馆信息管理系统(总)(中)https://developer.aliyun.com/article/1507738?spm=a2c6h.13148508.setting.25.1b484f0eOKU2gm
四、项目实现过程
4.1 基于Java环境的系统功能分析以及其代码实现
第一步:创建一个BOOK类来定义图书 public class Book { private String bookName; private String authorName; private double price; private String type; private boolean isBorrowed; public Book(String bokName, String authorName, double price, String type) { this.bookName = bokName; this.authorName = authorName; this.price = price; this.type = type; } public String getBookName() { return bookName; } public void setBookName(String bokName) { this.bookName = bokName; } public String getAuthorName() { return authorName; } public void setAuthorName(String authorName) { this.authorName = authorName; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public String getType() { return type; } public void setType(String type) { this.type = type; } public boolean isBorrowed() { return isBorrowed; } public void setBorrowed(boolean borrowed) { isBorrowed = borrowed; } @Override public String toString() { return "Book{" + "bookName='" + bookName + '\'' + ", authorName='" + authorName + '\'' + ", price=" + price + ", type='" + type + '\'' + (isBorrowed ? " 已借出" : " 未借出") + '}'; } 第二步:创建一个BookList类来定义具体有什么图书 public class BookList { private Book[] books; private int BookUseSize; public BookList() { books = new Book[5]; books[0] = new Book("三国演义", "施耐庵", 68.8, "小说"); books[1] = new Book("水浒传", "罗贯中", 56.6, "小说"); books[2] = new Book("西游记", "吴承恩", 60, "小说"); this.BookUseSize = 3; } public void setBooks(int i, Book book) { if (i >= books.length) { expansion(); } books[i] = book; } public Book getPosBooks(int i) { return books[i]; } public void setBooksUseSize(int i) { this.BookUseSize = i; } public int getBooksUseSize() { return this.BookUseSize; } public void expansion() { books = Arrays.copyOf(books, 2 * books.length); } 第三步:创建和用户相关的类(也就是使用者) 创建User也就是父类的特征 public abstract class User { protected String userName; public User(String userName) { this.userName = userName; } } 创建管理员,来管理图书书籍 public class Administrator extends User { public Administrator(String userName) { super(userName); } } 创建普通用户,继承父类Users public class GeneralUser extends User { public GeneralUser(String userName) { super(userName); } } 第四步:创建一切程序的入口,也就是我们系统的主类 import Book.BookList; import User.User; import User.Administrator; import User.GeneralUser; import java.util.Scanner; public class Main { public static User login() { System.out.println("请输入你的姓名:>"); Scanner scanner = new Scanner(System.in); String userName = scanner.nextLine(); while (true) { System.out.println("请输入你的身份:> 1,管理员 0,普通用户"); int choice = scanner.nextInt(); if (choice == 1) { return new Administrator(userName);//发生多态 } else if (choice == 0) { return new GeneralUser(userName);//发生多态 } else { System.out.println("选择错误,请重新选择:>"); } } } public static void main(String[] args) { User user = login(); } 第五步:创建菜单包实现抽象类定义的接口 public class Administrator extends User { public Administrator(String userName) { super(userName); } public int menu() { System.out.println("====hello," + super.userName + " welcome===="); System.out.println("1,查找图书"); System.out.println("2,新增图书"); System.out.println("3,删除图书"); System.out.println("4,显示图书"); System.out.println("0,退出系统"); System.out.println("请输入你的操作:>"); Scanner scanner = new Scanner(System.in); return scanner.nextInt(); } } 2、GeneralUser类(2/3) public class GeneralUser extends User { public GeneralUser(String userName) { super(userName); } public int menu() { System.out.println("====hello," + super.userName + " welcome===="); System.out.println("1,查找图书"); System.out.println("2,借阅图书"); System.out.println("3,归还图书"); System.out.println("0,退出系统"); System.out.println("请输入你的操作:>"); Scanner scanner = new Scanner(System.in); return scanner.nextInt(); } } 3、User类 public abstract class User { protected String userName; public User(String userName) { this.userName = userName; } public abstract int menu()} 最后一步:函数针对我们系统实现其六大功能 1、新增图书AddOperation类 package Operation; import Book.Book; import Book.BookList; import java.util.Scanner; public class AddOperation implements IOperation{ @Override public void work(BookList bookList) { System.out.println("==新增图书=="); addBookOperation(bookList); } public void addBookOperation(BookList bookList) { Scanner scanner = new Scanner(System.in); System.out.println("请输入书名:>"); String bookName = scanner.nextLine(); System.out.println("请输入作者名:>"); String authorName = scanner.nextLine(); System.out.println("请输入书的类型:>"); String type = scanner.nextLine(); System.out.println("请输入书的单价:>"); Double price = scanner.nextDouble(); Book book = new Book(bookName, authorName, price, type); int currentSize = bookList.getBooksUseSize(); bookList.setBooks(currentSize, book); bookList.setBooksUseSize(currentSize + 1); System.out.println("新增成功!"); } } 2、展示图书DisplayOperation类 package Operation; import Book.BookList; public class DisplayOperation implements IOperation{ @Override public void work(BookList bookList) { System.out.println("==展示图书=="); displayBooksOperation(bookList); } public void displayBooksOperation(BookList bookList) { int currentSize = bookList.getBooksUseSize(); for (int i = 0; i < currentSize; i++) { System.out.println(bookList.getPosBooks(i)); } } } 3、查找图书FindOperation类 package Operation; import Book.Book; import Book.BookList; import java.util.Scanner; public class FindOperation implements IOperation{ @Override public void work(BookList bookList) { System.out.println("==查找图书=="); Scanner scan = new Scanner(System.in); System.out.println("请输入查找的方式:> 1,按书名查找 0,按作者查找"); int find = scan.nextInt(); scan.nextLine(); String[] howToFind = new String[] {"作者名", "书名"}; System.out.println("请输入你要查找的" + howToFind[find] +":>"); String bookName = scan.nextLine(); int result = findBooksOperation(bookList, bookName, find); if (result == -1) { System.out.println("未找到该书!"); return; } System.out.println(bookList.getPosBooks(result)); } public int findBooksOperation(BookList bookList, String bookName, int mark) { int currentSize = bookList.getBooksUseSize(); for (int i = 0; i < currentSize; i++) { Book book = bookList.getPosBooks(i); if (mark == 1 && book.getBookName().equals(bookName)) { return i; } if (mark == 0 && book.getAuthorName().equals(bookName)) { return i; } } return -1; } public int findBooksOperation(BookList bookList, String bookName) { int currentSize = bookList.getBooksUseSize(); for (int i = 0; i < currentSize; i++) { Book book = bookList.getPosBooks(i); if (book.getBookName().equals(bookName)) { return i; } } return -1; } } 4、借阅图书BorrowOperation类和归还图书ReturnOperation类 package Operation; import Book.BookList; import BookBook; import java.util.Scanner; public class BorrowOperation implements IOperation{ @Override public void work(BookList bookList) { System.out.println("==借阅图书=="); borrowBookOperation(bookList); } public void borrowBookOperation(BookList bookList) { Scanner scanner = new Scanner(System.in); System.out.println("请输入要借阅的书名:>"); String borrowBookOperation = scanner.nextLine(); FindOperation findOperation = new FindOperation(); int findResult = findOperation.findBooksOperation(bookList, borrowBookOperation); if (findResult == -1) { System.out.println("没有此书信息!"); return; } Book book = bookList.getPosBooks(findResult); book.setBorrowed(true); System.out.println("已借出!"); } } import Book.Book; import Book.BookList; import java.util.Scanner; public class ReturnOperation implements IOperation { @Override public void work(BookList bookList) { System.out.println("==归还图书=="); returnBookOperation(bookList); } public void returnBookOperation(BookList bookList) { Scanner scanner = new Scanner(System.in); System.out.println("请输入要归还的书名:>"); String returnBookOperation = scanner.nextLine(); FindOperation findOperation = new FindOperation(); int findResult = findOperation.findBooksOperation(bookList, returnBookOperation); if (findResult == -1) { System.out.println("没有此书信息!"); return; } Book book = bookList.getPosBooks(findResult); book.setBorrowed(false); System.out.println("已归还!"); } } 5、删除图书DelOperation类 package Operation; import Book.BookList; import Book.Book; import java.util.Scanner; public class DelOperation implements IOperation{ @Override public void work(BookList bookList) { System.out.println("删除图书"); delBookOperation(bookList); } public void delBookOperation(BookList bookList) { Scanner scan = new Scanner(System.in); System.out.println("请输入要删除的书名:>"); String delName = scan.nextLine(); FindOperation find = new FindOperation(); int result = find.findBooksOperation(bookList, delName); if (result == -1) { System.out.println("没有此书信息!"); return; } int currentSize = bookList.getBooksUseSize(); int i = 0; for (i = result; i < currentSize - 1; i++) { Book book = bookList.getPosBooks(i + 1); bookList.setBooks(i, book); } bookList.setBooks(i,null); bookList.setBooksUseSize(currentSize - 1); System.out.println("已删除!"); } } 6、退出系统ExitOperation类 package Operation; import Book.BookList; public class ExitOperation implements IOperation{ @Override public void work(BookList bookList) { System.out.println("==退出系统=="); System.out.println("你已经退出"); System.exit(0); int currentSize = bookList.getBooksUseSize(); for (int i = 0; i < currentSize; i++) { bookList.setBooks(i, null); } } }
4.2 基于SQLSERVER环境的系统功能分析以及其数据库的搭建
图书信息表t_book
字段英文名称 | 列名 | 数据类型 | 字段约束 | 可否为空 |
Book_id | 图书编号 | varchar(15) | 主键 | 否 |
Type_id | 类别编号 | varchar(10) | 外键 | 否 |
Type_name | 类别名称 | varchar(20) | 外键 | 否 |
Book_name | 书名 | varchar(20) | 否 | |
Book_writer | 作者 | varchar(10) | 否 | |
Book_company | 出版社 | varchar(20) | 是 | |
Book_date | 出版日期 | datetime | 是 | |
Book_brief | 简介 | varchar(100) | 是 |
学生信息表t_student
字段英文名称 | 列名 | 数据类型 | 字段约束 | 可否为空 |
Stu_id | 学号 | varchar(15) | 主键 | 否 |
Stu_name | 姓名 | varchar(10) | 否 | |
Stu_pwd | 密码 | varchar(20) | 否 | |
Stu_sex | 性别 | varchar(2) | 否 | |
Stu_tel | 联系电话 | varchar(15) | 是 | |
Borrow_num | 借书数量 | number(2) | 默认为0 | 否 |
Stu_Depart | 所在院系 | varchar(10) | 否 |
管理员信息表t_admin
字段英文名称 | 列名 | 数据类型 | 字段约束 | 可否为空 |
Admin_id | 工作号 | number(5) | 主键 | 否 |
Admin_name | 姓名 | varchar(10) | 否 | |
Admin_pwd | 密码 | varchar(20) | 否 |
借阅信息表 t_borrow_student
字段英文名称 | 列名 | 数据类型 | 字段约束 | 可否为空 |
Book_id | 图书编号 | varchar(15) | 外主键 | 否 |
Stu_id | 学生学号 | varchar(15) | 外主键 | 否 |
Borrow_date | 借阅日期 | datetime | 否 | |
Return_date | 还书日期 | datetime | 否 | |
renew | 是否续借 | varchar(2) | 否 |
图书类别信息表 t_book_type
字段英文名称 | 列名 | 数据类型 | 字段约束 | 可否为空 |
Type_id | 类别编号 | varchar(10) | 外主键 | 否 |
Type_name | 类别名称 | varchar(20) | 外主键 | 否 |
SQL语句创建表
代码如下:
create table t_book_type(--图书类别信息表 t_book_type Type_id varchar(10) not null, --类别编号 Type_name varchar(20) not null, --类别名称 primary key(Type_id ,type_name) ) create table t_book(--图书信息表t_book Book_id varchar(15) not null primary key, --图书编号 Type_id varchar(10) not null, --类别编号 Type_name varchar(20) not null, --类别名称 Book_name varchar(20) not null, --书名 Book_writer varchar(10) not null, --作者 Book_company varchar(20), --出版社 Book_date datetime, --出版日期 Book_brief varchar(100), --简介 Book_price float not null, --价格 foreign key(Type_id,Type_name) references t_book_type(Type_id,Type_name) ) create table t_student(--学生信息表t_student Stu_id varchar(15) not null, --学号 Stu_name varchar(10) not null, --姓名 Stu_pwd varchar(20) not null, --密码 Stu_sex varchar(2) not null check(Stu_sex='男' or Stu_sex='女'), --性别 Stu_tel varchar(15), --联系电话 Borrow_num numeric(2,0) not null default 0 , --表示默认值为0--借书数量 Stu_Depart varchar(10) not null, --所在院系 Stu_liberty_id varchar(6) not null, --借书证号 primary key(Stu_id,Stu_liberty_id) ) create table t_admin(--管理员信息表t_admin Admin_id numeric(5,0) not null primary key, --工作号 Admin_name varchar(10) not null, --姓名 Admin_pwd varchar(20) not null --密码 ) create table t_borrow_student(--借阅信息表 t_borrow_student Book_id varchar(15) not null, --图书编号 Stu_id varchar(15) not null, --学生学号 Borrow_date datetime not null, --借阅日期 Return_date datetime not null, --还书日期 renew varchar(2) not null, --是否续借 Stu_liberty_id varchar(6) not null, --借书证号 primary key(Book_id,Stu_id), foreign key(Book_id) references t_book(Book_id), foreign key(Stu_id,Stu_liberty_id) references t_student(Stu_id,Stu_liberty_id) )
图47图书信息管理系统数据库里面创建的表
insert into t_book_type(Type_id,Type_name)--图书类别信息表 values ('T00001','计算机类'), ('T00002','中国文学'), ('T00003','外国文学'), ('T00004','数学类'), ('T00005','外国语类'), ('T00006','政治类'), ('T00007','天文类'), ('T00008','体育类'), ('T00009','自然科学类'), ('T00010','其他') insert into t_book(Book_id,Type_id,Type_name,Book_name,Book_writer,Book_company,Book_date,Book_brief,Book_price,Book_num)--图书信息表 values ('B00001','T00001','计算机类','数据库系统原理','邓丽','广东电子出版社','2018-08-05','数据库介绍。',40,100), ('B00002','T00001','计算机类','java程序设计','周绍斌','广东电子出版社','2018-07-25','java学习',45,200), ('B00003','T00002','中国文学','文化苦旅','余秋雨','作家出版社','2012-06-01','探索中国文化的历史命运',34.5,100), ('B00004','T00002','中国文学','朝花夕拾','鲁迅','长江文艺出版社','2015-12-29','饱含着浓烈的抒情气息',20.39,100), ('B00005','T00003','外国文学','人间失格','太宰治','现代出版社','2016-10-05','人间失格。',45,100), ('B00006','T00003','外国文学','老人与海','海明威','国际文化出版公司','2016-11-05','外国文学。',20.5,100), ('B00007','T00004','数学类','高等数学','杨爱珍','上海财经大学出版社','2015-10-01','大学生必备数学知识。',29,100), ('B00008','T00005','外国语类','大学英语','陆琳','人民邮电出版社','2016-06-02','大学生必备英语知识。',35.6,100), ('B00009','T00006','政治类','毛泽东思想','刘琳','机械工业出版社','2014-05-09','学习新思想',45,100), ('B00010','T00004','数学类','线性代数','李黎','高等教育出版社','2016-07-28','大学生必备线性知识。',30.5,100) insert into t_admin(Admin_id,Admin_name,Admin_pwd)--管理员信息表 values (1,'李恺','001'), (2,'李军','002'), (3,'张鸿涛','003'), (4,'文章','004'), (5,'詹文海','005'), (6,'李志勇','006'), (7,'梁宇飞','007'), (8,'周永波','008'), (9,'谢玉玉','009'), (10,'范文昊','010'), (11,'刘景页','011') insert into t_student(Stu_id,Stu_name,Stu_pwd,Stu_sex,Stu_tel,Borrow_num,Stu_Depart,Stu_liberty_id)--学生信息表 values ('S00001','张羽','S00001','男','15620354789',0,'计算机学院','R00001'), ('S00002','李飞','S00002','女','13856214521',0,'计算机学院','R00002'), ('S00003','张三','S00003','男','14235689526',0,'外国语学院','R00003'), ('S00004','刘泳景','S00004','男','14785623584',0,'机械学院','R00004'), ('S00005','曹家俊','S00005','男','15623785123',0,'商管学院','R00005'), ('S00006','余大兔','S00006','女','17856241254',0,'法学院','R00006'), ('S00007','刘小青','S00007','女','14562358971',0,'医学院','R00007'), ('S00008','徐俊瑞','S00008','男','18554235561',0,'计算机学院','R00008'), ('S00009','刘千秋','S00009','男','15478620146',0,'计算机学院','R00009'), ('S00010','孙浩楠','s00010','男','14862395209',0,'数媒学院','R00010') insert into publish(p_name,p_id)--出版社信息表 values ('现代出版社','10001'), ('作家出版社','10002'), ('长江文艺出版社','10003'), ('广东电子出版社','10004'), ('人民邮电出版社','10005'), ('高等教育出版社','10006'), ('机械工业出版社','10007'), ('国际文化出版公司','10008'), ('上海财经大学出版社','10009') insert into t_borrow_student(Book_id,Stu_id,Borrow_date,Return_date,renew,Stu_liberty_id,overdue)--借阅信息表 values ('B00001','S00005','2018-10-15','2018-11-10','否','R00005','否'), ('B00002','S00009','2021-06-02','2021-07-01','否','R00009','否'), ('B00003','S00001','2018-09-10','2018-10-05','否','R00001','否'), ('B00004','S00007','2019-10-06','2019-11-05','否','R00007','否'), ('B00005','S00010','2016-05-25','2016-06-20','否','R00010','否'), ('B00006','S00002','2017-10-09','2017-11-06','是','R00002','否'), ('B00006','S00004','2017-11-06','2017-12-06','否','R00004','否'), ('B00007','S00008','2020-09-01','2020-10-01','否','R00008','否'), ('B00010','S00003','2019-11-15','2019-12-09','否','R00003','否'), ('B00010','S00006','2018-08-06','2018-09-06','否','R00006','否')
结果如下:
出版社信息表(Publish):
管理员信息表(t_admin):
图书类别信息表(t_book_type):
借阅信息表(t_borrow_student):
学生信息表(t_student):
五、项目测试
5.1 功能测试
5.1.1用户注册
测试类型 黑盒测试
测试方法 等价类划分法
模块名称 用户注册
用例描述 该用例用于测试前端系统用户注册功能是否符合预期要求
前置条件 用户在图书馆信息管理系统主界面(首页)点击用户注册
编号 | 测试项 | 操作步骤 | 预期结果 | 实际结果 | 数据 |
Test0 | 成功完成用户注册 | 1.用户首页点击注册 2.用户输入账号 3.用户输入首密码 4.用户输入次密码 |
提示注册成功引导用户登录 | 用户成功注册并登录 | 1.用户名:wss444 2.首密码:123456 3.次密码:123456 |
Test1 | 用户注册失败 | 1.用户首页点击注册 2.用户输入用户名 3.用户输入首密码 4.用户输入次密码 |
提示注册失败并告知账号已被占用,要求重新填写账号名 | 提示注册失败并告知账号已被占用,要求重新填写账号名 | 1.用户名:Eee123 2.首密码:123456 3.次密码:123456 |
Test2 | 用户注册失败 | 1.用户首页点击注册 2.用户输入用户名 3.用户输入首密码 4.用户输入次密码 |
提示注册失败告知首密码和次密码不一致 | 提示注册失败告知首密码和次密码不一致 | 1.用户名:Rty7888 2.首密码:123455 3.次密码: 123456 |
Test3 | 用户注册失败 | 1.用户首页点击注册 2.用户输入用户名 3.用户输入首密码 4.用户输入次密码 |
提示注册失败并告知账号为空 | 提示注册失败并告知账号为空 | 1.用户名: 2.首密码:123456 3.次密码: 123456 |
Test4 | 用户注册失败 | 1.用户首页点击注册 2.用户输入用户名 3.用户输入首密码 4.用户输入次密码 |
提示注册失败并告知账号由4-8位字母、数字组成 | 提示注册失败并告知账号由字母、数字组成 | 1.用户名:0007 2.首密码:123456 3.次密码: 123456 |
Test5 | 用户注册失败 | 1.用户首页点击注册 2.用户输入用户名 3.用户输入首密码 4.用户输入次密码 |
提示注册失败并告知账号由4-8位字母、数字组成 | 提示注册失败并告知账号由4-8位字母、数字组成 | 1.用户名:Aa1 2.首密码:123456 3.次密码: 123456 |
Test6 | 用户注册失败 | 1.用户首页点击注册 2.用户输入用户名 3.用户输入首密码 4.用户输入次密码 |
提示注册失败并告知账号由4-8位字母、数字组成 | 提示注册失败并告知账号由4-8位字母、数字组成 | 1.用户名:Aaaaaaa 2.首密码:123456 3.次密码: 123456 |
Test7 | 用户注册失败 | 1.用户在首页点击注册 2.用户输入用户名 3.用户输入首密码 4.用户输入次密码 |
提示注册失败并告知账号由4-8位字母、数字组成 | 提示注册失败并告知账号由4-8位字母、数字组成 | 1.用户名:aaaa12345 2.首密码:123456 3.次密码: 123456 |
Test8 | 用户注册失败 | 1.用户在首页点击注册 2.用户输入用户名 3.用户输入首密码 4.用户输入次密码 |
提示注册失败并告知账号由4-8位字母、数字组成 | 提示注册失败并告知账号由4-8位字母、数字组成 | 1.用户名:aaaa123# 2.首密码:123456 3.次密码:123456 |
Test9 | 用户注册失败 | 1.用户在首页点击注册 2.用户输入用户名 3.用户输入首密码 4.用户输入次密码 |
提示注册失败告知密码由6-10位数字组成 | 提示注册失败告知密码由6-10位数字组成 | 1.用户名:aaa123 2.首密码:12345 3.次密码: 12345 |
Test10 | 用户注册失败 | 1.用户在首页点击注册 2.用户输入用户名 3.用户输入首密码 4.用户输入次密码 |
提示注册失败告知密码由6-10位数字组成 | 提示注册失败告知密码由6-10位数字组成 | 1.用户名:aaa123 2.首密码:123456¥ 3.次密码: 123456¥ |
Test11 | 用户注册失败 | 1.用户在首页点击注册 2.用户输入用户名 3.用户输入首密码 4.用户输入次密码 |
提示注册失败告知密码由6-10位数字组成 | 提示注册失败告知密码由6-10位数字组成 | 1.用户名:aaa123 2.首密码:12345678911 3.次密码: 12345678911 |
显示详细信息
5.1.2 用户查询书籍
测试类型 黑盒测试
测试方法 场景法
模块名称 用户查询书籍
用例描述 该用例用于测试用户查询书籍功能是否符合预期要求
前置条件 用户在前端查询书籍信息
编号 | 测试项 | 操作步骤 | 预期结果 | 实际结果 | 数据 |
Test0 | 成功查询书籍 | 1.用户输入读者借阅证 2.输入要查阅的图书名字 3.显示图书信息 |
成功显示图书信息 | 成功显示图书信息 | 1.输入读者借阅证:aaa123 2.输入查阅的图书名字:《海的老人》 |
Test1 | 查询书籍失败 | 1.用户输入读者借阅证 2.输入要查阅的图书名字 3.显示图书信息 |
显示图书信息失败并告知没有该借阅证账号 | 显示图书信息失败并告知没有该借阅证账号 | 1.输入读者借阅证:abb123 2.输入查阅的图书名字: |
Test2 | 查询书籍失败 | 1.用户输入读者借阅证 2.输入要查阅的图书名字 3.显示图书信息 |
显示图书信息失败并告知查无此书 | 显示图书信息失败并告知查无此书 | 1.输入读者借阅证:abb123 2.输入查阅的图书名字: 《hhhgjdof》 |
Test3 | 查询书籍失败 | 1.用户输入读者借阅证 2.输入要查阅的图书名字 3.显示图书信息 |
显示图书信息失败并告知查无此书但是有名字类似的书籍 | 显示图书信息失败并告知查无此书但是有名字类似的书籍 | 1.输入读者借阅证:abb123 2.输入查阅的图书名字: 《还的老人》 |
显示详细信息
5.1.3用户借阅图书
测试类型 黑盒测试
测试方法 场景法
模块名称 用户借阅书籍
用例描述 该用例用于测试用户借阅图书功能是否符合预期要求
前置条件 用户在图书馆借阅图书
编号 | 测试项 | 操作步骤 | 预期结果 | 实际结果 | 数据 |
Test0 | 成功借阅图书 | 1.输入要借阅的书名 2.点击确认 |
借阅成功 | 借阅成功 | 1.显示该借阅书籍基本信息 2.显示借阅者预借了此书 3.显示借书者借阅数量并未超过限制 |
Test1 | 借阅失败 | 1.输入要借阅的书名 2.点击确认 |
借阅失败并提示查无此书 | 借阅失败并提示查无此书 | 1.显示查无此书 |
Test2 | 借阅失败 | 1.输入要借阅的书名 2.点击确认 |
借阅失败并显示没有预借此书 | 借阅失败并显示没有预借此书 | 1.显示该借阅书籍基本信息 2.显示借阅者没有预借此书 3.显示借书者借阅数量并未超过限制 |
Test3 | 借阅失败 | 1.输入要借阅的书名 2.点击确认 |
借阅失败并显示借阅数量已超过限制 | 借阅失败并显示借阅数量已超过限制 | 1.显示该借阅书籍基本信息 2.显示借阅者预借了此书 3.显示借书者借阅数量超过限制 |
显示详细信息
5.1.4管理员对管理员信息表进行查询
测试类型 黑盒测试
测试方法 场景法
模块名称 管理员信息表查询
用例描述 该用例用于系统后端查询管理员信息表模块是否满足用户需求
前置条件 管理员登录并对管理员信息表进行查询
编号 | 测试项 | 操作步骤 | 预期结果 | 实际结果 | 数据 |
Test0 | 成功查询 | 1.管理员登录后端系统 2.管理员选择管理员信息 3.管理员搜索管理员姓名 |
查看对应管理员信息 | 跳转到对应管理员信息 | 1.Admin_id:1 2.Admin_name:李恺 3.Admin_pwd:001 |
Test1 | 成功查询 | 1.管理员登录后端系统 2.管理员选择管理员信息 3.管理员搜索管理员姓名 |
查看对应管理员信息 | 跳转到对应管理员信息 | 1.Admin_id:2 2.Admin_name:李军 3.Admin_pwd:002 |
Test2 | 成功查询 | 1.管理员登录后端系统 2.管理员选择管理员信息 3.管理员搜索管理员姓名 |
查看对应管理员信息 | 跳转到对应管理员信息 | 1.Admin_id:3 2.Admin_name:张鸿涛 3.Admin_pwd:003 |
Test3 | 成功查询 | 1.管理员登录后端系统 2.管理员选择管理员信息 3.管理员搜索管理员姓名 |
查看对应管理员信息 | 跳转到对应管理员信息 | 1.Admin_id:4 2.Admin_name:文章 3.Admin_pwd:004 |
Test4 | 成功查询 | 1.管理员登录后端系统 2.管理员选择管理员信息 3.管理员搜索管理员姓名 |
查看对应管理员信息 | 跳转到对应管理员信息 | 1.Admin_id:5 2.Admin_name:詹文海 3.Admin_pwd:005 |
Test5 | 成功查询 | 1.管理员登录后端系统 2.管理员选择管理员信息 3.管理员搜索管理员姓名 |
查看对应管理员信息 | 跳转到对应管理员信息 | 1.Admin_id:6 2.Admin_name:李志勇 3.Admin_pwd:006 |
Test6 | 成功查询 | 1.管理员登录后端系统 2.管理员选择管理员信息 3.管理员搜索管理员姓名 |
查看对应管理员信息 | 跳转到对应管理员信息 | 1.Admin_id:7 2.Admin_name:梁宇飞 3.Admin_pwd:007 |
Test7 | 成功查询 | 1.管理员登录后端系统 2.管理员选择管理员信息 3.管理员搜索管理员姓名 |
查看对应管理员信息 | 跳转到对应管理员信息 | 1.Admin_id:8 2.Admin_name:周永波 3.Admin_pwd:008 |
Test8 | 成功查询 | 1.管理员登录后端系统 2.管理员选择管理员信息 3.管理员搜索管理员姓名 |
查看对应管理员信息 | 跳转到对应管理员信息 | 1.Admin_id:9 2.Admin_name:谢玉玉 3.Admin_pwd:009 |
显示详细信息
5.1.5管理员对书籍信息进行管理(增删查改)
测试类型 黑盒测试
测试方法 场景法
模块名称 书籍信息管理(增删查改)
用例描述 该用例用于系统后端书籍信息管理是否满足用户需求
前置条件 管理员登录并对书籍信息进行管理
编号 | 测试项 | 操作步骤 | 预期结果 | 实际结果 | 数据 |
Test0 | 成功查询 | 1.管理员登录后端系统 2.管理员选择书籍信息 3.管理员点击书籍查询 4.管理员搜索书籍《朝花夕拾》 |
查看对应书籍信息 | 跳转到对应书籍信息 | 1.Book_id:B00004 2.Type_id:T00004 3.Type_name:中国文学 4.Book_name:朝花夕拾 5.Book_writer:鲁迅 6.Book_company:长江文艺出版社 7.Book_date:2015-12-29 8.Book_brief:饱含浓烈的抒情气息 9.Book_price:20.39 10.Book_num:100 |
Test1 | 成功增加 | 1.管理员登录后端系统 2.管理员选择书籍信息 3.管理员点击增加书籍 4.管理员输入书籍信息 |
成功增加该书籍 | 成功增加该书籍 | 1.Book_id:B00011 2.Type_id:T00011 3.Type_name:外国文学 4.Book_name:格林童话 5.Book_writer:无 6.Book_company:长江文艺出版社 7.Book_date:2017-7-29 8.Book_brief:适合儿童阅读的好书 9.Book_price:55 10.Book_num:100 |
Test2 | 成功修改 | 1.管理员登录后端系统 2.管理员选择书籍信息 3.管理员点击修改书籍信息 4.管理员输入书籍信息 |
修改成功 | 修改成功 | 1.Book_id:B00011 2.Type_id:T00015 3.Type_name:外国文学 4.Book_name:格林童话 5.Book_writer:无 6.Book_company:长江文艺出版社 7.Book_date:2017-7-29 8.Book_brief:适合儿童阅读的好书 9.Book_price:55 10.Book_num:100 |
Test3 | 成功删除 | 1.管理员登录后端系统 2.管理员选择书籍信息 3.管理员点击删除书籍信息 4.管理员点击确认删除 |
删除成功 | 删除成功 | 您已成功删除《格林童话》 |
Test4 | 查询失败 | 1.管理员登录后端系统 2.管理员选择书籍信息 3.管理员点击书籍查询 4.管理员搜索书籍《老人与海》 |
没有这本书! | 没有这本书! | 查无此书 |
显示详细信息
5.2 非功能测试
5.3 Bug分析
5.3.1 bug汇总
缺陷编号 | 缺陷等级 | 缺陷模块 | 缺陷概要 | 缺陷描述 | 状态 |
Bug01 | Urgent | 借阅图书模块(边界判定) | 图书已无库存,但系统仍显示借出 | 1.用户登录 2.用户输入要借阅的图书 3.用户点击借阅 4.图书显示无库存但仍借出成功 |
Fixed |
Bug02 | Urgent | 预借图书(数据丢失) | 跳转至预借图书页面发现用户初始保存的数据丢失且需要重新登录 | 1.用户搜索预借图 2.用户点击确认预借图书 3.跳转预借成功界面时数据丢失,要求用户重新登录 |
Fixed |
Bug03 | Very High | 管理用户信息(内容遗漏) | 管理员查看用户信息时,用户信息缺少,无法刷新出来 | 1管理员登录系 2.管理员选择用户信息管理 3.管理员点击查看信息 4.用户信息缺少,部分无法刷新 |
Open |
Bug04 | Very High | 归还图书模块<接口错误> | 用户因借书超时进入支付界面,手机支付后界面无响应 | 1.用户登录选择归还图书 2.用户归还图书后发现逾期须缴费 3.用户完成支付后界面无响应 |
New |
Bug05 | High | 管理图书信息模块(信息死锁) | 图书介绍图片更改在后端提示已经更改成功但是前台界面同步更新后端数据图片仍然为更改前的图片 | 1.管理员登录后端选择管理图书信息 2.找到图书图片更改并点击选取图片按钮 3.管理员上传图片并刷新前界面此时图片未曾更改 |
Closed |
Bug06 | Urgent | 续借图书模块(进度提示) | 续借成功但进度条一直处于初始态 | 1.用户登录后选择续借图书 2.用户点击需要续借的图书 3.系统显示续借成功但进度条一直处于初始态 |
New |
Bug07 | High | 管理图书信息(进度提示) | 选择上传图书信息的时候寻址条的进度一直处于初始态 | 1.管理员登录后端选择管理图书信息 2.找到相应图书信息后选择修改 3.修改完成点击确认后寻址条一直处于初始态 |
Open |
Bug08 | Very High | 管理图书信息(保存失败) | 可以直接上传图片不用进行等待但是前方的图片未保存就已被剔除 | 1.管理员登录后端选择更改图书信息 2.找到图书图片更改并点击选取图片按钮进行更改 3.更改的图片在前台成功的显示但是原来的图片损毁 |
Fixed |
Bug09 | Middle | 管理图书信息(信息优化) | 提示内容:正在上传的图片是已经传过了的,不可以再上传了。内容提示过于口语化,不符合提示严谨的规范 | 1.管理员登录后端选择更改图书信息 2.找到图书图片更改并点击选取图片按钮 3.管理员上传图片,系统提示:该图片已重复上传 |
Open |
Bug10 | Low | 管理用户信息(改进建议) | 当管理员长期处于等待的白页时,可以利用网络抓包工具分析服务器的网络请求给出中断指示 | 1.管理员登录后端选择管理用户信息 2.修改对应用户信息后点击确认 3.确认后等待时间过长,甚至出现白页。 |
Closed |
Bug11 | Urgent | 用户注册(数据堆栈) | 已经注册过的账号再次注册,系统提示注册成功 | 1.用户使用相同用户名注册账号并且使用相同的密码 2.用户注册成功,登录后原来的所有账号信息都恢复成出厂设置,信息被反向篡改 |
Fiexd |
Bug12 | Low | 用户注册(改进建议) | 用户输入账号名或者密码时,可以提示大小锁按键切换已经打开,优化用户注册难度和体验 | 1.用户首页点击注册 2.用户输入用户名无提示 3.用户输入首密码无提示 4.用户输入次密码 |
Open |
Bug13 | Low | 用户注册(改进建议) | 用户将此密码输入完毕后,系统首页应该给出两次密码的校验结果,两次的密码一致打“√” | 1.用户首页点击注册 2.用户输入用户名 3.用户输入首密 “123456” 4.用户输入次密"123456" 5.无密码校验直接点击注册 |
New |
Bug14 | Urgent | 用户注册(功能错误) | 用户输入空白这个字符在用户名上注入,输入密码后系统提示其注册成功 | 1.用户首页点击注册 2.用户输入用户名为空白 3.用户输入首密码 4.用户输入次密码 5.账号注册成功并进行登录 |
Fiexd |
Bug15 | High | 用户注册(内容乱码) | 用户在注册时采用非法字符如¥¥¥¥作为密码/次密码,网页无法正常的显示非法字符的格式 | 1.用户首页点击注册 2.用户输入用户名 3.用户输入首密 “¥¥¥¥” 4.用户输入次密 “¥¥¥¥” 5.密码无法显示此内容 |
New |
Bug16 | Low | 预借图书模块(程序冻结) | 搜索图书时偶尔会卡死 | 1用户登录后选择预借图书 2.用户搜索所需图书 3.点击搜索后系统无响应、卡顿 |
Closed |
Bug17 | Urgent | 借阅图书模块(数据流失) | 用户已预借图书,但点击借阅该图书时却显示没有预借 | 1.用户登录后选择借阅图书 2.用户点击借阅图书后系统显示该图书没有预借 |
Fiexd |
显示详细信息
5.3.2 缺陷分析
5.3.2.1 从严重程度分析
缺陷等级 | 1-Urgent(致命错误) | 2-Very High(严重错误) | 3-High(一般错误) | 4-Middle(轻微错误) | 5-Low(改进建议) | 总数 |
bug数 | 6 | 3 | 3 | 1 | 4 | 17 |
5.3.2.2从模块来分析
模块 | 用户注册 | 借阅图书模块 | 预借图书模块 | 管理用户信息 | 归还图书模块 | 管理图书信息 | 续借图书模块 | 总数 |
bug数 | 5 | 2 | 3 | 2 | 1 | 3 | 1 | 17 |
5.3.2.3从Bug状态分析
Bug状态 | New(新建) | Open(打开) | Fixed(已修复) | Closed(已关闭) | 总数 |
bug数 | 4 | 4 | 6 | 3 1 | 7 |
六、 项目总结与体会
本次的项目做的是一个图书信息管理系统,简易上来称,其是一个计算机管理系统,也就是将传统手工的管理方式转变为智能化、标准化、规范化的管理管理模式,对图书馆中所有的图书、文献资料、音像资料、报刊、期刊等各种类型的资料实现采编、收集图书信息、检索、归档、流通以及一系列相关工作的计算机化、信息化管理。
结合软件工程课程的学习的知识,通过对目前市场上已有的图书信息管理系统进行分析研究,对目前各大图书馆整理书籍管理工作等进行一定的背景研究与工作剖析,最终根据其需求,为了使读者能够更加快速的借书、还书、预借书本、查询图书的信息等业务,图书馆管理人员能更快的对读者信息、图书信息进行管理,避免出现不必要的图书管理人员和读者的摩擦,因此急需要有一套能够有效快速处理图书馆日常业务的图书馆管理系统,使图书馆的管理工作规范化、系统化、程序化,提高图书馆图书信息、读者信息处理的精确性和有效性,减轻图书馆工作人员的工作负担,我们选择了做一个图书信息管理系统这一项目。
要学习软件工程,学会如何系统的思考,以及养成良好的编码习惯,想学好软件工程,就必须知道软件工程的目标、过程和原则:软件工程目标:生产具有正确性、可用性以及开销合宜的产品。正确性指软件产品达到预期功能的程度。可用性指软件基本结构,实现及文档为用户可用的程度。开销合宜是指软件开发、运行的整个开销满足用户要求的程度。这些目标的实现不论在理论上还是在实践中均存在很多待解决的问题,它们形成了对过程,过程模型及工程方法选取的约束。
软件工程过程:生产一个最终能满足需求且达到工程目标的软件产品所需要的步骤。软件工程过程主要包括开发过程、运作过程、维护过程。它们覆盖了需求、设计、实现、确认以及维护等活动。需求活动包括问题分析和需求分析。问题分析获取需求定义,又称软件需求规约。需求分析生成功能规约。设计活动一般包括概要设计和详细设计。概要设计建立整个软件系统结构,包括子系统、模块以及相关层次的说明,每一模块的接口定义。详细设计产生程序员可用的模块说明,包括每一模块中数据结构说明及加工描述。实现活动把设计结果转换为可执行的程序代码。确认活动贯穿干整个开发过程,实现完成后的确认,保证最终产品满足用户的`要求。维护活动包括使用过程中的扩充,修改与完善。伴随以上过程,还有管理过程、支持过程、培训过程等。软件工程的原则是指围绕工程设计、工程支持以及工程管理在软件开发过程中必须遵循的原则。我们学习了详细设计的方法,其原则是过程描述是否易干理解复审和维护,进而过程描述能够自然地转换成代码,并保证详细设计与代码完全一致。包括程序流程图、N-S图、PAD图、HIPO图。
程序流程图:程序流程图又称之为程序框图,它是软件开发者最熟悉的一种算法表达工具。它独立于任何一种程序设计语言,比较直观和清晰地描述过程的控制流程,易于学习掌握。在流程图中只能使用下述的五种基本控制结构:顺序型;选择型;while型循环;until型循环;多情况型选择。
N-S图:一种符合结构化程序设计原则的图形描述工具,称为盒图,又称为N-S图。在N-S图中,为了表示五种基本控制结构,规定了五种图形构件。顺序型;选择型;WHILE重复型;UNTIL重复型:多分支选择型。
PAD图:它是用结构化程序设计思想表现程序逻辑结构的图形工具。PAD也设置了五种基本控制结构的图示,并允许递归使用。
HIPO图:HIPO图是由一组IPO图加一张HC图组成。它是美国IBM公司在软件设计中使用的主要表达工具。
HC图既是层次图,用于表示软件的分层结构。HC图中的每一个模块,均可用一张IPO图来描述。IPO图由输入、处理和输出三个框组成,需要时还可以增加一个数据文件框,这种图形的优点是能够直观地显示输入一处理-输出三者之间的联系。
还有测试方法:按照测试过程是否在实际应用环境中来分,有静态分析与动态测试。测试方法有分析方法(包括静态分析法与白盒法)与非分析方法(称黑盒法)。
静态分析技术:不执行被测软件,可对需求分析说明书、软件设计说明书、源程序做结构检查、流程分析、符号执行来找出软件错误。
动态测试技术:当把程序作为一个函数,输入的全体称为函数的定义域,输出的全体称为函数的值域,函数则描述了输入的定义域与输出值域的关系。
通过回顾完软件工程这门课程所学习的知识点后,可以初步定个项目大纲:项目需求和计划,项目设计,设备要求,项目实现过程,项目测试结果,项目总结和体会。项目需求和计划主要是对图书信息管理系统进行一个市场调查,在线上百度百科与线下踩点各个图书馆中了解目前阶段图书信息管理的工作与现时代下科技与发展对快速整理信息的需求。并针对此需求制定相关项目目标与计划。这次项目是要开发一个图书馆信息管理系统,我们想通过这个系统处理常见的图书馆业务。这个系统主要目标是想有客户端(借阅者使用)和管理端(图书馆管理员和系统管理员使用)。在这个系统设计上,借阅者可以对于图书馆里面存在的图书进行借阅图书、归还图书、预借图书等基本操作;可以对于图书馆里面的图书的数量、位置、是否被借阅等信息进行查询;图书管理员能够处理借阅者的借阅图书、归还图书、预借图书等基本功能、能够对图书信息、读者信息进行查看、增加、修改、删除功能。同时图书管理员可以查看操作日志,图书的预借信息情况;系统管理员拥有图书管理员的所有功能,而且系统管理员可以对图书管理员进行管理,可以分配图书管理员账号,系统的用户可以更改密码。
项目目标定制完成以后,就开始分工合作进行每周任务的计划制定了。在第一周,我们了解图书馆信息管理系统的用户需求以及用户特点,并初步分析图书信息管理系统的可行性;在第2周,我们进行图书馆信息管理系统的功能规格分析、性能需求分析、系统分析、页面设计、模块设计、数据库设计;在第3周,我们使用java对于图书馆信息管理系统的模块进行实现,同时使用SQL工具进行图书馆信息管理系统的数据库进行实现;在第4周,我们使用黑盒测试,白盒测试等测试方法对设计实现的所需功能进行功能测试,对系统进行安全测试,提高系统对非法入侵防范能力,根据系统的整体框架和实现形式,完成软件工程实践报告。在完成报告后,我们团队一起讨论并修复已知的Bug,对现有的问题进行归档,发布公测版本,最后,我们对整个项目做收尾工作——我们收集用户反馈信息,优化版本的呈现效果,立志做一个优秀的项目报告。
软件工程对干初学者来说,知识基础较薄弱,对一些应用操作,概念、工具方法等理解起来较大困难,要能从整体概念上较好地理解和把握、学好软件工程,不是仅仅把几本专业书籍细致地看几遍,然后上机练习几次就可以成功,学习过程中要注意多看多练要注意结合实际,更要多思考,面对错误不要一范就问,要尝试自己去解决。但是还要注意什么都学,肯定是什么都学不透的,要集中精力打攻坚战,学习软件工程首先要明白自己的学习目标究竟是什么,根据自己的实际工作出发有针直对性的在相应的学习方向上进行提高,制定出详细的学习规划。还要注意与其他科目的相辅相成,就像我们在学习面向对象分析的时候要结合大一学习的面向对象及其方法学这一专业科目进行研究拓展;在学习语言时,要看看与C语言的联系,多思多想,把从各个科目学到的知识通汇贯通。
我们可以发现开发软件并非是一些代码这么简单,在开发软件的过程中,编写代码的工作量其实只占不到所有工程量的30%,而后期的管理和维护更是占了60%到80%之多。一个完整的项目规划须包括,软件的定义,可行性分析报告,项目开发计划,软件需求说明书,概要设计说明书,详细设计说明书,用户操作手册,测试计划,测试分析报告,开发进度报告,项目开发总结报告,软件维护手册,软件问题报告,软件修改报告,等多个文档,每个文档都要上级验收审查,而文档数量众多,要做好这点真的不是很容易,而恰恰写好文档正能保证完成软件工程其中一个目的的关键,既研究如何用最小的开销做出生存期较长的软件,再加上各个阶段都要进行周密的策划、详细的分工部署和人员安排,且各阶段要据具体情况不断的反复才能达成,所以代码只是开发软件这个浩大的工程的一个小小的过程。而编码的学习中,我更了解到形成自己独特的规范的编码风格是非常重要的事。
在写程序的过程中,要逐步的在规范的基础上形成属于自己的风格,即方便自己的修改,也方便日后他人的阅读。在学习中,我们还要注意比较三种方法的优缺点,例如:传统方法虽然使软件摆脱了混乱和无序,但其在适应需求变化的方面不够灵活,而且传统方法要么面向行为,要么面向数据,缺乏两者的有机结合。而面向对象方法的程序设计和问题求解更符合人们日常自然的思维习惯,适合大型、复杂及交互性比较强的系统。形式化方法则是一中基于形式化数学变换的软件开发方法,它可将系统的规格说明转换为可执行的程序。在今后的学习中要注意多读书、多思考、多练习、多讨论,不断熟悉书本的基础,并以此为基础将其扩散开来,应用于今后的实践。