文章目录
一:Junit单元测试
测试分类:
(1)黑盒测试:
软件的黑盒测试意味着测试要在软件的接口处进行。这种方法是把测试对象看做一个黑盒子,测试人员完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书,检查程序的功能是否符合它的功能说明。因此黑盒测试又叫功能测试。
(2)白盒测试:—》Junit属于白盒测试。
软件的白盒测试是对软件的过程性细节做细致的检查。这种方法是把测试对象看做一个打开的盒子,它允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序的所有逻辑路径进行测试,通过在不同点检查程序状态,确定实际状态是否与预期的状态一致。因此白盒测试又称为结构测试。
Junit的使用
1.一般测试和业务做一个分离,分离为不同的包
2.测试类的名字:****Test —>见名知意
3.测试方法的定义–》这个方法可以独立运行,不依托于main方法
4.测试方法定义完以后,不能直接就独立运行了,必须要在方法前加入一个注解: @Test
5.导入Junit的依赖的环境
代码可能程序上没异常但逻辑上有问题,判定结果依旧为绿色但不代表测试通过所以我们要加入断言: Assert.assertEquals()
第一个参数预测结果,第二个参数实际结果
测试类代码
public class Calclatortest {
Calculator cal=new Calculator();
@Test
public void Testadd(){
int result=cal.add(1,4);
//加入断言:预测一下结果,判断一下我预测的结果和 实际的结果是否一致:
Assert.assertEquals(5,result);
}
@Test
public void Testsub(){
int ans=cal.sub(5,1);
Assert.assertEquals(4,ans);
}
}
@Before_@After
@Before:
某一个方法中,加入了@Before注解以后,那么这个方法中的功能会在测试方法执行前先执行
一般会在@Beforer修饰的那个方法中加入一些申请资源的代码:申请数据库资源,申请IO资源,申请网络资源
@After:
某一个方法中,加入了@After注解以后,那么这个方法中的功能会在测试方法执行后先执行
一般会在@After修饰的那个方法中加入释放资源的代码:释放数据库资源,释放IO资源,释放网络资源
用法
@Before
public void init(){
System.out.println("开始测试");
}
@After
public void close(){
System.out.println("结束测试");
}
二:注解
什么是注解
1.在编译,类加载,运行时被读取,并执行相应的处理。通过使用注解,程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。
2.一定程度上可以说 :框架=注解+反射+设计模式
文档相关的注解
@param @return和@exception这三个标记都是只用于方法的。
@param的格式要求: @param 形参名 形参类型 形参说明
@return的格式要求: @return 返回值类型返回值说明,如果方法的返回值类型是void就不能写
@exception的格式要求: @exception 异常类型异常说明
@param和@exception可以并列多个
IDEA中的javadoc使用:
在画圈处输入上述文字可以防止乱码
JDK内置的3个注解
1.@Override:限定重写父类方法,该注解只能用于方法
作用:限定重写的方法,只要重写方法有问题,就有错误提示。
2.@Deprecated:用于表示所修饰的元素(类,方法,构造器,属性等)已过时。通常是因为所修饰的结构危险或存在更好的选择
在方法前加入@Deprecated,这个方法就会变成一个过时方法
3.@SuppressWarnings:抑制编译器警告
作用:若编译器警告这一代码,可以加入@SuppressWarnings使其不触发警告
自定义注解
1.创建java注解
@interface,跟接口没有一点关系
2.注解的内部: 以@SuppressWarnings为例,发现内部:
实际上:
value()是属性,不是方法
String[]是无参数方法(成员变量)的类型
无参数方法的类型:基本数据类型(八种),String,枚举,注解类型,还可以是以上类型对应的数组
参数叫做:配置参数
3.使用注解
如果定义了配置参数那么使用时必须给配置参数赋值
如果在定义配置参数时已经给其赋值了那么使用的时候无需传值
赋值操作:
内部没有定义配置参数的注解可以叫做标记
内部定义了配置参数的注解叫做元数据
元注解
元注解是用于修饰其它注解的注解
@Retention
作用:指定 修饰的那个注解的生命周期
@Rentention包含一个RetentionPolicy枚举类型的成员变量,使用@Rentention时必须为该value成员变量指定值:
(1)RetentionPolicy.SOURCE:在源文件中有效
(2)RetentionPolicy.CLASS:在class文件中有效,保留在.class文件中,但是当运行Java程序时,他就不会继续加载了,不会保留在内存中,JVM不会保留注解
(3)RetentionPolicy.CLASS:在class文件中有效(即class保留),保留在.class文件中,但是当运行Java程序时,他就不会继续加载了,不会保留在内存中,JVM不会保留注解
如果注解没有加Retention元注解,那么相当于默认的注解是.CLASS的状态
@Target
作用:被修饰的注解能用于修饰哪些程序元素
@Target也包含一个名为value的成员变量
给配置参数赋值:
1.TYPE,代表可以修饰类
2.METHOD,代表可以修饰方法
3.更多的可以去@Target的源码里面找
annotation
@Target({TYPE, METHOD})
public @interface annotation {
}
我们给配置参数复制了TYPE和METHOD使annotation注解只可以修饰类和方法,但属性和构造器不可修饰
注意: 记得导包
@Repeatable
作用:被该元注解修饰的注解 可以重复的修饰同一个位置
@Documented(用的很少)
作用:被该元注解修饰的注解类将被javadoc工具提取成文档。默认情况下,javadoc不包括注解
@Inherited(用的极少)
作用:如果某个类使用了被 @Inherited修饰的注解,则其子类将自动具有该注解
三:枚举
enum关键字定义枚举类
public enum Season {
//必须将对象放在最开始的位置
SPRING("春天","春暖花开"),
SUMMER("夏天","烈日炎炎"),
AUTUMN("秋天","硕果累累"),
WINTER("冬天","冰天雪地");
private final String SeasonName;//季节名称
private final String SeasonDesc;//季节描述
//构造器私有化,外界不能调用这个构造器,只能Season内部自己调用
private Season(String SeasonName,String SeasonDesc){
this.SeasonName=SeasonName;
this.SeasonDesc=SeasonDesc;
}
public String getSeasonDesc() {
return SeasonDesc;
}
public String getSeasonName() {
return SeasonName;
}
@Override
public String toString() {
return "Season{" +
"SeasonName='" + SeasonName + '\'' +
", SeasonDesc='" + SeasonDesc + '\'' +
'}';
}
}
测试类
public class Test1 {
public static void main(String[] args) {
Season winter = Season.WINTER;
System.out.println(winter);
}
}
SPRING(“春天”,“春暖花开”),
SUMMER(“夏天”,“烈日炎炎”),
AUTUMN(“秋天”,“硕果累累”),
WINTER(“冬天”,“冰天雪地”);
这样写省略了public static final Season SPRING = new Season(“春天”,“春暖花开”);
我们可以看到 Season类中重写了toString方法所以我们输出的结果是
现在我们将Season类中的同String方法去掉
依旧运行Test类输出的结果是
因为enum的上层父类不是Object而是java.lang.Enum
Enum;类的常用方法
1.toString():获取对象的名字
2.values: 返回枚举类对象的数组
3.valueOf:通过对象名字获取这个枚举对象
枚举类实现接口
接口
public interface ii {
void show();
}
Season类
public enum Season implements ii{
SPRING,
SUMMER,
AUTUMN,
WINTER;
@Override
public void show() {
System.out.println("这是春天");
}
}
Test类
public class Test {
public static void main(String[] args) {
Season spring = Season.SPRING;
spring.show();
Season winter = Season.WINTER;
winter.show();
}
}
输出结果:
我们发现上面 所有的枚举对象,调用这个show方法的时候走的都是同一个方法,结果都一样
我们想要不同的对象调用的show方法不同
改进后的Season类
public enum Season implements ii{
SPRING{
public void show() {System.out.println("这是春天");}
},
SUMMER {
public void show() {System.out.println("这是夏天");}
},
AUTUMN {
public void show() {System.out.println("这是春秋天");}
},
WINTER {
public void show() {System.out.println("这是冬天");}
};
}
这样子就可以达到我们的目的
枚举的应用
1.可以在入口处对参数进行限制
例如:性别只有“男”和“女”种,所以我们可以使用enum来对设置性别的参数进行限制
Person类
public class Person {
private Gender sex;
public Gender getSex() {
return sex;
}
public void setSex(Gender sex) {
this.sex = sex;
}
}
Gender类
public enum Gender {
男,
女;
}
Test类
我们发现只要set方法传入的不是“男”或”女“就会报错