1.黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值。
2.白盒测试:需要写代码的。关注程序具体的执行流程
3.Junit使用:白盒测试 * 步骤:()1、定义一个测试类(测试用例)
* 建议:
测试类名:被测试的类名Test eg. CalculatorTest
包名:xxx.xxx.xx.test eg. cn.itcast.test(包内放测试类,该包与被测试类的包平级)
2、定义测试方法:可以独立运行
* 建议:
方法名:test测试的方法名 eg.testAdd()
返回值:void
参数列表:空参
3、给方法加注解 @test
4、导入Junit依赖环境
* 判定结果:红色:失败
绿色:成功
* 一般会使用断言 *** 作来处理结果:
Assert.assertEquals(期望值,运算值);
* 注解:1、@Before: 初始化
修饰的方法会在测试方法之前被自动执行
2、@After: 释放资源
修饰的方法会在测试方法执行之后被自动执行
二、反射:框架设计的灵魂可以只修改配置文件,而不改变代码
获取Class对象的三种方式以及用途Class的功能(使用Class对象)
案例:设计一个“框架”,可以创建任意类的对象,并且执行其中的任意方法
import java.io.FileReader;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Properties;
/*
框架类:不可以改变该类的任意代码
创建任意类的对象,并且执行任意方法
* */
public class ReflectTest {
public static void main(String[] args) throws Exception {
//1.加载配置文件
//1.1创建Properties 对象
Properties pro=new Properties();
//1.2加载配置文件,转换为一个Map集合
/* 第一种方法:filereader 读取配置文件*/
/*FileReader fr=new FileReader("E:\Java项目\Test\JavaWeb\src\reflect.properties");
pro.load(fr);
fr.close();*/
/* 第二种方法:获取class目录下的配置文件*/
ClassLoader cl=ReflectTest.class.getClassLoader();
InputStream is=cl.getResourceAsStream("reflect.properties");
pro.load(is);
//2.获取配置文件中的数据
String cn=pro.getProperty("className");
String mn=pro.getProperty("methodName");
//3.加载该类进内存
Class c= Class.forName(cn);
//4.创建对象
Object obj = c.newInstance();
//5.获取方法对象
Method m = c.getMethod(mn);
//6.执行方法
m.invoke(obj);
}
}
三、注解
JDK中预定义的注解
自定义注解
元注解(用于描述注解的注解)
使用注解
小结
案例:(简单测试框架,使用注解)
测试框架
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Method;
/*
简单的测试框架:
当主方法被执行,会自动检测所有被检测(加了Check注解的)方法,判断是否有异常,并且记录到文件中
*/
public class TestCheck {
public static void main(String[] args) throws IOException {
//1.创建计算器(被检测的)对象
Calculator c=new Calculator();
//2.获取字节码文件对象(得到所有的方法,执行所有的方法)
Class cls= c.getClass();
//3.得到所有的方法
Method[] methods = cls.getMethods();
int num=0;//出现异常的次数
BufferedWriter bw=new BufferedWriter(new FileWriter("bug.txt"));
//4.执行所有的方法
for(Method m:methods){
//判断方法上是否有Check注解
if(m.isAnnotationPresent(Check.class)){
try {
//5.如果有,就执行该方法
m.invoke(c);
} catch (Exception e) {
//6.捕获异常
//记录到文件中
num++;
bw.write(m.getName()+"方法出异常了");
bw.newLine();
bw.write("异常的名称:"+e.getCause().getClass().getSimpleName());
bw.newLine();
bw.write("异常的原因"+e.getCause().getMessage());
bw.newLine();
bw.write("---------------------");
bw.newLine();
}
}
}
bw.write("本次总共出现了"+num+"次异常");
bw.flush();
bw.close();
}
}
注解
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/*
注解类
*/
@Retention(value= RetentionPolicy.RUNTIME)
public @interface Check {
}
被测试的代码
/*
计算器
*/
public class Calculator {
@Check
public void add(){
System.out.println("1+0="+(1+0));
}
@Check
public void sub(){
System.out.println("1-0="+(1-0));
}
@Check
public void mul(){
System.out.println("1*0="+(1*0));
}
@Check
public void div(){
System.out.println("1/0="+(1/0));
}
public void show(){
System.out.println("Calculator show()...");
}
}
(1条消息) java注解-最通俗易懂的讲解_Tanyboye的博客-CSDN博客_java 注解https://blog.csdn.net/qq1404510094/article/details/80577555
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)