既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
引入前端后,MVC模型:视图,模型,控制器
2.service处理业务相关
一个求职者和应聘者登陆和注册的业务接口
package com.qianbaidu.recruit.service;
import com.qianbaidu.recruit.entity.Boss;
import com.qianbaidu.recruit.entity.Emp;
/\*\*
\* 用户登陆的服务接口
\*/
public interface ILoginService {
boolean login(String role);
boolean sign(String role);
// 返回登陆后的id,默认的id为-1,或者null
// 0老板,1应聘者;-1,未登录成功,登陆成功返回id
String[] execute();
}
3.和UI层以及dao层进行交互
UI层界面—控制台,单例模式
1.创建单例的方法
2.页面的实现
用枚举的方式实现单例
package com.qianbaidu.recruit.ui;
import java.util.List;
import java.util.Scanner;
import java.util.Set;
public enum ApplicantMenuUI {
APPLY\_UI;
private Scanner sc;
private ApplicantMenuUI(){
sc = new Scanner(System.in);
}
// 主界面 公司查询,信息修改,职位查询,企业打分
public String appExecuteUI(){
System.out.println("------------------欢迎您进入 众里寻他 招聘信息网站的 应聘者主界面------------------------");
System.out.println("1.进行个人信息修改");
System.out.println("2.进行公司的查询");
System.out.println("3.进行职位的查询");
System.out.println("4.查看个人申请记录");
System.out.println("5.对企业进行评分");
System.out.println("0.返回上一级界面");
return sc.nextLine();
}
}
Exception层----异常的处理
(1)自定义异常—用户登陆异常
package com.qianbaidu.recruit.exception;
/\*\*
\* 402异常,用户登陆异常
\*/
public class LoginIllegalException extends RuntimeException{
public LoginIllegalException(String message) {
super(message);
}
}
(2)使用异常类进行登陆验证
private Emp loginEmp(){
// 用户名错误
String[] loginInput = LoginMenu.loginUI("1");//(企业0,求职者1)
if (dao.findEmpByLoginName(loginInput[0])==null){
throw new LoginNameNotFoundException("404异常,用户名"+loginInput[1]+"不存在,请注册");
}
Emp loginEmpLoginNameTrue = dao.findEmpByLoginName(loginInput[0]);
// 用户名/密码错误
if (dao.findEmpLoginNameAndPassword(loginInput[0],loginInput[1])==null){
throw new LoginIllegalException("405异常,用户名|密码错误,请重新输入+" + loginEmpLoginNameTrue.getUsername());
}
Emp loginEmp = dao.findEmpLoginNameAndPassword(loginInput[0],loginInput[1]);
Logger.getLogger(this.getClass()).info("应聘者用户 "+loginEmp.getUsername()+" 登陆");
return loginEmp;
}
Test测试层----dao和service可测
1.dao的测试
Dao层的测试,用junit4
package com.tianju.older.test;
import com.tianju.older.dao.IOlderDao;
import com.tianju.older.dao.impl.OlderDaoImpl;
import com.tianju.older.entity.Older;
import org.junit.Test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
/\*\*
\* dao的测试类
\*/
public class OlderDaoImplTest {
private IOlderDao dao = new OlderDaoImpl();
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd");
@Test
public void save() throws ParseException {
dao.save(new Older("1", "小王", 28, sdf.parse("2023-04-07")));
dao.save(new Older("2", "小张", 26, sdf.parse("2023-05-07")));
dao.save(new Older("3", "小李", 24, sdf.parse("2021-06-07")));
dao.save(new Older("3", "小鹏", 24, sdf.parse("2022-04-10")));
System.out.println(dao.findAll());
}
@Test
public void loadFromFile() {
System.out.println(dao.loadFromFile());
System.out.println(dao.findAll());
}
@Test
public void delete() {
dao.loadFromFile();
System.out.println(dao.findAll());
// 删除
dao.delete(new Older("2",null,null,null));
// 删除是否保存成功
System.out.println(dao.loadFromFile());
}
}
2.service结合UI测试
如果涉及到控制台的输入,则不能用junit
package com.qianbaidu.recruit.test;
import com.qianbaidu.recruit.dao.IApplicantDao;
import com.qianbaidu.recruit.dao.impl.ApplicantDaoImpl;
import com.qianbaidu.recruit.service.IApplicantService;
import com.qianbaidu.recruit.service.impl.ApplicantServiceImpl;
public class ApplyMainTest {
public static void main(String[] args) {
IApplicantService ias = new ApplicantServiceImpl();
while (true){
ias.execute(1);
}
}
}
resource层-----配置文件,数据文件
可以参考下面博客:
在本控制台项目中,resources文件夹包括以下文件
- 户名密码存储的文件,login.properties文件;
- log4j日志记录文档,log.log文件;
- 保存数据信息的文件,older.dat文件;
项目的日志—log4j
日志是文件,记录一些信息。记录重要的,登录信息,操作,异常信息。
1.日志的级别
DEBUG: 项目开发人员的测试
INFO: 一般信息(开发人员,其他)
WARN: 警告(开发人员警告使用者)
ERROR: 系统比较严重问题
FATAL: 非常严重的问题
控制的日志可见性
2.日志的配置和使用
其中的log4j配置文件目录和内容如下:
配置文件内容:
log4j.rootLogger=DEBUG,Console,F
#显示在控制台
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=[%p],%d{yyyy-MM-dd HH:mm:ss},[%t],%rms,[%m]%n
#在文件输出
log4j.appender.F=org.apache.log4j.RollingFileAppender
log4j.appender.F.File=d:\\log.log
log4j.appender.F.layout=org.apache.log4j.PatternLayout
log4j.appender.F.layout.ConversionPattern=[%p],%d{yyyy-MM-dd HH:mm:ss},[%t],%rms,[%m]%n
util层—工具,DbUtil,常量
1.枚举的使用
枚举类型作用
替代常量的。编码规范: 魔鬼常量
if(choice == 1)
switch(a){
case 1:
break;
}
枚举的定义代码:
package com.tianju.older.util;
/\*\*
\* 业务的选择
\* 登陆后选择,1.录入老人信息;2.修改老人信息;3.删除老人信息;4.查询老人信息;0.返回登陆界面
\*/
public enum Choice {
ADD\_MES,UPDATE\_MES,DELETE\_MES,QUERY\_ALL,BACK\_LOGIN;
/\*\*
\* 根据客户输入的数字转换成枚举类型
\* @param ch 输入的数字
\* @return 转换成的枚举类型
\*/
public static Choice get(String ch){
if (ch.equals("1")){
return ADD\_MES;
}else if (ch.equals("2")){
return UPDATE\_MES;
} else if (ch.equals("3")){
return DELETE\_MES;
} else if (ch.equals("4")){
return QUERY\_ALL;
}else {
return BACK\_LOGIN;
}
}
}
使用枚举类型代替魔鬼常量:
比如在页面里让用户在控制台输入,0~4进行操作选择
public static String welcome(){
System.out.println("-------------------欢迎进入老人信息管理系统-------------------");
// 登陆后选择,1.录入老人信息;2.修改老人信息;3.删除老人信息;4.查询老人信息;0.返回登陆界面
System.out.println("1.录入老人信息");
System.out.println("2.修改老人信息");
System.out.println("3.删除老人信息");
System.out.println("4.查询老人信息");
System.out.println("0.返回登陆界面");
System.out.println("-----------------------------------------");
System.out.print("请输入选择:");
// 正则表达式判断
String in = sc.nextLine();
String regex = "[0-4]{1}";
if (!in.matches(regex)){
System.out.println("输入错误,请输入0-4之间的数字");
}
return in;
}
然后在这里用枚举代替魔鬼常量,让代码可读性增强;
private void welcome(){
boolean isContinue = true;
while (isContinue) {
String ch = OlderMenu.welcome();
Choice c = Choice.get(ch);
switch (c){
case ADD\_MES:
addOlder();
break;
case UPDATE\_MES:
updateOlder();
break;
case DELETE\_MES:
deleteOlder();
break;
case QUERY\_ALL:
findAll();
break;
case BACK\_LOGIN:
isContinue = false;
System.out.println("------------再见,欢迎再次登陆------------");
break;
}
}
}
2.常量的定义
比如下面,用数字0~3来表示公司规模为1-20人,20-100人,100-500人,以及大于500人这几种公司规模
package com.qianbaidu.recruit.util;
import com.qianbaidu.recruit.exception.InputIllegalException;
public class Constance {
public final static String COMPANY\_LESS20 = "1~20人";
public final static String COMPANY\_LESS100 = "20~100人";
public final static String COMPANY\_LESS500 = "100~500人";
public final static String COMPANY\_MORE500 = "大于500人";
public static String showCompanySize(int size){
if (size==0){
return COMPANY\_LESS20;
}else if(size==1){
return COMPANY\_LESS100;
}else if (size==2){
return COMPANY\_LESS500;
}else if (size==3){
return COMPANY\_MORE500;
}
return null;
}
}
在公司信息的实体类的toString方法中调用showCompanySize()方法把数字转成常量对应的中文;
@Override
public String toString() {
return "\nCompany{" +
"id=" + id +
", name='" + name + '\'' +
", size=" + Constance.showCompanySize(size) +
", address='" + address + '\'' +
", type='" + type + '\'' +
", web='" + web + '\'' +
", phone='" + phone + '\'' +
", person='" + person + '\'' +
", desc='" + desc + '\'' +
", rate=" + rate +
", rates=" + rates +
'}';
}
3.DbUtil
参考下面文章:
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
", rate=" + rate +
", rates=" + rates +
'}';
}
### 3.DbUtil
参考下面文章:
[java连接SQL数据库 & 单例封装数据库]( )
[外链图片转存中...(img-TyfokVLZ-1715195201830)]
[外链图片转存中...(img-jYiy5KWC-1715195201831)]
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**