本帖最后由 黄艺纯 于 2018-8-31 10:21 编辑
1.黑盒测试和白盒测试的区别?
白盒测试是穷举路径测试,黑盒测试是穷举输入测试,这两种方法是基于完全不同的观点,反应了事物的两个极端,它们各有侧重和优势,但不能彼此替代。在现代的测试理念中,这两种测试方法不是截然分开的,而是交叉使用。 白盒测试的优点 1、能仔细考虑软件的实现。 2、可检测代码中的每条分支和路径。 3、揭示隐藏在代码中的错误。 4、对代码的测试比较彻底。 白盒测试的缺点 1、昂贵。 2、无法检测代码中遗漏的路径和数据敏感性错误。 3、不验证规格的正确性。 黑盒测试的优点 1、对于子系统甚至系统,效率要比白盒测试高。 2、测试人员不需要了解实现的细节,包括特定的编程语言。 3、测试人员和编程人员彼此独立。 4、从用户的角度进行测试,很容易理解和接受。 5、有助于暴露规格的不一致或有歧义的问题。 6、测试用例可以在规格完成后马上进行。 黑盒测试的缺点 1、只有一小部分输入被测试到,要测试每个可能的输入几乎不可能。 2、没有清晰、简明的规格,测试用例很难设计。 3、如果测试人员不被告知开发人员已经执行过的用例,在测试数据上会存在不必要的重复。 4、有很多程序路径没有被测试到。 5、不能直接针对特定程序段测试,而这些程序段可能很复杂,有可能隐藏更多的问题。 6、大部分和研究相关的测试都是直接针对白盒测试的。
2.什么是反射?反射在程序中的应用场景,我们为什么要使用反射?
什么是反射:
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象. 反射就是把java类中的各种成分映射成一个个的Java对象。 为什么要使用反射:假如你写了一段代码:Object o=new Object(); 运行了起来! 首先JVM会启动,你的代码会编译成一个.class文件,然后被类加载器加载进jvm的内存中,你的类Object加载到方法区中,创建了Object类的class对象到堆中,注意这个不是new出来的对象,而是类的类型对象,每个类只有一个class对象,作为方法区类的数据结构的接口。jvm创建对象前,会先检查类是否加载,寻找类对应的class对象,若加载好,则为你的对象分配内存,初始化也就是代码:new Object()。 上面的流程就是你自己写好的代码扔给jvm去跑,跑完就over了,jvm关闭,你的程序也停止了。 为什么要讲这个呢?因为要理解反射必须知道它在什么场景下使用。 想想上面的程序对象是自己new的,程序相当于写死了给jvm去跑。假如一个服务器上突然遇到某个请求哦要用到某个类,哎呀但没加载进jvm,是不是要停下来自己写段代码,new一下,哦启动一下服务器,(牛逼)! 反射是什么呢?当我们的程序在运行时,需要动态的加载一些类这些类可能之前用不到所以不用加载到jvm,而是在运行时根据需要才加载,这样的好处对于服务器来说不言而喻,举个例子我们的项目底层有时是用mysql,有时用oracle,需要动态地根据实际情况加载驱动类,这个时候反射就有用了,假设 com.java.dbtest.myqlConnection,com.java.dbtest.oracleConnection这两个类我们要用,这时候我们的程序就写得比较动态化,通过Class tc =Class.forName("com.java.dbtest.TestConnection");通过类的全类名让jvm在服务器中找到并加载这个类,而如果是oracle则传入的参数就变成另一个了。这时候就可以看到反射的好处了,这个动态性就体现出java的特性了! 方法区存的是类的信息,不是存类对象的,建议看一下JVM内存分配,类加载器加载类是通过方法区上类的信息在堆上创建一个类的Class对象,这个Class对象是唯一的,由JVM保证唯一,之后对这个类的创建都是根据这个Class对象来操作的。 你可以理解成类存在方法区中,类的class对象存在于堆中,这个class对象会作为运行时创建该类对象的模版。这个class对象是唯一对应该类的,要区分所谓的实例和class对象。为什么需要class对象,你想下如果一个加载进方法区的类,在jvm运行时是动态加载进来的,没有这个class对象你思考该如何访问一个未知的类并创建对象呢?没错就是这个class作为访问接口。
3.获取 Class对象有几种方式?他们的用途都在哪?
1、通过 Class.forName("类的全称") 例如:Class cl1= Class.forName("com.csdn.Test"); 直接通过配置文件获取,用于框架,数据库中
2、通过 类名.class 例如: Test test=new Test(); Class cl3= Test.class; 必须导包才能使用此方法,没什么用。
3、通过 类的对象.getClass() 例如: Class cl2=test.getClass(); 没用,都new了个对象,还用此方法,多此一举。
4.如何获取Class对象中被私有的成员变量对象和成员方法对象?
getDeclearedXxx();
5.注解在程序中都有哪些用途?
java内置了三种标准注解
@Override,表示当前的方法定义将覆盖超类中的方法。 @Deprecated,使用了注解为它的元素编译器将发出警告,因为注解@Deprecated是不赞成使用的代码,被弃用的代码。 @SuppressWarnings,关闭不当编译器警告信息。
6.什么是元注解?
元注解的作用就是负责注解其他注解。
Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其他annotation类型作说明: @Target 注解用于什么地方 @Retention 注解类型的存活时间 @Documented 注解是否包含在JavaDoc中 @Inherited 是否允许子类继承该注解
7.文件从编译到运行可以分为哪三个时期?
这道题问的是类加载? 总共分为三个步骤: 装载; 链接(检查、准备、解析); 初始化。
8.思考:想让一个类加载进内存,有几种方式?
1、由 new 关键字创建一个类的实例 在由运行时刻用 new 方法载入 如:Dog dog = new Dog(); 2、调用 Class.forName() 方法 通过反射加载类型,并创建对象实例 如:Class clazz = Class.forName(“Dog”); Object dog =clazz.newInstance(); 3、调用某个 ClassLoader 实例的 loadClass() 方法 通过该 ClassLoader 实例的 loadClass() 方法载入。应用程序可以通过继承 ClassLoader 实现自己的类装载器。 如:Class clazz = classLoader.loadClass(“Dog”); Object dog =clazz.newInstance();
|