Junit单元测试

Junit单元测试

Junit单元测试

测试分类:1.黑盒测试 2.白盒测试

  1. 黑盒测试

    只测试输入、输出

  2. 白盒测试

    不仅测试输入输出,也要关注程序执行的具体流程

    白盒测试是要写测试代码的

    Junit是白盒测试的一种

    单元测试(英语:Unit Testing)又称为模块测试,是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。

    通常来说,程序员每修改一次程序就会进行最少一次单元测试,在编写程序的过程中前后很可能要进行多次单元测试,以证实程序达到软件规格书要求的工作目标,没有程序错误;虽然单元测试不是必须的,但也不坏,这牵涉到项目管理的政策决定。

    JUnit 是一个回归测试框架,被开发者用于实施对应用程序的单元测试,加快程序编制速度,同时提高编码的质量。JUnit 测试框架能够轻松完成以下任意两种结合:

    • Eclipse 集成开发环境
    • Ant 打包工具
    • Maven 项目构建管理

原有测试方法的问题:

  1. 进行多项测试时要注释掉之前的测试代码,很不方便
  2. 测试代码要和源代码放在一起

Junit单元测试_第1张图片
1568516964791
@Before常用于一些资源的申请

@After常用于资源的释放

这两个注释都是标注了每次执行测试代码都需要被执行的方法

Junit单元测试_第2张图片

反射

反射被称为框架设计的灵魂

1568517281277
JAVA运行的三个阶段:

Junit单元测试_第3张图片

  1. .java文件通过javac编译为.class字节码文件,这些都是存放在硬盘中的,这个阶段称为源代码阶段
  2. ClassLoader将字节码文件加载到内存
  3. class是一个用来描述字节码文件的类。其的成员变量、构造方法和成员方法分别被封装为Field[]、Constructor[]、Method[]对象(因为可能有多个,所以用数组进行描述)。--这就是一个反射的过程

例如,当我们在IDE中定义了一个对象后,IDE会将这个对象对应的类的字节码文件加载到内存中,对应的class对象将其所有的成员方法封装为Method[],这样只需要将Method[]中的元素变量显示出来,就达到了代码提示的效果

反射的好处:

1568518178168

获取字节码文件Class对象

Junit单元测试_第4张图片
第一种方式:字节码文件未加载进内存时

第二种:字节码文件已加载到内存中

第三种:已经在运行、有对象了

1568519762769
举一个例子:

Demo1.java

import domain.Person;

/*
*@author JiaDing
*/
public class Demo1 {
/*
 * 获取Class的三种方式
 */
    public static void main(String[]args) throws Exception {
        //1.Claa.forName("全类名")
        Class cls1=Class.forName("domain.Person");
        System.out.println(cls1);
        //2.类名.class
        Class cls2=Person.class;
        System.out.println(cls2);
        //3.对象.getClass()
        Person p=new Person();
        Class cls3=p.getClass();
        System.out.println(cls3);
    }
}

Person.java

package domain;
/*
*@author JiaDing
*/
public class Person {
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public Person() {
        
    }
    public Person(String name,int age) {
        this.name=name;
        this.age=age;
    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }
    
}

Junit单元测试_第5张图片

使用Class对象

Junit单元测试_第6张图片

  1. 获取成员变量

getFields()获取的所有public成员变量!,而getDeclaredFields()获取的才是所有的成员变量(输出时会输出权限修饰符)!

getDeclaredFields()可以突破private限制对私有变量进行读写!

1568530697598
在使用前需要忽略访问权限修饰符的安全检查:暴力反射!

对成员变量能做的两个操作:设置值void set(Object obj,Object value)、获取值get(Object obj)

Junit单元测试_第7张图片

  1. 获取构造方法

获取时要给出不同参数类型的类

1568530993796
有了构造方法获得的构造器,就可以用来创建对象了

1568531120435
如果构造使用空参数构造方法创建对象,则可以简化为用class对象中专用的newInstance方法

Junit单元测试_第8张图片
要访问私有构造方法时:

constructor1.setAccessible(true)

  1. 获取成员方法

Method对象调用对应的方法:invoke(Object obj,Object ··· args)//传入一个对象和执行该参数需要的参数

通过getMethods()获取的方法不仅有该类我们定义的方法,还有继承自Object类的方法

开启暴力反射:method.setAccessible(true);

获取该方法的名称:String getName();

String name=method.getName();

  1. 获取类名

1568531876181
这样获取的类名是全类名

反射案例

1568532864248
前提:不能改变该类的任何代码,即创建一种通用的方法

Junit单元测试_第9张图片
配置文件类型:.properties,在其中使用全类名(换句话说,如果我们看到一个配置文件中使用的是全类名,我们也可以猜测它使用了反射原理)

1568534174160
Junit单元测试_第10张图片
利用类加载器的方法获取配置文件资源

1568534011047
Junit单元测试_第11张图片
这样每次只需要修改配置文件就好了。相比于修改代码,修改配置文件不需要重新编译、测试、上线,也提高了程序的拓展性。


注解

1568531966023
Junit单元测试_第12张图片
Junit单元测试_第13张图片
1568532709480
Junit单元测试_第14张图片
@Deprecated过时方法不是不能调用,只是显示出来,便于选择和之后的迭代

示例:

Junit单元测试_第15张图片
这些内容可以被抽取到dlc文件中

javadoc test1.java//抽取注解到文档中

生成的文件们:

Junit单元测试_第16张图片
生成的文档页面(HTML):

Junit单元测试_第17张图片
Junit单元测试_第18张图片
Junit单元测试_第19张图片
@Target(ElementType.FIELD)//声明这个注解类是给其他类的属性做注解

@Rectention(RetentionPolicy.RUNTIME)//定义注解的生命周期

@Documneted//表示将注解写到文档中

@interface TestAnn{

? public int id() default 0;//default是默认值

public String desc() default "";

}

使用:

1567996338339
对一个属性进行注解

Junit单元测试_第20张图片
注解可以用来替换配置文件的作用以简化操作

示例,依然以之前使用配置文件来调用任意类的任意方法的例子为例:

Junit单元测试_第21张图片
Junit单元测试_第22张图片
Junit单元测试_第23张图片
---

你可能感兴趣的:(Junit单元测试)