测试分类:
1. 黑盒测试:不需要写代码, 给输入值, 看程序是否能够输出期望的值
比如你下载一个APP, 随便点点点, APP闪退了
2. 白盒测试:需要写代码的. 关注程序具体的执行流程
比如今天学习的JUnit
JUnit: 使用步骤
JUnit使用步骤:
1. 定义一个测试类(也叫测试用例)
包名:xxx.xxx.xx.test
被测试的类名: Calculator
对应的测试类名: CalculatorTest
2. 定义测试方法:可以独立运行
被测试的方法名: add()
对应的测试方法名: testAdd()
建议测试方法的返回值是void, 参数列表是空参
3. 在方法上加 @Test 注解
4. 在 @Test 注解上按 Alt+Enter, 选择 "Add 'JUnit4' to Classpath" 导入JUnit依赖环境
5. 在方法名上右键, 选择 "Run '方法名()'"
反射概述
框架:
半成品软件. 可以在框架的基础上进行软件开发, 简化编码
比如JUnit就是一个单元测试框架, 它不是一个独立的软件, 而是和我们开发的软件结合, 简化代码测试
反射: 将类的各个组成部分, 封装为其他对象, 这就是反射机制
成员变量(字段): Field类的对象
构造方法: Constructor类的对象
成员方法: Method类的对象
好处:
1. 可以在程序运行过程中, 操作这些对象
2. 可以解耦, 提高程序的可扩展性
Java代码在计算机中的3个阶段:
SOURCE: 源代码阶段
CLASS: 类对象阶段
RUNTIME: 运行时阶段
反射: 获取字节码对象的3种方式
获取一个类的字节码对象的3种方式:
1. Class.forName("全类名")
将字节码文件加载进内存,返回Class对象
适用场景: 多用于配置文件,将类名定义在配置文件中. 读取文件, 加载类
2. 类名.class .
通过类名的属性class获取
适用场景: 多用于参数的传递 getConstructor(String.class, int.class)
3. 对象.getClass()
getClass()方法在Object类中定义
适用场景: 多用于对象的获取字节码的方式 p.getClass()
同一个类的字节码对象, 只有"唯一的一个"
注解: Annotation
JDK 1.5 引入. 也叫元数据, 是一种代码级别的说明
它可以声明在包, 类, 字段(成员变量), 方法, 局部变量, 方法参数等的前面, 用来对这些元素进行说明
注解: 说明程序的。给计算机看的
注释: 用文字描述程序的。给程序员看的
使用注解: @注解名称
作用分类:
1. 编写文档: 通过代码里标识的注解生成文档
(生成API文档 @author @version @since @param @return)
2. 代码分析: 通过代码里标识的注解对代码进行分析 (使用反射)
(JUnit提供的 @Test @Before @After)
3. 编译检查: 通过代码里标识的注解让编译器能够实现基本的编译检查
(@Override @FunctionalInterface)
注解: JDK内置注解
JDK中预定义的一些注解:
@Override: 检测被该注解标注的方法是否是"重写"父类(接口)的
@Deprecated: 该注解标注的内容,表示已过时
@SuppressWarnings: 压制警告. 一般传递参数all @SuppressWarnings("all")
自定义注解: 格式和本质
public interface 接口名 {}
自定义注解格式:关键字 @interface
元注解
public @interface 注解名称 {
属性; (接口中的抽象方法)
属性;
属性;
...
}
@注解名称
注解的本质:
注解本质上就是一个接口,该接口默认继承Annotation接口
public interface MyAnno extends java.lang.annotation.Annotation {}
枚举:
enum, enumeration. JDK 1.5 引入
主要是用于定义一些"相关的"常量, 比如星期, 颜色, 用来进行区分
枚举定义方式:
public enum 枚举名 {
枚举常量1, 枚举常量2, 枚举常量3;
}
使用方式:
枚举名.常量名
自定义注解: 属性定义
属性:
接口中的"抽象方法"
属性的要求:
1. 属性的"返回值类型"可以是以下类型:
基本数据类型(8种)
String
枚举
注解
以上类型的数组
2. 定义了属性,在使用注解时, 需要"给属性赋值" (其实是抽象方法的返回值)
1. 属性使用 default 关键字指定默认值, 则可以不赋值
2. 如果只有一个名为"value"的属性需要赋值, 则 value 可以省略, 直接写值即可
3. 给数组赋值时,值使用{}包裹。如果数组中只有一个值,则{}可以省略
自定义注解: 元注解
元注解:
用于描述注解的注解
常用元注解:
@Target: 描述注解能够作用的位置
ElementType枚举的常用取值:
TYPE:可以作用于类上
METHOD:可以作用于方法上
FIELD:可以作用于成员变量上
示例: @Target(value = {ElementType.TYPE, ElementType.METHOD})
@Retention: 描述注解被保留的阶段
RetentionPolicy枚举的取值:
SOURCE: 保留到源代码阶段
CLASS: 保留到类对象阶段
RUNTIME: 保留到运行时阶段
示例: @Retention(RetentionPolicy.RUNTIME):保留注解到class字节码文件中并被JVM读取到
@Documented: 加上后, 当前注解会被抽取到api文档中
@Inherited: 加上后, 当前注解会被子类继承
自定义注解: 解析注解
获取注解属性值的步骤:
1. 获取注解定义位置的对象 (Class对象(类注解), Field对象(成员变量注解), Method对象(方法注解))
2. 调用 ProAnno a = cls.getAnnotation(ProAnno.class) 方法获取注解对象
3. 通过注解对象调用抽象方法获取属性值
|
|