精华内容
下载资源
问答
  • Java面试题大全(2020版)

    万次阅读 多人点赞 2019-11-26 11:59:06
    发现网上很多Java面试题都没有答案,所以花了很长时间搜集整理出来了这套Java面试题大全,...JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境运行环境。 JRE:Java Runtime Environ...

    发现网上很多Java面试题都没有答案,所以花了很长时间搜集整理出来了这套Java面试题大全,希望对大家有帮助哈~

    本套Java面试题大全,全的不能再全,哈哈~

    博主已将以下这些面试题整理成了一个Java面试手册,是PDF版的。

    关注博主的微信公众号:Java团长,然后回复“面试手册”即可获取~

    一、Java 基础

    1. JDK 和 JRE 有什么区别?

    • JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境。
    • JRE:Java Runtime Environment 的简称,java 运行环境,为 java 的运行提供了所需环境。

    具体来说 JDK 其实包含了 JRE,同时还包含了编译 java 源码的编译器 javac,还包含了很多 java 程序调试和分析的工具。简单来说:如果你需要运行 java 程序,只需安装 JRE 就可以了,如果你需要编写 java 程序,需要安装 JDK。

    2. == 和 equals 的区别是什么?

    == 解读

    对于基本类型和引用类型 == 的作用效果是不同的,如下所示:

    • 基本类型:比较的是值是否相同;
    • 引用类型:比较的是引用是否相同;

    代码示例:

    String x = "string";
    String y = "string";
    String z = new String("string");
    System.out.println(x==y); // true
    System.out.println(x==z); // false
    System.out.println(x.equals(y)); // true
    System.out.println(x.equals(z)); // true

    代码解读:因为 x 和 y 指向的是同一个引用,所以 == 也是 true,而 new String()方法则重写开辟了内存空间,所以 == 结果为 false,而 equals 比较的一直是值,所以结果都为 true。

    equals 解读

    equals 本质上就是 ==,只不过 String 和 Integer 等重写了 equals 方法,把它变成了值比较。看下面的代码就明白了。

    首先来看默认情况下 equals 比较一个有相同值的对象,代码如下:

    class Cat {
        public Cat(String name) {
            this.name = name;
        }
    
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    
    Cat c1 = new Cat("王磊");
    Cat c2 = new Cat("王磊");
    System.out.println(c1.equals(c2)); // false

    输出结果出乎我们的意料,竟然是 false?这是怎么回事,看了 equals 源码就知道了,源码如下:

    public boolean equals(Object obj) {
        return (this == obj);
    }

    原来 equals 本质上就是 ==。

    那问题来了,两个相同值的 String 对象,为什么返回的是 true?代码如下:

    String s1 = new String("老王");
    String s2 = new String("老王");
    System.out.println(s1.equals(s2)); // true

    同样的,当我们进入 String 的 equals 方法,找到了答案,代码如下:

    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

    原来是 String 重写了 Object 的 equals 方法,把引用比较改成了值比较。

    总结 :== 对于基本类型来说是值比较,对于引用类型来说是比较的是引用;而 equals 默认情况下是引用比较,只是很多类重新了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。

    3. 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?

    不对,两个对象的 hashCode()相同,equals()不一定 true。

    代码示例:

    String str1 = "通话";
    String str2 = "重地";
    System.out.println(String.format("str1:%d | str2:%d",  str1.hashCode(),str2.hashCode()));
    System.out.println(str1.equals(str2));

    执行的结果:

    str1:1179395 | str2:1179395

    false

    代码解读:很显然“通话”和“重地”的 hashCode() 相同,然而 equals() 则为 false,因为在散列表中,hashCode()相等即两个键值对的哈希值相等,然而哈希值相等,并不一定能得出键值对相等。

    4. final 在 java 中有什么作用?

    • final 修饰的类叫最终类,该类不能被继承。
    • final 修饰的方法不能被重写。
    • final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。

    5. java 中的 Math.round(-1.5) 等于多少?

    等于 -1,因为在数轴上取值时,中间值(0.5)向右取整,所以正 0.5 是往上取整,负 0.5 是直接舍弃。

    6. String 属于基础的数据类型吗?

    String 不属于基础类型,基础类型有 8 种:byte、boolean、char、short、int、float、long、double,而 String 属于对象。

    7. java 中操作字符串都有哪些类?它们之间有什么区别?

    操作字符串的类有:String、StringBuffer、StringBuilder。

    String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。

    StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。

    8. String str="i"与 String str=new String("i")一样吗?

    不一样,因为内存的分配方式不一样。String str="i"的方式,java 虚拟机会将其分配到常量池中;而 String str=new String("i") 则会被分到堆内存中。

    9. 如何将字符串反转?

    使用 StringBuilder 或者 stringBuffer 的 reverse() 方法。

    示例代码:

    // StringBuffer reverse
    StringBuffer stringBuffer = new StringBuffer();
    stringBuffer.append("abcdefg");
    System.out.println(stringBuffer.reverse()); // gfedcba
    // StringBuilder reverse
    StringBuilder stringBuilder = new StringBuilder();
    stringBuilder.append("abcdefg");
    System.out.println(stringBuilder.reverse()); // gfedcba

    10. String 类的常用方法都有那些?

    • indexOf():返回指定字符的索引。
    • charAt():返回指定索引处的字符。
    • replace():字符串替换。
    • trim():去除字符串两端空白。
    • split():分割字符串,返回一个分割后的字符串数组。
    • getBytes():返回字符串的 byte 类型数组。
    • length():返回字符串长度。
    • toLowerCase():将字符串转成小写字母。
    • toUpperCase():将字符串转成大写字符。
    • substring():截取字符串。
    • equals():字符串比较。

    11. 抽象类必须要有抽象方法吗?

    不需要,抽象类不一定非要有抽象方法。

    示例代码:

    abstract class Cat {
        public static void sayHi() {
            System.out.println("hi~");
        }
    }

    上面代码,抽象类并没有抽象方法但完全可以正常运行。

    12. 普通类和抽象类有哪些区别?

    • 普通类不能包含抽象方法,抽象类可以包含抽象方法。
    • 抽象类不能直接实例化,普通类可以直接实例化。

    13. 抽象类能使用 final 修饰吗?

    不能,定义抽象类就是让其他类继承的,如果定义为 final 该类就不能被继承,这样彼此就会产生矛盾,所以 final 不能修饰抽象类,如下图所示,编辑器也会提示错误信息:

    14. 接口和抽象类有什么区别?

    • 实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。
    • 构造函数:抽象类可以有构造函数;接口不能有。
    • main 方法:抽象类可以有 main 方法,并且我们能运行它;接口不能有 main 方法。
    • 实现数量:类可以实现很多个接口;但是只能继承一个抽象类。
    • 访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。

    15. java 中 IO 流分为几种?

    按功能来分:输入流(input)、输出流(output)。

    按类型来分:字节流和字符流。

    字节流和字符流的区别是:字节流按 8 位传输以字节为单位输入输出数据,字符流按 16 位传输以字符为单位输入输出数据。

    16. BIO、NIO、AIO 有什么区别?

    • BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
    • NIO:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
    • AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。

    17. Files的常用方法都有哪些?

    • Files.exists():检测文件路径是否存在。
    • Files.createFile():创建文件。
    • Files.createDirectory():创建文件夹。
    • Files.delete():删除一个文件或目录。
    • Files.copy():复制文件。
    • Files.move():移动文件。
    • Files.size():查看文件个数。
    • Files.read():读取文件。
    • Files.write():写入文件。

    二、容器

    18. java 容器都有哪些?

    常用容器的图录:

    19. Collection 和 Collections 有什么区别?

    • java.util.Collection 是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式,其直接继承接口有List与Set。
    • Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。

    20. List、Set、Map 之间的区别是什么?

    21. HashMap 和 Hashtable 有什么区别?

    • hashMap去掉了HashTable 的contains方法,但是加上了containsValue()和containsKey()方法。
    • hashTable同步的,而HashMap是非同步的,效率上逼hashTable要高。
    • hashMap允许空键值,而hashTable不允许。

    22. 如何决定使用 HashMap 还是 TreeMap?

    对于在Map中插入、删除和定位元素这类操作,HashMap是最好的选择。然而,假如你需要对一个有序的key集合进行遍历,TreeMap是更好的选择。基于你的collection的大小,也许向HashMap中添加元素会更快,将map换为TreeMap进行有序key的遍历。

    23. 说一下 HashMap 的实现原理?

    HashMap概述: HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 

    HashMap的数据结构: 在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。

    当我们往Hashmap中put元素时,首先根据key的hashcode重新计算hash值,根绝hash值得到这个元素在数组中的位置(下标),如果该数组在该位置上已经存放了其他元素,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放入链尾.如果数组中该位置没有元素,就直接将该元素放到数组的该位置上。

    需要注意Jdk 1.8中对HashMap的实现做了优化,当链表中的节点数据超过八个之后,该链表会转为红黑树来提高查询效率,从原来的O(n)到O(logn)

    24. 说一下 HashSet 的实现原理?

    • HashSet底层由HashMap实现
    • HashSet的值存放于HashMap的key上
    • HashMap的value统一为PRESENT

    25. ArrayList 和 LinkedList 的区别是什么?

    最明显的区别是 ArrrayList底层的数据结构是数组,支持随机访问,而 LinkedList 的底层数据结构是双向循环链表,不支持随机访问。使用下标访问一个元素,ArrayList 的时间复杂度是 O(1),而 LinkedList 是 O(n)。

    26. 如何实现数组和 List 之间的转换?

    • List转换成为数组:调用ArrayList的toArray方法。
    • 数组转换成为List:调用Arrays的asList方法。

    27. ArrayList 和 Vector 的区别是什么?

    • Vector是同步的,而ArrayList不是。然而,如果你寻求在迭代的时候对列表进行改变,你应该使用CopyOnWriteArrayList。 
    • ArrayList比Vector快,它因为有同步,不会过载。 
    • ArrayList更加通用,因为我们可以使用Collections工具类轻易地获取同步列表和只读列表。

    28. Array 和 ArrayList 有何区别?

    • Array可以容纳基本类型和对象,而ArrayList只能容纳对象。 
    • Array是指定大小的,而ArrayList大小是固定的。 
    • Array没有提供ArrayList那么多功能,比如addAll、removeAll和iterator等。

    29. 在 Queue 中 poll()和 remove()有什么区别?

    poll() 和 remove() 都是从队列中取出一个元素,但是 poll() 在获取元素失败的时候会返回空,但是 remove() 失败的时候会抛出异常。

    30. 哪些集合类是线程安全的?

    • vector:就比arraylist多了个同步化机制(线程安全),因为效率较低,现在已经不太建议使用。在web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑的。
    • statck:堆栈类,先进后出。
    • hashtable:就比hashmap多了个线程安全。
    • enumeration:枚举,相当于迭代器。

    31. 迭代器 Iterator 是什么?

    迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。

    32. Iterator 怎么使用?有什么特点?

    Java中的Iterator功能比较简单,并且只能单向移动:

    (1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。

    (2) 使用next()获得序列中的下一个元素。

    (3) 使用hasNext()检查序列中是否还有元素。

    (4) 使用remove()将迭代器新返回的元素删除。

    Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。

    33. Iterator 和 ListIterator 有什么区别?

    • Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。 
    • Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。 
    • ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。

     三、多线程

    35. 并行和并发有什么区别?

    • 并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。
    • 并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。
    • 在一台处理器上“同时”处理多个任务,在多台处理器上同时处理多个任务。如hadoop分布式集群。

    所以并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能。

    36. 线程和进程的区别?

    简而言之,进程是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程。进程在执行过程中拥有独立的内存单元,而多个线程共享内存资源,减少切换次数,从而效率更高。线程是进程的一个实体,是cpu调度和分派的基本单位,是比程序更小的能独立运行的基本单位。同一进程中的多个线程之间可以并发执行。

    37. 守护线程是什么?

    守护线程(即daemon thread),是个服务线程,准确地来说就是服务其他的线程。

    38. 创建线程有哪几种方式?

    ①. 继承Thread类创建线程类

    • 定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。
    • 创建Thread子类的实例,即创建了线程对象。
    • 调用线程对象的start()方法来启动该线程。

    ②. 通过Runnable接口创建线程类

    • 定义runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。
    • 创建 Runnable实现类的实例,并依此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。
    • 调用线程对象的start()方法来启动该线程。

    ③. 通过Callable和Future创建线程

    • 创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且有返回值。
    • 创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。
    • 使用FutureTask对象作为Thread对象的target创建并启动新线程。
    • 调用FutureTask对象的get()方法来获得子线程执行结束后的返回值。

    39. 说一下 runnable 和 callable 有什么区别?

    有点深的问题了,也看出一个Java程序员学习知识的广度。

    • Runnable接口中的run()方法的返回值是void,它做的事情只是纯粹地去执行run()方法中的代码而已;
    • Callable接口中的call()方法是有返回值的,是一个泛型,和Future、FutureTask配合可以用来获取异步执行的结果。

    40. 线程有哪些状态?

    线程通常都有五种状态,创建、就绪、运行、阻塞和死亡。

    • 创建状态。在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态。
    • 就绪状态。当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。
    • 运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。
    • 阻塞状态。线程正在运行的时候,被暂停,通常是为了等待某个时间的发生(比如说某项资源就绪)之后再继续运行。sleep,suspend,wait等方法都可以导致线程阻塞。
    • 死亡状态。如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪   

    41. sleep() 和 wait() 有什么区别?

    sleep():方法是线程类(Thread)的静态方法,让调用线程进入睡眠状态,让出执行机会给其他线程,等到休眠时间结束后,线程进入就绪状态和其他线程一起竞争cpu的执行时间。因为sleep() 是static静态的方法,他不能改变对象的机锁,当一个synchronized块中调用了sleep() 方法,线程虽然进入休眠,但是对象的机锁没有被释放,其他线程依然无法访问这个对象。

    wait():wait()是Object类的方法,当一个线程执行到wait方法时,它就进入到一个和该对象相关的等待池,同时释放对象的机锁,使得其他线程能够访问,可以通过notify,notifyAll方法来唤醒等待的线程。

    42. notify()和 notifyAll()有什么区别?

    • 如果线程调用了对象的 wait()方法,那么线程便会处于该对象的等待池中,等待池中的线程不会去竞争该对象的锁。
    • 当有线程调用了对象的 notifyAll()方法(唤醒所有 wait 线程)或 notify()方法(只随机唤醒一个 wait 线程),被唤醒的的线程便会进入该对象的锁池中,锁池中的线程会去竞争该对象锁。也就是说,调用了notify后只要一个线程会由等待池进入锁池,而notifyAll会将该对象等待池内的所有线程移动到锁池中,等待锁竞争。
    • 优先级高的线程竞争到对象锁的概率大,假若某线程没有竞争到该对象锁,它还会留在锁池中,唯有线程再次调用 wait()方法,它才会重新回到等待池中。而竞争到对象锁的线程则继续往下执行,直到执行完了 synchronized 代码块,它会释放掉该对象锁,这时锁池中的线程会继续竞争该对象锁。

    43. 线程的 run()和 start()有什么区别?

    每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。通过调用Thread类的start()方法来启动一个线程。

    start()方法来启动一个线程,真正实现了多线程运行。这时无需等待run方法体代码执行完毕,可以直接继续执行下面的代码; 这时此线程是处于就绪状态, 并没有运行。 然后通过此Thread类调用方法run()来完成其运行状态, 这里方法run()称为线程体,它包含了要执行的这个线程的内容, Run方法运行结束, 此线程终止。然后CPU再调度其它线程。

    run()方法是在本线程里的,只是线程里的一个函数,而不是多线程的。 如果直接调用run(),其实就相当于是调用了一个普通函数而已,直接待用run()方法必须等待run()方法执行完毕才能执行下面的代码,所以执行路径还是只有一条,根本就没有线程的特征,所以在多线程执行时要使用start()方法而不是run()方法。

    44. 创建线程池有哪几种方式?

    ①. newFixedThreadPool(int nThreads)

    创建一个固定长度的线程池,每当提交一个任务就创建一个线程,直到达到线程池的最大数量,这时线程规模将不再变化,当线程发生未预期的错误而结束时,线程池会补充一个新的线程。

    ②. newCachedThreadPool()

    创建一个可缓存的线程池,如果线程池的规模超过了处理需求,将自动回收空闲线程,而当需求增加时,则可以自动添加新线程,线程池的规模不存在任何限制。

    ③. newSingleThreadExecutor()

    这是一个单线程的Executor,它创建单个工作线程来执行任务,如果这个线程异常结束,会创建一个新的来替代它;它的特点是能确保依照任务在队列中的顺序来串行执行。

    ④. newScheduledThreadPool(int corePoolSize)

    创建了一个固定长度的线程池,而且以延迟或定时的方式来执行任务,类似于Timer。

    45. 线程池都有哪些状态?

    线程池有5种状态:Running、ShutDown、Stop、Tidying、Terminated。

    线程池各个状态切换框架图:

    46. 线程池中 submit()和 execute()方法有什么区别?

    • 接收的参数不一样
    • submit有返回值,而execute没有
    • submit方便Exception处理

    47. 在 java 程序中怎么保证多线程的运行安全?

    线程安全在三个方面体现:

    • 原子性:提供互斥访问,同一时刻只能有一个线程对数据进行操作,(atomic,synchronized);
    • 可见性:一个线程对主内存的修改可以及时地被其他线程看到,(synchronized,volatile);
    • 有序性:一个线程观察其他线程中的指令执行顺序,由于指令重排序,该观察结果一般杂乱无序,(happens-before原则)。

    48. 多线程锁的升级原理是什么?

    在Java中,锁共有4种状态,级别从低到高依次为:无状态锁,偏向锁,轻量级锁和重量级锁状态,这几个状态会随着竞争情况逐渐升级。锁可以升级但不能降级。

    锁升级的图示过程: 

    49. 什么是死锁?

    死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。是操作系统层面的一个错误,是进程死锁的简称,最早在 1965 年由 Dijkstra 在研究银行家算法时提出的,它是计算机操作系统乃至整个并发程序设计领域最难处理的问题之一。

    50. 怎么防止死锁?

    死锁的四个必要条件:

    • 互斥条件:进程对所分配到的资源不允许其他进程进行访问,若其他进程访问该资源,只能等待,直至占有该资源的进程使用完成后释放该资源
    • 请求和保持条件:进程获得一定的资源之后,又对其他资源发出请求,但是该资源可能被其他进程占有,此事请求阻塞,但又对自己获得的资源保持不放
    • 不可剥夺条件:是指进程已获得的资源,在未完成使用之前,不可被剥夺,只能在使用完后自己释放
    • 环路等待条件:是指进程发生死锁后,若干进程之间形成一种头尾相接的循环等待资源关系

    这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之 一不满足,就不会发生死锁。

    理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和 解除死锁。

    所以,在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确 定资源的合理分配算法,避免进程永久占据系统资源。

    此外,也要防止进程在处于等待状态的情况下占用资源。因此,对资源的分配要给予合理的规划。

    51. ThreadLocal 是什么?有哪些使用场景?

    线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享。Java提供ThreadLocal类来支持线程局部变量,是一种实现线程安全的方式。但是在管理环境下(如 web 服务器)使用线程局部变量的时候要特别小心,在这种情况下,工作线程的生命周期比任何应用变量的生命周期都要长。任何线程局部变量一旦在工作完成后没有释放,Java 应用就存在内存泄露的风险。

    52.说一下 synchronized 底层实现原理?

    synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性。

    Java中每一个对象都可以作为锁,这是synchronized实现同步的基础:

    • 普通同步方法,锁是当前实例对象
    • 静态同步方法,锁是当前类的class对象
    • 同步方法块,锁是括号里面的对象

    53. synchronized 和 volatile 的区别是什么?

    • volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取; synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
    • volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的。
    • volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性。
    • volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。
    • volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化。

    54. synchronized 和 Lock 有什么区别?

    • 首先synchronized是java内置关键字,在jvm层面,Lock是个java类;
    • synchronized无法判断是否获取锁的状态,Lock可以判断是否获取到锁;
    • synchronized会自动释放锁(a 线程执行完同步代码会释放锁 ;b 线程执行过程中发生异常会释放锁),Lock需在finally中手工释放锁(unlock()方法释放锁),否则容易造成线程死锁;
    • 用synchronized关键字的两个线程1和线程2,如果当前线程1获得锁,线程2线程等待。如果线程1阻塞,线程2则会一直等待下去,而Lock锁就不一定会等待下去,如果尝试获取不到锁,线程可以不用一直等待就结束了;
    • synchronized的锁可重入、不可中断、非公平,而Lock锁可重入、可判断、可公平(两者皆可);
    • Lock锁适合大量同步的代码的同步问题,synchronized锁适合代码少量的同步问题。

    55. synchronized 和 ReentrantLock 区别是什么?

    synchronized是和if、else、for、while一样的关键字,ReentrantLock是类,这是二者的本质区别。既然ReentrantLock是类,那么它就提供了比synchronized更多更灵活的特性,可以被继承、可以有方法、可以有各种各样的类变量,ReentrantLock比synchronized的扩展性体现在几点上: 

    • ReentrantLock可以对获取锁的等待时间进行设置,这样就避免了死锁 
    • ReentrantLock可以获取各种锁的信息
    • ReentrantLock可以灵活地实现多路通知 

    另外,二者的锁机制其实也是不一样的:ReentrantLock底层调用的是Unsafe的park方法加锁,synchronized操作的应该是对象头中mark word。

    56. 说一下 atomic 的原理?

    Atomic包中的类基本的特性就是在多线程环境下,当有多个线程同时对单个(包括基本类型及引用类型)变量进行操作时,具有排他性,即当多个线程同时对该变量的值进行更新时,仅有一个线程能成功,而未成功的线程可以向自旋锁一样,继续尝试,一直等到执行成功。

    Atomic系列的类中的核心方法都会调用unsafe类中的几个本地方法。我们需要先知道一个东西就是Unsafe类,全名为:sun.misc.Unsafe,这个类包含了大量的对C代码的操作,包括很多直接内存分配以及原子操作的调用,而它之所以标记为非安全的,是告诉你这个里面大量的方法调用都会存在安全隐患,需要小心使用,否则会导致严重的后果,例如在通过unsafe分配内存的时候,如果自己指定某些区域可能会导致一些类似C++一样的指针越界到其他进程的问题。


    四、反射

    57. 什么是反射?

    反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力

    Java反射:

    在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法

    Java反射机制主要提供了以下功能:

    • 在运行时判断任意一个对象所属的类。
    • 在运行时构造任意一个类的对象。
    • 在运行时判断任意一个类所具有的成员变量和方法。
    • 在运行时调用任意一个对象的方法。 

    58. 什么是 java 序列化?什么情况下需要序列化?

    简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保存object states,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。

    什么情况下需要序列化:

    a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
    b)当你想用套接字在网络上传送对象的时候;
    c)当你想通过RMI传输对象的时候;

    59. 动态代理是什么?有哪些应用?

    动态代理:

    当想要给实现了某个接口的类中的方法,加一些额外的处理。比如说加日志,加事务等。可以给这个类创建一个代理,故名思议就是创建一个新的类,这个类不仅包含原来类方法的功能,而且还在原来的基础上添加了额外处理的新类。这个代理类并不是定义好的,是动态生成的。具有解耦意义,灵活,扩展性强。

    动态代理的应用:

    • Spring的AOP
    • 加事务
    • 加权限
    • 加日志

    60. 怎么实现动态代理?

    首先必须定义一个接口,还要有一个InvocationHandler(将实现接口的类的对象传递给它)处理类。再有一个工具类Proxy(习惯性将其称为代理类,因为调用他的newInstance()可以产生代理对象,其实他只是一个产生代理对象的工具类)。利用到InvocationHandler,拼接代理类源码,将其编译生成代理类的二进制码,利用加载器加载,并将其实例化产生代理对象,最后返回。


    五、对象拷贝

    61. 为什么要使用克隆?

    想对一个对象进行处理,又想保留原有的数据进行接下来的操作,就需要克隆了,Java语言中克隆针对的是类的实例。

    62. 如何实现对象克隆?

    有两种方式:

    1). 实现Cloneable接口并重写Object类中的clone()方法;

    2). 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆,代码如下:

    
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;
    
    public class MyUtil {
    
        private MyUtil() {
            throw new AssertionError();
        }
    
        @SuppressWarnings("unchecked")
        public static <T extends Serializable> T clone(T obj) throws Exception {
            ByteArrayOutputStream bout = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(bout);
            oos.writeObject(obj);
    
            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bin);
            return (T) ois.readObject();
    
            // 说明:调用ByteArrayInputStream或ByteArrayOutputStream对象的close方法没有任何意义
            // 这两个基于内存的流只要垃圾回收器清理对象就能够释放资源,这一点不同于对外部资源(如文件流)的释放
        }
    }

    下面是测试代码:

    
    import java.io.Serializable;
    
    /**
     * 人类
     * @author nnngu
     *
     */
    class Person implements Serializable {
        private static final long serialVersionUID = -9102017020286042305L;
    
        private String name;    // 姓名
        private int age;        // 年龄
        private Car car;        // 座驾
    
        public Person(String name, int age, Car car) {
            this.name = name;
            this.age = age;
            this.car = car;
        }
    
        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 Car getCar() {
            return car;
        }
    
        public void setCar(Car car) {
            this.car = car;
        }
    
        @Override
        public String toString() {
            return "Person [name=" + name + ", age=" + age + ", car=" + car + "]";
        }
    
    }
    
    /**
     * 小汽车类
     * @author nnngu
     *
     */
    class Car implements Serializable {
        private static final long serialVersionUID = -5713945027627603702L;
    
        private String brand;       // 品牌
        private int maxSpeed;       // 最高时速
    
        public Car(String brand, int maxSpeed) {
            this.brand = brand;
            this.maxSpeed = maxSpeed;
        }
    
        public String getBrand() {
            return brand;
        }
    
        public void setBrand(String brand) {
            this.brand = brand;
        }
    
        public int getMaxSpeed() {
            return maxSpeed;
        }
    
        public void setMaxSpeed(int maxSpeed) {
            this.maxSpeed = maxSpeed;
        }
    
        @Override
        public String toString() {
            return "Car [brand=" + brand + ", maxSpeed=" + maxSpeed + "]";
        }
    
    }
    class CloneTest {
    
        public static void main(String[] args) {
            try {
                Person p1 = new Person("郭靖", 33, new Car("Benz", 300));
                Person p2 = MyUtil.clone(p1);   // 深度克隆
                p2.getCar().setBrand("BYD");
                // 修改克隆的Person对象p2关联的汽车对象的品牌属性
                // 原来的Person对象p1关联的汽车不会受到任何影响
                // 因为在克隆Person对象时其关联的汽车对象也被克隆了
                System.out.println(p1);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    注意:基于序列化和反序列化实现的克隆不仅仅是深度克隆,更重要的是通过泛型限定,可以检查出要克隆的对象是否支持序列化,这项检查是编译器完成的,不是在运行时抛出异常,这种是方案明显优于使用Object类的clone方法克隆对象。让问题在编译的时候暴露出来总是好过把问题留到运行时。

    63. 深拷贝和浅拷贝区别是什么?

    • 浅拷贝只是复制了对象的引用地址,两个对象指向同一个内存地址,所以修改其中任意的值,另一个值都会随之变化,这就是浅拷贝(例:assign())
    • 深拷贝是将对象及值复制过来,两个对象修改其中任意的值另一个值不会改变,这就是深拷贝(例:JSON.parse()和JSON.stringify(),但是此方法无法复制函数类型)

    六、Java Web

    64. jsp 和 servlet 有什么区别?

    1. jsp经编译后就变成了Servlet.(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类)
    2. jsp更擅长表现于页面显示,servlet更擅长于逻辑控制。
    3. Servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到。
    4. Jsp是Servlet的一种简化,使用Jsp只需要完成程序员需要输出到客户端的内容,Jsp中的Java脚本如何镶嵌到一个类中,由Jsp容器完成。而Servlet则是个完整的Java类,这个类的Service方法用于生成对客户端的响应。

    65. jsp 有哪些内置对象?作用分别是什么?

    JSP有9个内置对象:

    • request:封装客户端的请求,其中包含来自GET或POST请求的参数;
    • response:封装服务器对客户端的响应;
    • pageContext:通过该对象可以获取其他对象;
    • session:封装用户会话的对象;
    • application:封装服务器运行环境的对象;
    • out:输出服务器响应的输出流对象;
    • config:Web应用的配置对象;
    • page:JSP页面本身(相当于Java程序中的this);
    • exception:封装页面抛出异常的对象。

    66. 说一下 jsp 的 4 种作用域?

    JSP中的四种作用域包括page、request、session和application,具体来说:

    • page代表与一个页面相关的对象和属性。
    • request代表与Web客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个Web组件;需要在页面显示的临时数据可以置于此作用域。
    • session代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的session中。
    • application代表与整个Web应用程序相关的对象和属性,它实质上是跨越整个Web应用程序,包括多个页面、请求和会话的一个全局作用域。

    67. session 和 cookie 有什么区别?

    • 由于HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户,这个机制就是Session.典型的场景比如购物车,当你点击下单按钮时,由于HTTP协议无状态,所以并不知道是哪个用户操作的,所以服务端要为特定的用户创建了特定的Session,用用于标识这个用户,并且跟踪用户,这样才知道购物车里面有几本书。这个Session是保存在服务端的,有一个唯一标识。在服务端保存Session的方法很多,内存、数据库、文件都有。集群的时候也要考虑Session的转移,在大型的网站,一般会有专门的Session服务器集群,用来保存用户会话,这个时候 Session 信息都是放在内存的,使用一些缓存服务比如Memcached之类的来放 Session。
    • 思考一下服务端如何识别特定的客户?这个时候Cookie就登场了。每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端。实际上大多数的应用都是用 Cookie 来实现Session跟踪的,第一次创建Session的时候,服务端会在HTTP协议中告诉客户端,需要在 Cookie 里面记录一个Session ID,以后每次请求把这个会话ID发送到服务器,我就知道你是谁了。有人问,如果客户端的浏览器禁用了 Cookie 怎么办?一般这种情况下,会使用一种叫做URL重写的技术来进行会话跟踪,即每次HTTP交互,URL后面都会被附加上一个诸如 sid=xxxxx 这样的参数,服务端据此来识别用户。
    • Cookie其实还可以用在一些方便用户的场景下,设想你某次登陆过一个网站,下次登录的时候不想再次输入账号了,怎么办?这个信息可以写到Cookie里面,访问网站的时候,网站页面的脚本可以读取这个信息,就自动帮你把用户名给填了,能够方便一下用户。这也是Cookie名称的由来,给用户的一点甜头。所以,总结一下:Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。

    68. 说一下 session 的工作原理?

    其实session是一个存在服务器上的类似于一个散列表格的文件。里面存有我们需要的信息,在我们需要用的时候可以从里面取出来。类似于一个大号的map吧,里面的键存储的是用户的sessionid,用户向服务器发送请求的时候会带上这个sessionid。这时就可以从中取出对应的值了。

    69. 如果客户端禁止 cookie 能实现 session 还能用吗?

    Cookie与 Session,一般认为是两个独立的东西,Session采用的是在服务器端保持状态的方案,而Cookie采用的是在客户端保持状态的方案。但为什么禁用Cookie就不能得到Session呢?因为Session是用Session ID来确定当前对话所对应的服务器Session,而Session ID是通过Cookie来传递的,禁用Cookie相当于失去了Session ID,也就得不到Session了。

    假定用户关闭Cookie的情况下使用Session,其实现途径有以下几种:

    1. 设置php.ini配置文件中的“session.use_trans_sid = 1”,或者编译时打开打开了“--enable-trans-sid”选项,让PHP自动跨页传递Session ID。
    2. 手动通过URL传值、隐藏表单传递Session ID。
    3. 用文件、数据库等形式保存Session ID,在跨页过程中手动调用。

    70. spring mvc 和 struts 的区别是什么?

    • 拦截机制的不同

    Struts2是类级别的拦截,每次请求就会创建一个Action,和Spring整合时Struts2的ActionBean注入作用域是原型模式prototype,然后通过setter,getter吧request数据注入到属性。Struts2中,一个Action对应一个request,response上下文,在接收参数时,可以通过属性接收,这说明属性参数是让多个方法共享的。Struts2中Action的一个方法可以对应一个url,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了,只能设计为多例。

    SpringMVC是方法级别的拦截,一个方法对应一个Request上下文,所以方法直接基本上是独立的,独享request,response数据。而每个方法同时又何一个url对应,参数的传递是直接注入到方法中的,是方法所独有的。处理结果通过ModeMap返回给框架。在Spring整合时,SpringMVC的Controller Bean默认单例模式Singleton,所以默认对所有的请求,只会创建一个Controller,有应为没有共享的属性,所以是线程安全的,如果要改变默认的作用域,需要添加@Scope注解修改。

    Struts2有自己的拦截Interceptor机制,SpringMVC这是用的是独立的Aop方式,这样导致Struts2的配置文件量还是比SpringMVC大。

    • 底层框架的不同

    Struts2采用Filter(StrutsPrepareAndExecuteFilter)实现,SpringMVC(DispatcherServlet)则采用Servlet实现。Filter在容器启动之后即初始化;服务停止以后坠毁,晚于Servlet。Servlet在是在调用时初始化,先于Filter调用,服务停止后销毁。

    • 性能方面

    Struts2是类级别的拦截,每次请求对应实例一个新的Action,需要加载所有的属性值注入,SpringMVC实现了零配置,由于SpringMVC基于方法的拦截,有加载一次单例模式bean注入。所以,SpringMVC开发效率和性能高于Struts2。

    • 配置方面

    spring MVC和Spring是无缝的。从这个项目的管理和安全上也比Struts2高。

    71. 如何避免 sql 注入?

    1. PreparedStatement(简单又有效的方法)
    2. 使用正则表达式过滤传入的参数
    3. 字符串过滤
    4. JSP中调用该函数检查是否包函非法字符
    5. JSP页面判断代码

    72. 什么是 XSS 攻击,如何避免?

    XSS攻击又称CSS,全称Cross Site Script  (跨站脚本攻击),其原理是攻击者向有XSS漏洞的网站中输入恶意的 HTML 代码,当用户浏览该网站时,这段 HTML 代码会自动执行,从而达到攻击的目的。XSS 攻击类似于 SQL 注入攻击,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的,而在xss攻击中,通过插入恶意脚本,实现对用户游览器的控制,获取用户的一些信息。 XSS是 Web 程序中常见的漏洞,XSS 属于被动式且用于客户端的攻击方式。

    XSS防范的总体思路是:对输入(和URL参数)进行过滤,对输出进行编码。

    73. 什么是 CSRF 攻击,如何避免?

    CSRF(Cross-site request forgery)也被称为 one-click attack或者 session riding,中文全称是叫跨站请求伪造。一般来说,攻击者通过伪造用户的浏览器的请求,向访问一个用户自己曾经认证访问过的网站发送出去,使目标网站接收并误以为是用户的真实操作而去执行命令。常用于盗取账号、转账、发送虚假消息等。攻击者利用网站对请求的验证漏洞而实现这样的攻击行为,网站能够确认请求来源于用户的浏览器,却不能验证请求是否源于用户的真实意愿下的操作行为。

    如何避免:

    1. 验证 HTTP Referer 字段

    HTTP头中的Referer字段记录了该 HTTP 请求的来源地址。在通常情况下,访问一个安全受限页面的请求来自于同一个网站,而如果黑客要对其实施 CSRF
    攻击,他一般只能在他自己的网站构造请求。因此,可以通过验证Referer值来防御CSRF 攻击。

    2. 使用验证码

    关键操作页面加上验证码,后台收到请求后通过判断验证码可以防御CSRF。但这种方法对用户不太友好。

    3. 在请求地址中添加token并验证

    CSRF 攻击之所以能够成功,是因为黑客可以完全伪造用户的请求,该请求中所有的用户验证信息都是存在于cookie中,因此黑客可以在不知道这些验证信息的情况下直接利用用户自己的cookie 来通过安全验证。要抵御 CSRF,关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中。可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有token或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。这种方法要比检查 Referer 要安全一些,token 可以在用户登陆后产生并放于session之中,然后在每次请求时把token 从 session 中拿出,与请求中的 token 进行比对,但这种方法的难点在于如何把 token 以参数的形式加入请求。
    对于 GET 请求,token 将附在请求地址之后,这样 URL 就变成 http://url?csrftoken=tokenvalue。
    而对于 POST 请求来说,要在 form 的最后加上 <input type="hidden" name="csrftoken" value="tokenvalue"/>,这样就把token以参数的形式加入请求了。

    4. 在HTTP 头中自定义属性并验证

    这种方法也是使用 token 并进行验证,和上一种方法不同的是,这里并不是把 token 以参数的形式置于 HTTP 请求之中,而是把它放到 HTTP 头中自定义的属性里。通过 XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入其中。这样解决了上种方法在请求中加入 token 的不便,同时,通过 XMLHttpRequest 请求的地址不会被记录到浏览器的地址栏,也不用担心 token 会透过 Referer 泄露到其他网站中去。


    七、异常

    74. throw 和 throws 的区别?

    throws是用来声明一个方法可能抛出的所有异常信息,throws是将异常声明但是不处理,而是将异常往上传,谁调用我就交给谁处理。而throw则是指抛出的一个具体的异常类型。

    75. final、finally、finalize 有什么区别?

    • final可以修饰类、变量、方法,修饰类表示该类不能被继承、修饰方法表示该方法不能被重写、修饰变量表示该变量是一个常量不能被重新赋值。
    • finally一般作用在try-catch代码块中,在处理异常的时候,通常我们将一定要执行的代码方法finally代码块中,表示不管是否出现异常,该代码块都会执行,一般用来存放一些关闭资源的代码。
    • finalize是一个方法,属于Object类的一个方法,而Object类是所有类的父类,该方法一般由垃圾回收器来调用,当我们调用System的gc()方法的时候,由垃圾回收器调用finalize(),回收垃圾。 

    76. try-catch-finally 中哪个部分可以省略?

    答:catch 可以省略

    原因:

    更为严格的说法其实是:try只适合处理运行时异常,try+catch适合处理运行时异常+普通异常。也就是说,如果你只用try去处理普通异常却不加以catch处理,编译是通不过的,因为编译器硬性规定,普通异常如果选择捕获,则必须用catch显示声明以便进一步处理。而运行时异常在编译时没有如此规定,所以catch可以省略,你加上catch编译器也觉得无可厚非。

    理论上,编译器看任何代码都不顺眼,都觉得可能有潜在的问题,所以你即使对所有代码加上try,代码在运行期时也只不过是在正常运行的基础上加一层皮。但是你一旦对一段代码加上try,就等于显示地承诺编译器,对这段代码可能抛出的异常进行捕获而非向上抛出处理。如果是普通异常,编译器要求必须用catch捕获以便进一步处理;如果运行时异常,捕获然后丢弃并且+finally扫尾处理,或者加上catch捕获以便进一步处理。

    至于加上finally,则是在不管有没捕获异常,都要进行的“扫尾”处理。

    77. try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?

    答:会执行,在 return 前执行。

    代码示例1:

    
    /*
     * java面试题--如果catch里面有return语句,finally里面的代码还会执行吗?
     */
    public class FinallyDemo2 {
        public static void main(String[] args) {
            System.out.println(getInt());
        }
    
        public static int getInt() {
            int a = 10;
            try {
                System.out.println(a / 0);
                a = 20;
            } catch (ArithmeticException e) {
                a = 30;
                return a;
                /*
                 * return a 在程序执行到这一步的时候,这里不是return a 而是 return 30;这个返回路径就形成了
                 * 但是呢,它发现后面还有finally,所以继续执行finally的内容,a=40
                 * 再次回到以前的路径,继续走return 30,形成返回路径之后,这里的a就不是a变量了,而是常量30
                 */
            } finally {
                a = 40;
            }
    
    //      return a;
        }
    }

    执行结果:30

    代码示例2:

    
    package com.java_02;
    
    /*
     * java面试题--如果catch里面有return语句,finally里面的代码还会执行吗?
     */
    public class FinallyDemo2 {
        public static void main(String[] args) {
            System.out.println(getInt());
        }
    
        public static int getInt() {
            int a = 10;
            try {
                System.out.println(a / 0);
                a = 20;
            } catch (ArithmeticException e) {
                a = 30;
                return a;
                /*
                 * return a 在程序执行到这一步的时候,这里不是return a 而是 return 30;这个返回路径就形成了
                 * 但是呢,它发现后面还有finally,所以继续执行finally的内容,a=40
                 * 再次回到以前的路径,继续走return 30,形成返回路径之后,这里的a就不是a变量了,而是常量30
                 */
            } finally {
                a = 40;
                return a; //如果这样,就又重新形成了一条返回路径,由于只能通过1个return返回,所以这里直接返回40
            }
    
    //      return a;
        }
    }

    执行结果:40

    78. 常见的异常类有哪些?

    • NullPointerException:当应用程序试图访问空对象时,则抛出该异常。
    • SQLException:提供关于数据库访问错误或其他错误信息的异常。
    • IndexOutOfBoundsException:指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。 
    • NumberFormatException:当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。
    • FileNotFoundException:当试图打开指定路径名表示的文件失败时,抛出此异常。
    • IOException:当发生某种I/O异常时,抛出此异常。此类是失败或中断的I/O操作生成的异常的通用类。
    • ClassCastException:当试图将对象强制转换为不是实例的子类时,抛出该异常。
    • ArrayStoreException:试图将错误类型的对象存储到一个对象数组时抛出的异常。
    • IllegalArgumentException:抛出的异常表明向方法传递了一个不合法或不正确的参数。
    • ArithmeticException:当出现异常的运算条件时,抛出此异常。例如,一个整数“除以零”时,抛出此类的一个实例。 
    • NegativeArraySizeException:如果应用程序试图创建大小为负的数组,则抛出该异常。
    • NoSuchMethodException:无法找到某一特定方法时,抛出该异常。
    • SecurityException:由安全管理器抛出的异常,指示存在安全侵犯。
    • UnsupportedOperationException:当不支持请求的操作时,抛出该异常。
    • RuntimeExceptionRuntimeException:是那些可能在Java虚拟机正常运行期间抛出的异常的超类。

    八、网络

    79. http 响应码 301 和 302 代表的是什么?有什么区别?

    答:301,302 都是HTTP状态的编码,都代表着某个URL发生了转移。

    区别: 

    • 301 redirect: 301 代表永久性转移(Permanently Moved)。
    • 302 redirect: 302 代表暂时性转移(Temporarily Moved )。 

    80. forward 和 redirect 的区别?

    Forward和Redirect代表了两种请求转发方式:直接转发和间接转发。

    直接转发方式(Forward),客户端和浏览器只发出一次请求,Servlet、HTML、JSP或其它信息资源,由第二个信息资源响应该请求,在请求对象request中,保存的对象对于每个信息资源是共享的。

    间接转发方式(Redirect)实际是两次HTTP请求,服务器端在响应第一次请求的时候,让浏览器再向另外一个URL发出请求,从而达到转发的目的。

    举个通俗的例子:

    直接转发就相当于:“A找B借钱,B说没有,B去找C借,借到借不到都会把消息传递给A”;

    间接转发就相当于:"A找B借钱,B说没有,让A去找C借"。

    81. 简述 tcp 和 udp的区别?

    • TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接。
    • TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付。
    • Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。
    • UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。
    • 每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信。
    • TCP对系统资源要求较多,UDP对系统资源要求较少。

    82. tcp 为什么要三次握手,两次不行吗?为什么?

    为了实现可靠数据传输, TCP 协议的通信双方, 都必须维护一个序列号, 以标识发送出去的数据包中, 哪些是已经被对方收到的。 三次握手的过程即是通信双方相互告知序列号起始值, 并确认对方已经收到了序列号起始值的必经步骤。

    如果只是两次握手, 至多只有连接发起方的起始序列号能被确认, 另一方选择的序列号则得不到确认。

    83. 说一下 tcp 粘包是怎么产生的?

    ①. 发送方产生粘包

    采用TCP协议传输数据的客户端与服务器经常是保持一个长连接的状态(一次连接发一次数据不存在粘包),双方在连接不断开的情况下,可以一直传输数据;但当发送的数据包过于的小时,那么TCP协议默认的会启用Nagle算法,将这些较小的数据包进行合并发送(缓冲区数据发送是一个堆压的过程);这个合并过程就是在发送缓冲区中进行的,也就是说数据发送出来它已经是粘包的状态了。

    ②. 接收方产生粘包

    接收方采用TCP协议接收数据时的过程是这样的:数据到底接收方,从网络模型的下方传递至传输层,传输层的TCP协议处理是将其放置接收缓冲区,然后由应用层来主动获取(C语言用recv、read等函数);这时会出现一个问题,就是我们在程序中调用的读取数据函数不能及时的把缓冲区中的数据拿出来,而下一个数据又到来并有一部分放入的缓冲区末尾,等我们读取数据时就是一个粘包。(放数据的速度 > 应用层拿数据速度) 

    84. OSI 的七层模型都有哪些?

    1. 应用层:网络服务与最终用户的一个接口。
    2. 表示层:数据的表示、安全、压缩。
    3. 会话层:建立、管理、终止会话。
    4. 传输层:定义传输数据的协议端口号,以及流控和差错校验。
    5. 网络层:进行逻辑地址寻址,实现不同网络之间的路径选择。
    6. 数据链路层:建立逻辑连接、进行硬件地址寻址、差错校验等功能。
    7. 物理层:建立、维护、断开物理连接。

    85. get 和 post 请求有哪些区别?

    • GET在浏览器回退时是无害的,而POST会再次提交请求。
    • GET产生的URL地址可以被Bookmark,而POST不可以。
    • GET请求会被浏览器主动cache,而POST不会,除非手动设置。
    • GET请求只能进行url编码,而POST支持多种编码方式。
    • GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
    • GET请求在URL中传送的参数是有长度限制的,而POST么有。
    • 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
    • GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
    • GET参数通过URL传递,POST放在Request body中。

    86. 如何实现跨域?

    方式一:图片ping或script标签跨域

    图片ping常用于跟踪用户点击页面或动态广告曝光次数。 
    script标签可以得到从其他来源数据,这也是JSONP依赖的根据。 

    方式二:JSONP跨域

    JSONP(JSON with Padding)是数据格式JSON的一种“使用模式”,可以让网页从别的网域要数据。根据 XmlHttpRequest 对象受到同源策略的影响,而利用 <script>元素的这个开放策略,网页可以得到从其他来源动态产生的JSON数据,而这种使用模式就是所谓的 JSONP。用JSONP抓到的数据并不是JSON,而是任意的JavaScript,用 JavaScript解释器运行而不是用JSON解析器解析。所有,通过Chrome查看所有JSONP发送的Get请求都是js类型,而非XHR。 

    缺点:

    • 只能使用Get请求
    • 不能注册success、error等事件监听函数,不能很容易的确定JSONP请求是否失败
    • JSONP是从其他域中加载代码执行,容易受到跨站请求伪造的攻击,其安全性无法确保

    方式三:CORS

    Cross-Origin Resource Sharing(CORS)跨域资源共享是一份浏览器技术的规范,提供了 Web 服务从不同域传来沙盒脚本的方法,以避开浏览器的同源策略,确保安全的跨域数据传输。现代浏览器使用CORS在API容器如XMLHttpRequest来减少HTTP请求的风险来源。与 JSONP 不同,CORS 除了 GET 要求方法以外也支持其他的 HTTP 要求。服务器一般需要增加如下响应头的一种或几种:

    Access-Control-Allow-Origin: *
    Access-Control-Allow-Methods: POST, GET, OPTIONS
    Access-Control-Allow-Headers: X-PINGOTHER, Content-Type
    Access-Control-Max-Age: 86400

    跨域请求默认不会携带Cookie信息,如果需要携带,请配置下述参数:

    "Access-Control-Allow-Credentials": true
    // Ajax设置
    "withCredentials": true

    方式四:window.name+iframe

    window.name通过在iframe(一般动态创建i)中加载跨域HTML文件来起作用。然后,HTML文件将传递给请求者的字符串内容赋值给window.name。然后,请求者可以检索window.name值作为响应。

    • iframe标签的跨域能力;
    • window.name属性值在文档刷新后依旧存在的能力(且最大允许2M左右)。

    每个iframe都有包裹它的window,而这个window是top window的子窗口。contentWindow属性返回<iframe>元素的Window对象。你可以使用这个Window对象来访问iframe的文档及其内部DOM。

    <!-- 
     下述用端口 
     10000表示:domainA
     10001表示:domainB
    -->
    
    <!-- localhost:10000 -->
    <script>
      var iframe = document.createElement('iframe');
      iframe.style.display = 'none'; // 隐藏
    
      var state = 0; // 防止页面无限刷新
      iframe.onload = function() {
          if(state === 1) {
              console.log(JSON.parse(iframe.contentWindow.name));
              // 清除创建的iframe
              iframe.contentWindow.document.write('');
              iframe.contentWindow.close();
              document.body.removeChild(iframe);
          } else if(state === 0) {
              state = 1;
              // 加载完成,指向当前域,防止错误(proxy.html为空白页面)
              // Blocked a frame with origin "http://localhost:10000" from accessing a cross-origin frame.
              iframe.contentWindow.location = 'http://localhost:10000/proxy.html';
          }
      };
    
      iframe.src = 'http://localhost:10001';
      document.body.appendChild(iframe);
    </script>
    
    <!-- localhost:10001 -->
    <!DOCTYPE html>
    ...
    <script>
      window.name = JSON.stringify({a: 1, b: 2});
    </script>
    </html>
    

    方式五:window.postMessage()

    HTML5新特性,可以用来向其他所有的 window 对象发送消息。需要注意的是我们必须要保证所有的脚本执行完才发送 MessageEvent,如果在函数执行的过程中调用了它,就会让后面的函数超时无法执行。

    下述代码实现了跨域存储localStorage

    <!-- 
     下述用端口 
     10000表示:domainA
     10001表示:domainB
    -->
    
    <!-- localhost:10000 -->
    <iframe src="http://localhost:10001/msg.html" name="myPostMessage" style="display:none;">
    </iframe>
    
    <script>
      function main() {
          LSsetItem('test', 'Test: ' + new Date());
          LSgetItem('test', function(value) {
              console.log('value: ' + value);
          });
          LSremoveItem('test');
      }
    
      var callbacks = {};
      window.addEventListener('message', function(event) {
          if (event.source === frames['myPostMessage']) {
              console.log(event)
              var data = /^#localStorage#(\d+)(null)?#([\S\s]*)/.exec(event.data);
              if (data) {
                  if (callbacks[data[1]]) {
                      callbacks[data[1]](data[2] === 'null' ? null : data[3]);
                  }
                  delete callbacks[data[1]];
              }
          }
      }, false);
    
      var domain = '*';
      // 增加
      function LSsetItem(key, value) {
          var obj = {
              setItem: key,
              value: value
          };
          frames['myPostMessage'].postMessage(JSON.stringify(obj), domain);
      }
      // 获取
      function LSgetItem(key, callback) {
          var identifier = new Date().getTime();
          var obj = {
              identifier: identifier,
              getItem: key
          };
          callbacks[identifier] = callback;
          frames['myPostMessage'].postMessage(JSON.stringify(obj), domain);
      }
      // 删除
      function LSremoveItem(key) {
          var obj = {
              removeItem: key
          };
          frames['myPostMessage'].postMessage(JSON.stringify(obj), domain);
      }
    </script>
    
    <!-- localhost:10001 -->
    <script>
      window.addEventListener('message', function(event) {
        console.log('Receiver debugging', event);
        if (event.origin == 'http://localhost:10000') {
          var data = JSON.parse(event.data);
          if ('setItem' in data) {
            localStorage.setItem(data.setItem, data.value);
          } else if ('getItem' in data) {
            var gotItem = localStorage.getItem(data.getItem);
            event.source.postMessage(
              '#localStorage#' + data.identifier +
              (gotItem === null ? 'null#' : '#' + gotItem),
              event.origin
            );
          } else if ('removeItem' in data) {
            localStorage.removeItem(data.removeItem);
          }
        }
      }, false);
    </script>

    注意Safari一下,会报错:

    Blocked a frame with origin “http://localhost:10001” from accessing a frame with origin “http://localhost:10000“. Protocols, domains, and ports must match.

    避免该错误,可以在Safari浏览器中勾选开发菜单==>停用跨域限制。或者只能使用服务器端转存的方式实现,因为Safari浏览器默认只支持CORS跨域请求。

    方式六:修改document.domain跨子域

    前提条件:这两个域名必须属于同一个基础域名!而且所用的协议,端口都要一致,否则无法利用document.domain进行跨域,所以只能跨子域

    在根域范围内,允许把domain属性的值设置为它的上一级域。例如,在”aaa.xxx.com”域内,可以把domain设置为 “xxx.com” 但不能设置为 “xxx.org” 或者”com”。

    现在存在两个域名aaa.xxx.com和bbb.xxx.com。在aaa下嵌入bbb的页面,由于其document.name不一致,无法在aaa下操作bbb的js。可以在aaa和bbb下通过js将document.name = 'xxx.com';设置一致,来达到互相访问的作用。

    方式七:WebSocket

    WebSocket protocol 是HTML5一种新的协议。它实现了浏览器与服务器全双工通信,同时允许跨域通讯,是server push技术的一种很棒的实现。相关文章,请查看:WebSocket、WebSocket-SockJS

    需要注意:WebSocket对象不支持DOM 2级事件侦听器,必须使用DOM 0级语法分别定义各个事件。

    方式八:代理

    同源策略是针对浏览器端进行的限制,可以通过服务器端来解决该问题

    DomainA客户端(浏览器) ==> DomainA服务器 ==> DomainB服务器 ==> DomainA客户端(浏览器)

    来源:blog.csdn.net/ligang2585116/article/details/73072868

    87.说一下 JSONP 实现原理?

    jsonp 即 json+padding,动态创建script标签,利用script标签的src属性可以获取任何域下的js脚本,通过这个特性(也可以说漏洞),服务器端不在返货json格式,而是返回一段调用某个函数的js代码,在src中进行了调用,这样实现了跨域。


    九、设计模式

    88. 说一下你熟悉的设计模式?

    参考:常用的设计模式汇总,超详细!

    89. 简单工厂和抽象工厂有什么区别?

    简单工厂模式

    这个模式本身很简单而且使用在业务较简单的情况下。一般用于小项目或者具体产品很少扩展的情况(这样工厂类才不用经常更改)。

    它由三种角色组成:

    • 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑,根据逻辑不同,产生具体的工厂产品。如例子中的Driver类。
    • 抽象产品角色:它一般是具体产品继承的父类或者实现的接口。由接口或者抽象类来实现。如例中的Car接口。
    • 具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现,如例子中的Benz、Bmw类。

    来用类图来清晰的表示下的它们之间的关系:

    抽象工厂模式:

    先来认识下什么是产品族: 位于不同产品等级结构中,功能相关联的产品组成的家族。

    图中的BmwCar和BenzCar就是两个产品树(产品层次结构);而如图所示的BenzSportsCar和BmwSportsCar就是一个产品族。他们都可以放到跑车家族中,因此功能有所关联。同理BmwBussinessCar和BenzBusinessCar也是一个产品族。

    可以这么说,它和工厂方法模式的区别就在于需要创建对象的复杂程度上。而且抽象工厂模式是三个里面最为抽象、最具一般性的。抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象。

    而且使用抽象工厂模式还要满足一下条件:

    1. 系统中有多个产品族,而系统一次只可能消费其中一族产品
    2. 同属于同一个产品族的产品以其使用。

    来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):

    • 抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
    • 具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。
    • 抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
    • 具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。

    十、Spring / Spring MVC

    90. 为什么要使用 spring?

    1.简介

    • 目的:解决企业应用开发的复杂性
    • 功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
    • 范围:任何Java应用

    简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

    2.轻量 

    从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。

    3.控制反转  

    Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。

    4.面向切面  

    Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。

    5.容器

    Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。

    6.框架

    Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。

    所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础支持。

    91. 解释一下什么是 aop?

    AOP(Aspect-Oriented Programming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。对于其他类型的代码,如安全性、异常处理和透明的持续性也是如此。这种散布在各处的无关的代码被称为横切(cross-cutting)代码,在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。

    而AOP技术则恰恰相反,它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。AOP代表的是一个横向的关系,如果说“对象”是一个空心的圆柱体,其中封装的是对象的属性和行为;那么面向方面编程的方法,就仿佛一把利刃,将这些空心圆柱体剖开,以获得其内部的消息。而剖开的切面,也就是所谓的“方面”了。然后它又以巧夺天功的妙手将这些剖开的切面复原,不留痕迹。

    使用“横切”技术,AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处都基本相似。比如权限认证、日志、事务处理。Aop 的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。正如Avanade公司的高级方案构架师Adam Magee所说,AOP的核心思想就是“将应用程序中的商业逻辑同对其提供支持的通用服务进行分离。”

    92. 解释一下什么是 ioc?

    IOC是Inversion of Control的缩写,多数书籍翻译成“控制反转”。

    1996年,Michael Mattson在一篇有关探讨面向对象框架的文章中,首先提出了IOC 这个概念。对于面向对象设计及编程的基本思想,前面我们已经讲了很多了,不再赘述,简单来说就是把复杂系统分解成相互合作的对象,这些对象类通过封装以后,内部实现对外部是透明的,从而降低了解决问题的复杂度,而且可以灵活地被重用和扩展。

    IOC理论提出的观点大体是这样的:借助于“第三方”实现具有依赖关系的对象之间的解耦。如下图:

    大家看到了吧,由于引进了中间位置的“第三方”,也就是IOC容器,使得A、B、C、D这4个对象没有了耦合关系,齿轮之间的传动全部依靠“第三方”了,全部对象的控制权全部上缴给“第三方”IOC容器,所以,IOC容器成了整个系统的关键核心,它起到了一种类似“粘合剂”的作用,把系统中的所有对象粘合在一起发挥作用,如果没有这个“粘合剂”,对象与对象之间会彼此失去联系,这就是有人把IOC容器比喻成“粘合剂”的由来。

    我们再来做个试验:把上图中间的IOC容器拿掉,然后再来看看这套系统:

    我们现在看到的画面,就是我们要实现整个系统所需要完成的全部内容。这时候,A、B、C、D这4个对象之间已经没有了耦合关系,彼此毫无联系,这样的话,当你在实现A的时候,根本无须再去考虑B、C和D了,对象之间的依赖关系已经降低到了最低程度。所以,如果真能实现IOC容器,对于系统开发而言,这将是一件多么美好的事情,参与开发的每一成员只要实现自己的类就可以了,跟别人没有任何关系!

    我们再来看看,控制反转(IOC)到底为什么要起这么个名字?我们来对比一下:

    软件系统在没有引入IOC容器之前,如图1所示,对象A依赖于对象B,那么对象A在初始化或者运行到某一点的时候,自己必须主动去创建对象B或者使用已经创建的对象B。无论是创建还是使用对象B,控制权都在自己手上。

    软件系统在引入IOC容器之后,这种情形就完全改变了,如图3所示,由于IOC容器的加入,对象A与对象B之间失去了直接联系,所以,当对象A运行到需要对象B的时候,IOC容器会主动创建一个对象B注入到对象A需要的地方。

    通过前后的对比,我们不难看出来:对象A获得依赖对象B的过程,由主动行为变为了被动行为,控制权颠倒过来了,这就是“控制反转”这个名称的由来。

    93. spring 有哪些主要模块?

    Spring框架至今已集成了20多个模块。这些模块主要被分如下图所示的核心容器、数据访问/集成,、Web、AOP(面向切面编程)、工具、消息和测试模块。

    更多信息:howtodoinjava.com/java-spring-framework-tutorials/

    94. spring 常用的注入方式有哪些?

    Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入方式主要有三种:

    1. 构造方法注入
    2. setter注入
    3. 基于注解的注入

    95. spring 中的 bean 是线程安全的吗?

    Spring容器中的Bean是否线程安全,容器本身并没有提供Bean的线程安全策略,因此可以说spring容器中的Bean本身不具备线程安全的特性,但是具体还是要结合具体scope的Bean去研究。

    96. spring 支持几种 bean 的作用域?

    当通过spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域。Spring支持如下5种作用域:

    • singleton:单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例
    • prototype:原型模式,每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例
    • request:对于每次HTTP请求,使用request定义的Bean都将产生一个新实例,即每次HTTP请求将会产生不同的Bean实例。只有在Web应用中使用Spring时,该作用域才有效
    • session:对于每次HTTP Session,使用session定义的Bean豆浆产生一个新实例。同样只有在Web应用中使用Spring时,该作用域才有效
    • globalsession:每个全局的HTTP Session,使用session定义的Bean都将产生一个新实例。典型情况下,仅在使用portlet context的时候有效。同样只有在Web应用中使用Spring时,该作用域才有效

    其中比较常用的是singleton和prototype两种作用域。对于singleton作用域的Bean,每次请求该Bean都将获得相同的实例。容器负责跟踪Bean实例的状态,负责维护Bean实例的生命周期行为;如果一个Bean被设置成prototype作用域,程序每次请求该id的Bean,Spring都会新建一个Bean实例,然后返回给程序。在这种情况下,Spring容器仅仅使用new 关键字创建Bean实例,一旦创建成功,容器不在跟踪实例,也不会维护Bean实例的状态。

    如果不指定Bean的作用域,Spring默认使用singleton作用域。Java在创建Java实例时,需要进行内存申请;销毁实例时,需要完成垃圾回收,这些工作都会导致系统开销的增加。因此,prototype作用域Bean的创建、销毁代价比较大。而singleton作用域的Bean实例一旦创建成功,可以重复使用。因此,除非必要,否则尽量避免将Bean被设置成prototype作用域。

    97. spring 自动装配 bean 有哪些方式?

    Spring容器负责创建应用程序中的bean同时通过ID来协调这些对象之间的关系。作为开发人员,我们需要告诉Spring要创建哪些bean并且如何将其装配到一起。

    spring中bean装配有两种方式:

    • 隐式的bean发现机制和自动装配
    • 在java代码或者XML中进行显示配置

    当然这些方式也可以配合使用。

    98. spring 事务实现方式有哪些?

    1. 编程式事务管理对基于 POJO 的应用来说是唯一选择。我们需要在代码中调用beginTransaction()、commit()、rollback()等事务管理相关的方法,这就是编程式事务管理。
    2. 基于 TransactionProxyFactoryBean 的声明式事务管理
    3. 基于 @Transactional 的声明式事务管理
    4. 基于 Aspectj AOP 配置事务

    99. 说一下 spring 的事务隔离?

    事务隔离级别指的是一个事务对数据的修改与另一个并行的事务的隔离程度,当多个事务同时访问相同数据时,如果没有采取必要的隔离机制,就可能发生以下问题:

    • 脏读:一个事务读到另一个事务未提交的更新数据。
    • 幻读:例如第一个事务对一个表中的数据进行了修改,比如这种修改涉及到表中的“全部数据行”。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入“一行新数据”。那么,以后就会发生操作第一个事务的用户发现表中还存在没有修改的数据行,就好象发生了幻觉一样。
    • 不可重复读:比方说在同一个事务中先后执行两条一模一样的select语句,期间在此次事务中没有执行过任何DDL语句,但先后得到的结果不一致,这就是不可重复读。

    100. 说一下 spring mvc 运行流程?

    Spring MVC运行流程图:

    Spring运行流程描述:

    1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;

    2. DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;

    3. DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter;(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法)

    4.  提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:

    • HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
    • 数据转换:对请求消息进行数据转换。如String转换成Integer、Double等
    • 数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
    • 数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中

    5.  Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;

    6.  根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;

    7. ViewResolver 结合Model和View,来渲染视图;

    8. 将渲染结果返回给客户端。

    101. spring mvc 有哪些组件?

    Spring MVC的核心组件:

    1. DispatcherServlet:中央控制器,把请求给转发到具体的控制类
    2. Controller:具体处理请求的控制器
    3. HandlerMapping:映射处理器,负责映射中央处理器转发给controller时的映射策略
    4. ModelAndView:服务层返回的数据和视图层的封装类
    5. ViewResolver:视图解析器,解析具体的视图
    6. Interceptors :拦截器,负责拦截我们定义的请求然后做处理工作

    102. @RequestMapping 的作用是什么?

    RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

    RequestMapping注解有六个属性,下面我们把她分成三类进行说明。

    value, method:

    • value:指定请求的实际地址,指定的地址可以是URI Template 模式(后面将会说明);
    • method:指定请求的method类型, GET、POST、PUT、DELETE等;

    consumes,produces

    • consumes:指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
    • produces:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;

    params,headers

    • params: 指定request中必须包含某些参数值是,才让该方法处理。
    • headers:指定request中必须包含某些指定的header值,才能让该方法处理请求。

    103. @Autowired 的作用是什么?

    《@Autowired用法详解》


    未完待续......


    欢迎大家关注我的公众号:Java团长,后续面试题更新之后可以在第一时间获取~

    展开全文
  • 该工具将按日期和内容搜索 .odt 文件。 OD-什么? .odt 文件是一种特殊的文件,许多文字处理器程序可以保存为 .odt 文件格式。 为什么是 .odt 而不是 .doc 或 .txt? Search-ODT 是应要求开发的,作为独立学习课程...
  • 测试开发笔记

    万次阅读 多人点赞 2019-11-14 17:11:58
    1、发布一个下载地址 2、用户进行软件下载并使用 回归测试: 回归测试可以发生在任何一个阶段 分为完全回归选择回归 回归范围 回归分类 特点 优点 缺点 适用范围 完全回归 完全重复法 每次回归测试都要执行全部...

    测试开发笔记

    第一章 测试基础
    1.什么是软件测试
    2.软件测试的目的、意义(怎么做好软件测试)
    3.软件生命周期
    第二章 测试过程
    1.测试模型
    H模型
    V模型
    2.内部测试
    3外部测试
    验收测试(在系统测试之后)
    回归测试
    4.测试过程(干什么,怎么干)
    5.各阶段输入、输出标准以及入口、出口准则:(测试阶段过程要素)
    第三章 测试方法
    1.测试方法对比
    2.测试方法组合
    第四章 软件质量
    1.什么是软件质量
    2.质量要素
    3. 6大特性27个子特性ISO国际标准组织CMM/CMMI(Capability maturity model)能力程度度模型
    4.CMMI把企业分为5个等级
    5. CMM与CMMI的区别
    第五章 SQL
    约束
    1主键约束
    2 非空约束 not null
    3 外键约束 FOREIGN KEY
    4 默认约束
    5 检查约束 check
    6 唯一约束 unique
    SQL语句
    创建数据库.
    表、字段、类型
    查询
    批量处理
    视图/虚表 view
    索引
    存储过程 procedure
    事务 transaction
    触发器 trigger
    练习
    一、单表查询练习
    二、聚合函数练习
    三、分组查询练习
    四、嵌套查询练习
    五、联接查询练习
    六、外联接查询
    七、补充提高
    第六章 C语言
    C语言中的存储
    数据类型
    常量
    结构体
    条件/分支逻辑
    Switch
    If
    循环
    For
    while
    do…while
    函数
    第七章 Windows环境搭建
    一、名词注解与定义:
    C/S
    B/S
    进销存系统
    OA系统
    第八章 需求管理
    1.什么是需求
    2. 需求工程在做什么
    3. ★需求变更
    4.★需求的跟踪
    需求跟踪矩阵的作用
    需求的特点
    需求工程
    变更控制流程图
    第九章 缺陷管理
    缺陷相关概念
    缺陷管理相关概念
    BUG管理基本流程
    BUG单
    第十章 测试需求分析
    概念
    ★如何做测试需求分析
    ★UML统一建模语言(Unified Modeling Language)
    第十一章 配置管理
    1.什么是配置管理
    2.配置管理流程
    配置管理工具
    SVN操作过程手册
    一、 如何创建“project”项目版本库
    二、 如何查看创建的“project”项目版本库
    三、 在版本浏览器里面,创建文件,并进行检出
    四、 如何对该项目入基线
    五、 分支文件进行合并
    六、 分支冲突的解决
    第十二章 系统测试
    概念:
    分类:
    功能测试(Function testing中国 Feature testing国际)
    性能测试(Sercarity testing)
    安全性测试(Security Testing)
    安装测试
    GUI测试(Graphical user interface)
    可用性测试(Usability testing)
    异常性测试
    文档测试
    备份测试
    配置测试
    网络测试
    第十三章 用例设计
    等价类
    练习
    1.1年龄注册
    1.2.年龄注册
    1.3.扩充
    边界值
    2.1.年龄
    2.2.用户名注册
    2.3.变量命名
    2.4.进销存价格
    2.5.Windows文件命名
    总结
    边界值
    第十四章 系统测试执行
    测试环境搭建文档
    用例执行
    填BUG报告
    第十五章 QC(Quality Center)
    QC后台:
    QC前台:
    Requirements 需求模块
    Test Plan 测试用例模块
    Test Lab 测试执行模块
    第十六章 PYTHON
    Python的安装
    Python的集成环境
    数据类型
    运算符
    缩进
    控制语句
    IF条件
    WHILE循环
    FOR循环
    BREAK \ CONTINUE
    函数
    定义
    调用
    第十七章 单元测试
    单元测试概念
    单元测试静态测试
    单元测试动态测试
    测试评价准则
    逻辑覆盖率
    单元测试策略
    ⑴ 孤立测试
    ⑵自顶向下的单元测试策略
    ⑶自底向上的单元测试方法
    单元测试用例设计(基本路径覆盖法)
    程序控制流图
    单元测试执行
    单元测试框架
    第十八章 集成测试
    第一阶段总结
    Test platform
    Bug的其他说法
    第二阶段项目笔记
    一.建立项目JXC
    二.布置JXC
    三.配置SVN
    四.访问SVN
    进销存项目
    进销存项目总结
    测试需求分析
    1、定义测试范围
    2、建立需求项
    3、细化需求项
    4、需求覆盖率分析
    判定表
    3.1.读书选择
    3.2.Counter
    3.3:word中的判定表举例
    3.4.合并判定表
    3.4.密码修改
    3.5.进销存
    3.6.总结
    因果图
    4.1.字母判定
    4.2.自动售货机
    状态迁移
    5.1.飞机售票系统
    5.2.缺陷跟踪
    流程分析
    6.1.处理流程
    6.2.系统登录
    6.3.字母判断
    6.4.组合查询
    正交试验
    7.1.环境搭建
    7.2.Counter
    7.3.组合
    7.4.环境搭建
    其他
    输入域
    输出域
    异常分析
    错误猜测

    第一阶段
    第一章 测试基础
    1.什么是软件测试:
    两个依据(需求、测试用例),两个方法(手工、自动),一个对比(预期结果和实际结果的对比)
    2.软件测试的目的、意义:(怎么做好软件测试)
    初期: 尽量多的发现缺陷生成相关规范
    中期: 尽量早的发现缺陷
    后期: 尽量预防问题:通过以往的经验积累
    控制成本(贯穿始终)尽量少的时间和人力发现更多的缺陷
    3.软件生命周期:软件的产生直到报废或停止使用的生命周期。软件生命周期内有问题定义、可行性分析、总体描述、系统设计、编码、调试和测试、验收与运行、维护升级到废弃等阶段,也有将以上阶段的活动组合在内的迭代阶段,即迭代作为生命周期的阶段。

    如何尽量多的发现缺陷?
    沟通
    在测试前期与开发沟通 确认测试重点 确认测试的优先级
    了解开发人员技术和业务背景 业务水平 技术水平 代码质量 人员流动性
    在测试结束后
    对已发现的bug进行统计 知道高发概率bug 在新项目中要进行重点测试
    针对代码 代码复杂度
    版本管理
    针对基础测试基础版本要进行充分的测试
    验收前的最后一个版本一定要进行完全重复测试
    测试方法
    黑盒方法 功能问题 无法保证所有的代码逻辑都被执行到 用白盒测试思想补充黑盒测试
    静态测试方法 文档评审 代码走查
    测试过程
    上一阶段为下个阶段提供重点指导
    用户参与的测试或用户反映回来的错误和问题为下次测试的或测试补充的必备内容

    第二章 测试过程
    1.测试模型
    H模型:

    H模型图
    优点:
    1 介入早 与开发并行 更早的发现问题
    2 测试过程独立于开发过程 更客观 更主动
    V模型

    双V模型图
    ㈠需求阶段
    产品经理,项目经理,产品工程师写《需求规格说明书》Software Reqwirment Specaficalion(SRS)
    内容:需求项(业务,主要功能)需求子项,对子项的详细描述
    测试的工作:对需求进行测试和评审A系统测试计划《系统测试计划书》B系统测试计划《系统测试方案书》C系统测试实现《系统测试用例》
    ㈡设计阶段
    开发经理,架构师,开发工程师写出《概要设计说明书》High-level design(HLD)
    内容:系统程序中的模块,子模块和他们之间的关系和接口
    测试的工作:对HLD进行测试和评审A集成测试计划《集成测试计划书》B集成测试设计《集成测试方案书》C集成测试实现《集成测试用例》
    ㈢详细设计阶段
    开发工程师,架构师,写出《详细设计说明书》Low-level desragn(LLD)
    内容:函数 代码 逻辑
    测试工作:对LLD进行测试和评审A单元测试计划《单元测试计划书》B单元测试设计《单元测试方案书》C《单元测试用例》
    ㈣编码阶段
    开发工程师写代码
    优点:介入早,提高测试质量; 分成三个阶段,发现问题更有针对性;测试与开发并行,更好的利用项目资源。
    缺点:项目成本高;技术要求高,对人员要求高;并行工作中,一方未完成就会对整个造成延误。
    适用范围:规模大、软件成熟度高的项目。
    2.内部测试
    测试阶段 测试对象 测试方法 测试目的 经济价值 优点 缺点 必要性 资源
    系统测试
    system testing(ST) 整个系统
    (整个产品) 黑盒测试 验证产品是否符合需求规格说明书 能够保证产品以较高的的质量尽早的上市销售,从而使公司获取利润 1简单
    2技术要求低 1测试介入时间晚,修改成本高
    2有一些问题可能被遗留不会被修改 必须保证 1对被测产品
    2需求规格说明书
    3系统测试工程师
    4需求开发人员
    集成测试
    integration testing(IT) 模块
    子模块
    接口 灰盒测试 验证模块、子模块、接口是否符合
    概要设计说明书 能够帮助更准确的 定位缺陷的所在,从而降低了定位缺陷的成本 定位准确快速 1接口测试有技术要求,技术实现难度大
    2接口太多,数量庞大,做所有接口的集成测试成本高 不是必须做的,
    必须做测试的
    1公共的主要模块
    2核心模块
    3和外界软件接口模块 1被测的产品
    2概要设计说明书
    3集成测试工程师
    4概要设计人员
    单元测试
    unit testing(UT) 函数
    代码
    逻辑 白盒测试 验证函数代码逻辑是否符合详细设计说明书 能够最早的开展测试工作,降低修复成本,防止缺钱被扩大化(注意:加以重视:1公共的模块2全局性的数据结构3重要的使用频率较高的功能4以往项目经常出错的严重问题5复杂度较高的模块6当开发人员业务不熟悉编码不熟练的模块要进行单元测试) 介入时间早,发现问题早,修改成本低。 1技术难度高
    2工作量太大 不是必须的 1开发环境
    2LLD
    3单元测试工程师
    4架构师(详细设计人员)
    3外部测试:
    使用验收测试的原因
    1内部测试只能模拟用户使用却不能代替用户使用
    2由于专业不同业务背景不同无法模拟用户使用的习惯
    3测试人员和用户对产品的理解可能不同
    验收测试:(在系统测试之后)
    α测试:由用户组织一部分人在开发环境下来对产品进行测试 如网游的内侧
    β测试:所有系统使用者都可以参加的测试(在实际使用环境下) 如网游的公测
    分类 测试过程 参与人员 目的 过程主要内容
    针对项目类软件 验收测试 开发人员:提供满足验收要求的软件或系统,或用户需要的相关开发文档
    测试人员:
    1、搭建验收测试环境
    2、准备验收测试用例
    3、准备用户需要的相关测试文档
    4、组织人员进行验收演示
    用户代表:对系统进行一定的试用
    客户代表:签字确认验收是否通过
    行业:负责在验收过程中提出问题并协助用户和客户检查系统是否满足需求 1、检查软件的功能是否与用户最初需求相一致
    2、是客户回款的标志 1、进行验收前准备
    A、准备相关的资料
    B、搭建验收测试环境
    C、指定相关的验收参与人
    2、进行验收演示
    A 、对产品使用进行演示
    B、回答专家、用户的提问
    3、签署验收报告
    针对产品类软件 α测试 开发人员:
    1、提供可以进行α测试的软件
    2、负责修改用户代表发现的问题
    测试人员:
    1、检查或协助用户填写缺陷报告
    2、向用户学习相关的使用关注点
    邀请的用户或客户代表(付费)
    1、按照自己的操作习惯使用软件,提出易用性等方面的问题和改进建议 明确用户的使用体验,提高产品的适用范围和使用质量标准 1、明确进行α测试的版本
    2、邀请潜在用户进行使用体验
    3、针对用户提出的问题进行修复或改进
    β测试 潜在用户:
    1、安装软件并使用
    客服人员:
    记录并反馈用户的问题 提前占领市场 1、发布一个下载地址
    2、用户进行软件下载并使用
    回归测试:
    回归测试可以发生在任何一个阶段
    分为完全回归和选择回归
    回归范围 回归分类 特点 优点 缺点 适用范围
    完全回归 完全重复法 每次回归测试都要执行全部测试用例 回归测试充分,覆盖面广,不容遗漏 工作量大,时间长,成本高 时间充裕且测试资源较充分时,第一次和最后一次做回归测试的时候用这种方法
    选择性回归 覆盖修改法 每次回归测试时只执行发现错误的用例 时间最短,成本最低,简单效率高 回归测试不充分,漏洞较多 时间较紧且人力资源不足时,中间版本的测试轮次可以使用,关联度比较小的模块和功能
    周边影响法 每次回归除了执行发现bug的用例外,还要执行与其相关的用例 在考虑了测试成本的基础上有效提高了回归测试的质量 效率 很难确定影响的周边范围,相关用例定位较困难 适合于全局数据结构被修改或公共模块被修改,或核心算法业务被修改时,公用的模块,关系、关联复杂的模块
    指标达成法 每次回归测试达到规定的语气指标
    就可以停止测试了 所有的测试都可度量 1指标生成需要很长的周期,
    很多的项目区累计经验
    2要有比较稳定的团队这个指标才有意义 成熟度较高的测试团队应用于指标达成法
    (适用度很低,很少有公司使用)

    分类 步骤 优点
    确定周边
    范围的方法 界面检查法 1明确被修改的功能 简单
    2修改功能的上下游功能
    3调用修改功能的功能和
    修改功能调用了的功能
    4和修改功能游相同输入输出的功能
    5在测试中执行上诉关联的用例
    代码检查法 1明确被修改的函数和代码 准确,全面
    2在整个系统中检查所有
    调用了修改函数的函数
    3明确上诉所有函数对应的界面
    4测试上诉界面测试用例
    4.测试过程(干什么,怎么干)
    整个系统的内容 需求项(业务、主要功能) 需求项 测试计划 测试需求项 系统测试阶段
    需求子项 测试方案 测试需求子项
    详细内容 测试用例 具体如何进行测试
    整个系统的集成 概要设计 概要设计项 测试计划 集成测试阶段
    概要设计子项 测试方案
    具体内容 测试用例
    整个系统最小单元 详细设计 函数 测试计划 单元测试
    逻辑 测试方案
    代码 测试用例

    5.各阶段输入、输出标准以及入口、出口准则:(测试阶段过程要素)
    系统测试 入口准则 输入文档 输出文档 出口准则
    系统测试计划 开发计划通过评审并入基线
    需求规格说明书通过评审并入基线 开发计划书
    需求规格说明书 系统测试计划书 系统测试计划书通过评审并入基线
    系统测试设计 系统测试计划书通过评审并入基线 需求规格说明书
    开发计划书
    系统测试计划书 系统测试方案书 系统测试方案书通过评审并入基线
    系统测试实现 系统测试方案书通过评审并入基线 需求规格说明书
    系统测试计划书
    系统测试方案书 系统测试用例
    预测试项 系统测试用例、预测试项通过评审并入基线
    系统测试执行 系统测试用例、预测试项通过评审并入基线
    集成测试报告通过评审并入基线 需求规格说明书
    系统测试计划书
    系统测试方案书
    系统测试用例
    预测试项 缺陷报告
    预测试项报告
    系统测试报告 系统测试报告、预测试项报告、缺陷报告通过评审并入基线
    集成测试 入口准则 输入文档 输出文档 出口准则
    集成测试计划 概要设计说明书通过评审并入基线 概要设计说明书 集成测试计划书 集成测试计划书通过评审并入基线
    集成测试设计 集成测试计划书通过评审并入基线 集成测试计划书
    概要设计说明书 集成测试方案书 集成测试方案书通过评审并入基线
    集成测试实现 集成测试方案书通过评审并入基线 集成测试计划书
    集成测试方案书
    概要设计说明书 集成测试用例 集成测试用例通过评审并入基线
    集成测试执行 集成测试用例通过评审并入基线
    单元测试报告通过评审并入基线 集成测试计划书
    集成测试方案书
    集成测试用例
    概要设计说明书 集成测试报告
    缺陷报告 集成测试报告、缺陷报告通过评审并入基线
    单元测试 入口准则 输入文档 输出文档 出口准则
    单元测试计划 详细设计说明书通过评审并入基线 详细设计说明书 单元测试计划 单元测试计划通过评审并入基线
    单元测试设计 单元测试计划通过评审并入基线 详细设计说明书
    单元测试计划书 单元测试方案书 单元测试方案书通过评审并入基线
    单元测试实现 单元测试方案书通过评审并入基线 详细设计说明书
    单元测试计划书
    单元测试方案书 单元测试用例 单元测试用例通过评审并入基线
    单元测试执行 单元测试用例通过评审并入基线 详细设计说明书
    单元测试计划书
    单元测试方案书
    单元测试用例 单元测试报告
    缺陷报告 单元测试报告、缺陷报告通过评审并入基线

    第三章 测试方法
    测试方法对比
    分类方法 测试方法名称 依据 测试对象 理论上的测试目的 实际工作中的测试目的 测试评估标准 测试环境 测试工作介入点 优点 缺点 适用范围
    按照不同的测试对象划分(黑白灰盒的区别) 黑盒 SRS 整个软件产品 检查软件的功能实现是否与SRS相一致 尽早进行验收,收回开发成本 需求覆盖率 尽量与用户环境相一致 只要功能可以进行操作 简单,测试效率高 1、无法保证所有的代码逻辑都被测试到
    2、后台相关的非界面处理可能会遗漏(文件、数据库)
    3、当前功能与其他功能有联系的部分可能也会被遗漏 适合进行功能、性能等使用和外部特性的测试适用范围广泛,适用所有可见功能
    白盒 LLD 代码逻辑函数 检查代码的逻辑实现是否与LLD相一致 尽早发现问题缺陷,降低缺陷修复成本.便于定位问题 逻辑覆盖率
    语句覆盖
    分支覆盖
    条件覆盖
    分支-条件覆盖
    路径覆盖 开发环境 只要独立的函数或类代码编写完成后 覆盖充分,可以覆盖到每行代码 技术较难
    效率较低
    成本较高 针对核心业务、复杂算法、公共模块、全局数据结构、新增功能
    灰盒 HLD 模块\子模块接口 检查接口实现是否与HLD相一致 逐步集成,降低缺陷定位成本 接口覆盖率 子系统集成尽可能和用户环境一致,模块内部接口以及模块间接口可以在开发环境下进行
    子系统间的接口最后要在与用户环境下测试 进行测试的接口模块已完成 可以提早定位和发现问题 技术最难
    成本最高 公共模块之间的调用,复杂度较高的模块调用、使用频率较高的模块调用

    特点 分类 优点 缺点 适用范围
    按照是否运行程序划分 静态 不执行程序 1、文档评审
    A、正规检视
    B、技术评审
    C、同行评审
    2、静态分析技术
    A、控制流分析
    可以发现以下缺陷
    1、死循环
    2、执行不到的语句
    3、不存在的语句
    B、数据流分析
    可以发现以下缺陷
    1、变量未定义被使用
    2、变量已定义未使用
    C、信息流分析
    可以帮助开发人员定位缺陷
    1、输入变量与语句的关系
    2、输出变量与语句的关系
    3、输入变量与输出变量的关系 较动态测试时间早,不用写代码 工作量大 重要的功能模块、核心的业务、算法
    公共模块
    动态 执行程序 黑和测试
    动态白盒:插装—在代码中加入print打印语句,检查程序的中间运行结果 复杂,效率高 测试较晚,写代码 所有功能

    优点 缺点 适用范围
    按照不同的测试手段划分 手工 能够主动的发现bug 重复工作量大,容易引入疲劳缺陷,只能依靠见到的界面 绝大多数的场合
    自动化 可以无限制不断重复,把人从劳动里解放出来,提高劳动效率,提高了测试质量,能发现人不能发现的错误 无法发现脚本中未写明的缺陷 GUI界面稳定
    回归阶段
    需求稳定且功能已实现时才进行脚本的编写
    性能测试工具:提取相关的系统数据,构造并发用户
    测试方法组合
    测试方法组合 典型案例 使用时机 特点
    黑盒
    黑盒静态手工      
    黑盒静态自动化      
    黑盒动态手工      
    黑盒动态自动化功能测试 Mercury的QTP:用于检测应用程序是否能够达到预期的功能及正常运行
    通过自动录制、检测和回放用户的应用操作 1、能够有效地帮助测试人员对复杂的企业级应用的不同发布版进行测试
    2、提高测试人员的工作效率和质量,确保跨平台的、复杂的企业级应用无故障发布及长期稳定运行
    IBM Rational Robot 是功能测试工具 它集成在测试人员的桌面 IBM Rational TestManager 上,在这里测试人员可以计划、组织、执行、管理和报告所有测试活动,包括手动测试报告。这种测试和管理的双重功能是自动化测试的理想开始。
    Borland SilkTest属于软件功能测试工具 是Borland公司所提出软件质量管理解决方案的套件之一。这个工具采用精灵设定与自动化执行测试,无论是程序设计新手或资深的专家都能快速建立功能测试,并分析功能错误。
    基于Java语言的功能和性能测试工具 JMeter是Apache组织的开放源代码项目 主要针对Java语言 它是功能和性能测试的工具,100%的用java实现
    黑盒动态自动化性能测试 Mercury的LoadRunner:是一种预测系统行为和性能的负载测试工具。 通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题 能够对整个企业架构进行测试。通过使用LoadRunner ,企业能最大限度地缩短测试时间,优化性能和加速应用系统的发布周期。
    Microsoft Web Application Stress Tool 是由微软的网站测试人员所开发,专门用来进行实际网站压力测试的一套工具。 功能强大的压力测试工具 您可以使用少量的Client端计算机仿真大量用户上线对网站服务所可能造成的影响
    webload是RadView公司推出的一个性能测试和分析工具 它让web应用程序开发者自动执行压力测试; webload通过模拟真实用户的操作,生成压力负载来测试web的性能。
    白盒
    白盒静态手工      
    白盒静态自动化   检查语法规范、语法逻辑  
    白盒动态手工 目前的最流行的单元测试工具是xUnit系列框架 常用的根据语言不同分为JUnit(java),CppUnit(C++),DUnit(Delphi ),NUnit(.net),PhpUnit(Php )等等。 该测试框架的第一个和最杰出的应用就是由Erich Gamma (《设计模式》的作者)和Kent Beck(XP(Extreme Programming)的创始人 )提供的开放源代码的JUnit。
    白盒动态自动化 Jtest是parasoft公司推出的一款针对java语言的自动化白盒测试工具,它通过自动实现java的单元测试和代码标准校验,来提高代码的可靠性。parasoft同时出品的还有C++ test,是一款C/C++白盒测试工具    
    灰盒
    灰盒静态手工      
    灰盒静态自动化      
    灰盒动态手工      
    灰盒动态自动化 BMC的APPSight 系统会将问题发生的相关信息完整录制下来,包括问题发生的现场场景、信息及分析等,从而快速切入到问题根源  
    测试管理工具 是业界第一个基于Web的测试管理系统,它可以在您公司内部或外部进行全球范围内测试的管理。通过在一个整体的应用系统中集成了测试管理的各个部分,包括需求管理,测试计划,测试执行以及错误跟踪等功能,TestDirector极大地加速了测试过程。

    1自动化测试就是用程序驱动程序的测试
    2黑白灰测试的区别
    测试的对象不一样,对于代码实现逻辑程度不一样(黑盒不需要了解代码实现,白盒需要完全了解代码实现,灰盒需要部分了解代码实现)
    3静态与动态测试的区别
    被测程序执行与否 静态不执行程序包括文档评审静态分析技术代码走读,动态包括黑盒测试和动态分析技术
    4自动化合手工测试的不同
    测试手段不同

    第四章 软件质量
    1.什么是软件质量
    质量:确定一个实体的特性满足需求的程度
    内部质量:软件研发过程中,评价的软件质量
    外部质量:软件上市后,用户评价的质量
    过程质量:评价软件研发中每个过程的质量
    软件质量的三个层次
    ⑴流程质量,领导关注 ⑵产品质量 测试工程师关注 ⑶使用质量 用户关注
    2.质量要素
    质量铁三角 : 技术 过程 组织
    3. 6大特性27个子特性ISO国际标准组织CMM/CMMI(Capability maturity model)能力程度度模型

    质量模型列表
    质量模型特性 子特性 特点 常见测试点 案例说明
    功能性 适合性 合适的功能(用户提出要有哪些功能)功能的必要性 验证功能是否满足需求的要求,检测做没做 打电话、听音乐、发信息
    准确性 正确的功能 需求文档中的预期动作和预期输出,做对没有 信息的发送内容是否正确
    互操作性 和其他软件的互相操作 第三方软件的交互 word文档对打印机驱动程序的操作
    保密安全性 保护信息和数据 保护得到授权的人或者系统能正常访问相关的信息或数据 1、登录的用户名和密码
    2、权限使用
    3、防止DOS攻击(拒绝访问攻击)4、系统数据的保护和加密,如密码的加密
    5、传输加密,如密码的网络传输
    6、防病毒
    7、放溢出,如char与varchar的字符数
    保证未授权的人或系统无法看到相关的信息或数据
    功能性的依从性 遵循功能性相关的标准、约定或法规 是否符合国家法律规定 如色情网站
    可靠性 成熟性 缺陷尽可能的少    
    容错性 提前考察的异常情况出错问题 整个系统的外部接口 如word打印时,打印机死机出现报错,但不影响word的使用
    易恢复性 失效后恢复原有功能、性能 系统的性能测试 如网游延迟卡死现象。系统提示内存不足。银行系统的心跳监听。灾难备份。
    可靠性的依从性 法律法规   灾难备份。
    易用性(CUI测试) 易理解性 (快速理解) 系统交互的信息是否准确、清晰、易懂,指导下一步操作。 系统提示信息是否准确 如网银密码超出位数报错
    易学性 (快速上手) 易用好学 是否有说明书、是否在线帮助、是否有提示信息 msn的帮助手册
    易操作性 (快速做完) 方便快速使用 操作的直观程度,操作步骤、操作动作多少与时间长短 鼠标、gui层数、安装过程
    易测试性 软件可控 提供工具给测试工程师,可以控制系统运行,以达到测试目的 windows的性能工具与服务管理工具
    软件可观察 通过辅助手段可  
    吸引性 外观 外观  
    易用性的依从性 法律法规    
    可移植性 适应性 (跨平台、跨语言) 软件产品无需采用有别于为考虑该软件的目的而准备的活动或手段就可能适应不同的指定环境的能力;是否适应其他系统环境 软件、硬件、外设、数据库 微软与苹果的前期竞争。主板与CPU
    易安装性 在指定环境中是否易于安装 主流平台和系统100%测试用例,非主流10% flash安装
    共存性 不同的其他系统能共同运行 1、功能是否能正常运行满足要求
    2、系统性能能满足要求 是否会抢占资源。迅雷和pplive抢占资源。杀毒软件,瑞星和金山不能共存
    易替换性 替代为其他相同功能的产品的能力 升级过后的系统是否会造成系统崩溃 软件升级补丁升级
    可移植性的依从性 法律法规    
    效率-性能 时间效率 规定条件下,软件产品执行其功能时,提供适当的响应和处理时间以及吞吐率的能力 系统的反应时间 提款机取款时间的快慢
    资源效率 在规定条件下,软件产品执行其功能时,使用合适的资源数量和类别的能力 做一件事所占用的系统资源 电器所消耗的电能多少
    效率依从性 法律法规    
    维护性-维护的难易程度与成本 易分析性 软件产品诊断软件中的缺陷或失效原因或识别待修改部分的能力 辅助工具或者日志文件或者常用问题帮助手册 qq异常退出的帮助文件
    易改变性 代码容易被修复或修改 高内聚,低耦合  
    稳定性 软件产品避免由于软件修改而造成意外结果的能力 长期的监控一个系统的运行情况和系统的资源情况 淘宝的系统监控
    维护性的依从性 法律法规

    配置管理
    配置工具 有的话 用的工具叫什么名字
    安装------B/S(浏览器)(check in /check out:原理) C/S(客户端)

    4.CMMI把企业分为5个等级

    5.CMM与CMMI的区别
    cmmi:是不同cmm的集成,集成并发扬cmm的优点,并借鉴其他模型的优点融入新理论和实际研究成果,不仅能应用于软件领域,而且能应用于系统过程和其他过程领域,Cmmi和cmm最大不同: Cmmi1.1版本包含4个成分:系统工程(SE)、软件工程(SW)、应用集成产品和过程开发(IPPD)、供应商外包管理(SS) Cmmi有2种表示方法: 阶段式 连续式

    第五章 SQL
    数据库的价值目标:
    数据库的技术(不只是界面 还要知道数据库逻辑 1.要对数据库的设计理解 2.还有数据库对象的关系3.数据库的常见命令)
    常见数据库:MySQL Access(单机) MS-SQL(交互好) Oracle Sybase DB2
    MySQL 小巧 效率高 免费
    后三种Oracle Sybase DB2是大型收费,数据安全和备份好
    数据库作用:组织、存储、处理
    关系型数据库
    第一日:
    关系型数据库
    数据库的作用

    索引
    视图
    存储过程
    触发器
    事务 对象 优缺点 使用范围
    SQL Server具体操作
    建库
    建表
    备份 恢复 操作手册: 建库 建表 备份 恢复
    第二日:
    查询命令
    单表查询
    多表查询
    查询 统计功能测试点
    第三日:
    新增功能 新增功能测试点
    更新命令 修改功能测试点
    删除命令 删除功能测试点
    补:
    存储过程 学会构造大量测试数据
    触发器 了解 看懂 如何测试

    RDBMS 关系型数据库
    SQL Structured Query Language 结构化查询语言
    C/S Client/Server 客户 服务器
    B/S Browser/Server 浏览器 服务器
    第一天:
    文件类型:文件存储位置改变 程序代码更新 对大量数据量处理不恰当
    数据库的意义”
    1数据的重用(硬盘)
    2检索速度要提高(分类存储)
    3把数据与代码的耦合度降低(数据存放位置与代码无关)
    数据库管理系统 SQLServer
    Oracle
    MySQL
    DB2
    数据库的表结构
    1.数据分类
    2.数据关联
    数据库设计评审点
    1.数据存储是否有重复现象 不同表中是否存在相同字段(该字段既不是主键也不是外键)
    2.是否符合范式要求 同一个表中存在数据重复字段不要超过两个以上 可以保证冗余数据很少
    可以考虑有适当冗余
    3.对于业务有频繁查询要求的数据表
    4.表间关系是否正确 是否按照业务要求进行了数据关联
    5.数据库字段以及表的设计是否充分 数据字段内容是否涵盖需求要求的所有数据
    数据字段类型 及长度是否符合需求

    表 基本组成单元 有记录和 字段组成
    表中每一条数据
    存储数据
    数据分类
    字段位置变化 不影响程序
    索引 建立在字段上 可以对字段进行排序 同一张表索引
    更新索引字段值的时候 新增会打乱索引的顺序时
    视图 建立在数据库上 封装查询命令 存储数据 方便查询调用 提示安全性 显示结果固定
    如果在执行事务时没有执行完就实行事务回滚
    事务:是有两条以上的数据库命令组成的原子集合.该事务中的那条命令要么一次性执行成功,要么都不执行,如果在执行过程中执行失败那么该事务就进行回滚,将数据恢复到执行之前的状态
    是否存在某些业务要封装成事务?
    优点:可以保证有关联的数据库操作所对应的关联所需要的完整性和统一性
    缺点:不要将不相关的操作放在同一个事务中,否则会降低执行成功率和效率

    存储过程 存储过程封装了多条SQL命令,必须存放在数据库服务端
    优点: 减少了网络传输SQL命令的压力
    提高了访问的安全性
    SQL 命令存放在服务器端执行效率高
    缺点:需要编写和设计调试 它是一段程序 对于大批量的数据较弱 避免分支和循环
    触发器 自动执行 并且只能对一张表中进行触发 当某一张中发生操作时需要同时对其让表的数据进行操作可以考虑创建触发器

    过程:
    检查SQL服务是否启动
    图形界面建库 建表
    企业管理器
    命令行方式
    查询分析
    主键 用一标记该表中的记录 不能重复 不能为空
    外键 通过外键与其他表中的数据进行关联 只能是以存在主键值

    当前表的数据要被其他表使用时 要有主键
    外键 有主键存在时就要设置对应的外键

    搭建测试环境时或给用户安装产品
    海达票务处理
    C/B 建立空库hdpw1
    恢复
    安装服务器端
    安装客户端
    admin admin

    约束:
    1主键约束
    1 主键约束 primary key
    –特点:约束的字段数据,不能为空、不能重复。
    如果插入或者更新的数据为空或者重复将不允许进行操作。

    –语法:
    1)不命名的主键约束
    create table student
    (
    No int primary key,
    Name char(10),
    Sex char(2),
    ruxu datetime
    );
    2)命名的主键约束
    create table student
    (
    No int,
    Name char(10),
    Sex char(2),
    ruxu datetime,
    constraint pk_001 primary key(No)
    );
    3)删除主键约束
    –语法:alter table 表名 drop constraint 约束名;
    alter table student drop constraint pk_001;
    4)改主键约束
    –语法:alter table 表名 alter column 字段名 类型 not null;
    –alter table 表名 add constraint 约束名 primary key (字段名);
    alter table student alter column No int not null;
    alter table student add constraint PK_002 primary key(No);
    2 非空约束 not null
    1)增加非空约束
    create table student1
    (
    No int not null,
    Name char(10),
    Sex char(2),
    ruxu datetime
    );

    2)改非空约束
    alter table student1 alter column Name char(10) not null;
    3 外键约束 FOREIGN KEY
    –新增外键关系
    1)非命名的外键约束
    create table grade
    (
    no int foreign key references student(No),-- 字段名 字段类型 foreign key references 主表(主键字段)
    grade float
    );
    2)命名的外键约束
    create table grade
    (
    No int,
    grade float,
    constraint fk_001 foreign key (no) references student(no)
    );
    3)删除外键约束
    alter table grade drop constraint fk_002;
    4)改外键约束
    alter table grade add constraint FK_002 foreign key(no) references student(no) on delete cascade; --当主表进行数据删除时,从表一起删除
    alter table grade add constraint FK_002 foreign key(no) references student(no) on update cascade; --当主表进行数据更新时,从表一起更新
    alter table grade add constraint FK_002 foreign key(no) references student(no) on delete no action; --当主表进行数据删除时,违反了外键约束,拒绝进行删除操作
    alter table grade add constraint FK_002 foreign key(no) references student(no) on update no action; --当主表进行数据更新时,违反了外键约束,拒绝进行更新操作
    4 默认约束
    –default 当 一个字段不填写内为空时,默认插入一条数据
    1)增加default 约束
    create table sex
    (
    id int,
    sex char(2) default ‘男’
    );
    2)改 default 约束
    5 检查约束 check
    –只有满足检查约束的数据才能添加到表中,不满足的加不进来
    1)不命名的检查约束
    create table balance
    (
    id int,
    money float check (money >= 0)
    );

    2)命名的检查约束
    create table balance
    (
    id int,
    money float,
    constraint CK_001 check (money >= 0)
    );
    3)删除检查约束
    alter table balance drop constraint ck_001;

    4)改检查约束
    alter table balance add constraint CK_002 check (money >= 0);
    6 唯一约束 unique
    –对于字段输入的内容必须是唯一的,不能重复,但可以为空,多个字段都可以输入唯一约束
    1)不命名唯一约束
    create table tiger
    (
    tig_id int,
    tig_name char(10) unique
    );

    2)命名唯一约束
    create table tiger
    (
    tig_id int,
    tig_name char(10),
    constraint UN_001 unique(tig_name)
    );

    3)删除唯一约束
    alter table tiger drop constraint UN_001;
    4)改唯一约束
    alter table tiger add constraint UN_002 unique(tig_name);
    SQL语句
    创建数据库.
    语法:create database 数据库名字;
    数据库名字不能使用数字作为开头。可以使用字母或者_作为开头
    create database _51testing;

    开辟两块空间,一个是保存日志的,一个是保存表的
    删库 DROP DATABASE 库名;
    单行注释 ——
    多行注释 /* */
    切换数据库
    语法:use 数据库名;
    use _51testing;
    转换当前使用数据库
    备份数据库
    BACKUP DATABASE 库名 TO DISK=’文件名’;
    如BACKUP DATABASE xuanke TO DISK=’d:\test.bak’;
    恢复数据库
    RESTORE DATABASE 库名 FROM DISK=’文件名’;
    如RESTORE DATABASE xuanke FROM DISK=’D:\test.bak’;
    表、字段、类型
    建表
    语法:create table 表名字 ( 字段名 字段类型 字段约束 , 字段名 字段类型 字段约束 );
    create table tmp
    (
    NO int primarykey,
    NAME char(10)
    );
    字段约束可以没有
    删除表
    语法:drop table 表名
    注意:外键约束
    drop table grade
    建立外键
    Sid INT FOREIGN KEY (sid) REFERENCES student (sid)
    CREATE DATABASE xuanke1;
    USE xuanke1;
    –DROP database xuanke1;
    CREATE TABLE student1
    (sid INT PRImary KEY,
    sname CHAR(20) NOT NULL,
    sex CHAR(2) NOT NULL CHECK(sex IN (‘男’,‘女’)),
    card_id CHAR(20) NOT NULL unique CHECK(len(card_id) = 18),
    calss ChAR(20) NOT NULL,
    major CHAR(20) NOT NULL,
    birth_year INT CHECK(birth_year BETWEEN 1900 And 3000) NOT NULL,
    enrollment DATETIME NOT NULL,
    tel CHAR(20)
    )
    CREATE TABLE course1
    (
    cid INT PRIMARY KEY,
    cname CHAR NOT NULL,
    tname CHAR(20) NOT NULL,
    ctime DATETIME NOT NULL,
    cadress CHAR(20) NOT NULL,
    pre_course_id INT,
    )
    CREATE TABLE student_course1
    (
    sid INT FOREIGN KEY (sid) REFERENCES student1 (sid),
    cid INT FOREIGN KEY (cid) REFERENCES course1 (cid) PRIMARY KEY(sid,cid),
    grade INT
    )
    插入一条记录
    在表中增加数据(insert into)
    语法:
    1对表中所有的字段添加数据:insert into 表名 values (第一个字段的值,第二个字段的值,第三个字段的值…);
    注意1:values 值得个数一定要和表中字段的个数相等,一一对应。
    注意2:values 值得数据类型,必须要和表中字段的数据类型相匹配。int fload 值是数字,如果char 值得字符要用’值’。
    注意: 英文单引号 逗号 ,日期 要加单引号

    insert into student values (5,‘郑佳祺’,‘男’,‘003’,‘2011-08-23’,‘北京’,‘1979-01-01’);
    insert into student values (6,’’,‘男’,‘003’,‘2011-08-23’,‘北京’,‘1979-01-01’);
    insert into student values (7,‘庞鹏珏’,‘男’,3,‘2011-08-23’,‘北京’,‘1979-01-01’);

    2对表中指定字段添加数据:insert into 表名(字段1,字段2,字段3) values (值1,值2,值3);
    insert into student(stuid,stname,sex,family) values (8,‘齐倩’,‘女’,‘天津’);
    insert into student(stuid,stname,sex,family,birthday) values (9,‘例子1’,‘女’,‘天津’,’’);
    insert into student(stuid,stname,sex,family,class) values (10,‘例子2’,‘女’,‘天津’,’’);
    insert into student(stuid,stname,sex,family,class) values (11,‘例子3’,‘女’,‘天津’,NULL);
    insert into student(stuid,stname,sex,family,class) values (12,‘例子4’,‘女’,‘天津’,‘NULL’);
    删除数据
    语法:1.delete from 表名
    注意: 删除表中数据时要考虑约束。
    同样用法 truncate table 表名
    delete from grade
    truncate table grade;
    2.delete from 表名 [where 条件]
    delete from student where stname = ‘例子1’;
    1)单一条件
    DELETE FROM student WHERE sid=500;
    2)复合条件
    DELETE FROM student WHERE sex=‘男’ AND major=‘计算机’;
    DELETE FROM student WHERE major=‘计算机’ OR major=‘1’;
    DELETE FROM student WHERE sid BETWEEN 1 AND 500;
    DELETE FROM student WHERE sid>=1 AND sid<=500;
    3)模糊条件
    DELETE FROM student WHERE major LIKE ‘计算机%’; ———— % 通配符(计算机后面任意位任意字符)
    DELETE FROM student WHERE major LIKE ‘%务’;
    DELETE FROM student WHERE class LIKE ‘4%期’;
    DELETE FROM student WHERE class LIKE ‘4_期’; ———— _ 通配符(4后面一位的任意字符)
    DELETE FROM student WHERE sname LIKE ‘[xw]%’; ———— [] 从括号中取任意一个值
    Truncate table student 删除student表记录内容 但是后面不能加条件(不记录日志,速度快)
    更新表数据(修改一条记录)
    更新表数据
    –语法:update 表名 set 字段 = 值,字段2=值[where 条件]
    –注意1:字段类型 和 值得类型 要匹配,主键的值可以被修改
    –注意2:为了保证表数据的完整一直,最好在更新是增加WHERE 条件。
    select * from student
    update student set sex = ‘男’ ;
    update student set sex = ‘女’ where family = ‘天津’
    update student set family = ‘广州’ where family = ‘北京’
    将学号小于50的记录的入学时间更改为2011-5-18
    UPDATE student SET enrollment=‘2011-5-18’ WHERE sid<50;
    将‘计算机’专业的学生转成“计算机科学与技术”
    UPDATE student SET major=‘计算机科学与技术’ WHERE major LIKE ‘计算机’;
    将专业为“信管”开头和“汽车”开头的专业转成“自动化控制”
    UPDATE student SET major=‘自动化控制’ WHERE major LIKE ‘信管%’ OR major LIKE ‘汽车%’;
    将所有省为“北京”和“北京市”的记录统一成“北京”,并将这些记录的班级改成49期
    UPDATE student SET province=‘北京’,class=‘49期’ WHERE province LIKE ‘北京%’;
    将入学时间大于1985-1-1记录的出生时间改为比入学年月早18年
    UPDATE student SET borth_year=year(enrollment)-18 WHERE enrollment > ‘1985-1-1’;
    year() 是求DATE类型的年份
    查询
    简单的查询记录基础语法
    基础语法 select 查询的内容(也就是字段名1,字段名2) from 表名 where 条件
    (用*号可以显示所有字段)
    查询李进峰的所有基本信息
    SELECT * FROM student WHERE sname=‘李进峰’;
    查询李进峰和菲菲的所有基本信息
    SELECT * FROM student WHERE sname=‘李进峰’ OR sname=‘菲菲’;
    SELECT * FROM student WHERE sname IN (‘李进峰’, ‘菲菲’);
    查询所有姓张的同学的所有基本信息
    SELECT * FROM student WHERE sname LIKE ‘张%’;
    查询姓名中有“宇”的同学的所有信息
    SELECT * FROM student WHERE sname LIKE ‘%宇%’;
    查询姓名长度为3,第一个字为“李”最后一个字是“照”的记录
    SELECT * FROM student WHERE sname LIKE ‘李_照’;
    查询所有姓张和姓李的同学的学号和姓名以及出生年月
    SELECT sid,sname,borth_year FROM student WHERE sname LIKE ‘张%’ OR sname LIKE ‘李%’
    SELECT sid,sname,borth_year FROM student WHERE sname LIKE [张李]%’;
    查询姓“杨”并且所在省份为“河北省”的同学的学号
    SELECT sid FROM student WHERE sname LIKE ‘杨%’ AND province=‘河北省’;
    查询”北京”、”湖南”和”河南省”同学的所有信息
    SELECT * FROM student WHERE province=’北京’ OR province=‘湖南’ OR province=‘河南省’
    SELECT sid,sname,borth_year FROM student WHERE province IN (‘北京’, ‘湖南’, ‘河南省’);
    查询姓“”李但是所在省份没有“湖南”字样的同学的省份证号码
    SELECT card_id FROM student WHERE sname LIKE ‘李%’ AND province NOT LIKE ‘%湖南%’
    查询18岁(不含18)以前上学的同学的姓名和电话
    SELECT sname,tel FROM student WHERE year(enrollment)-borth_year<18;
    查询所有大于25岁的人的所有信息
    SELECT * FROM student WHERE year(getdate())-year(enrollment)>25;
    通配符
    使用环境,用于模糊查询,连接符号用Like 而非 =

    • 代表全部,所有,没有规定数量和内容。一般用于select 后面 不作为条件
      _ 代表一个字符,一个数据位。中文要用两个__ 。作为条件使用
      % 代表任意的,没有规定数量和内容。作为条件使用
      [值1,值2,值3] 从括号内的任意值。作为条件使用
      select * from student where stname like ‘张%’
      select * from student where stname like ‘[张李]%四’
      运算符。条件
      – = 两边内容相同。
      – > 左边大于右边。
      – < 右边大于左边。
      – >= 左边大于等于右边。
      – <= 右边大于等于左边。
      – <> 或者 != 不等于
      – between A and B 介于 A 和 B 之间,并且 >=a <=b .前面的数要小于后面的数,包含边界数的。
      select * from grade where coursegrade = 80
      select * from grade where coursegrade between 80 and 100
      条件关联
      – 条件1 and 条件2 :要同时满足条件1 和 条件2 是并且的关系。
      – 条件1 or 条件2 :只要满足一个条件就可以 是或的 关系。
      – () :先去执行括号中得条件
      – 字段 in (值1,值2,值3) :字段的内容要满足 值1 或 值2 或 值3
      select * from student where family = ‘北京’ and stname like ‘张%’
      select * from student where family in (‘上海’,‘天津’)
      排序
      –对查询到的结果按照升序或者降序的方式进行排列。
      –语法 order by 字段 排序方式 (desc,asc) asc 可以省略
      –注意:order by 一定要写在所有查询sql 的最后面
      select * from grade order by coursegrade
      聚合函数
      对查询的结果中某个字段进行函数运算
      sum(字段) :求和函数 字段需为数字类型
      avg(字段) :求平均值 字段需为数字类型.不会计算为空的条目。
      min(字段) :最小的值
      max(字段) :最大的值
      count(字段) :统计字段的个数,这里可以使用 * ,统计所有结果的行数。
      distinct(字段) :去重复
      注:聚合函数,不能放在WHERE中,需要放在HAVING里
      – 显示学生的总成绩
      select sum(coursegrade) from grade
      – 显示最高的成绩是多少
      select min(coursegrade) from grade
      select avg(coursegrade) from grade
      select * from grade
      select count(*) from student
      DISTINCT 去除重复行
      SELECT DISTINCT province FROM student;

    别名AS (Alias)
    as 临时别名
    列别名在WHERE中不能使用 GROUP BY 中不能使用 ORDER BY 中可以
    表别名可以在任何地方使用
    select class, sex, count(sex) as数量 FROM student GROUP BY class,sex ORDER BY class;
    select count(*) as 学生个数 from student
    select stname as 姓名,stuid as 学号from student
    SELECT和ORDER BY 不影响表中数据 所以可以使用别名
    分组里加WHERE和ORDER BY

    对真空的处理
    查询为空的字段 : 字段名 is null
    查询 不为空的字段 : 字段名 is not null
    select * from grade
    select * from grade where coursegrade is not null

    –统计每个课程的选修人数大于2个人的信息
    对课程分组,显示课程和对应的人数
    select couid,count(stuid) from grade group by couid having count(stuid) >2
    –统计<学生选修信息表>,统计每个同学的总成绩
    统计记录条数 count?
    查多少名学生
    SELECT count(*) FROM student
    查有多少种班级
    SELECT count (DISTINCT class) FROM student;
    查入学时间在1990-1-1到2000-12-31的学生个数
    SELECT count(enrollment) FROM student WHERE enrollment BETWEEN ‘1990-1-1’ AND ‘2000-12-31’ ;
    分组查询 GROUP BY
    先对查询内容进行分组、分类,然后在对一个组中的数据进行查询或者运算
    select 查询的内容 from 表名 group by 字段名
    select stuid,sum(coursegrade) from grade group by stuid
    select * from grade
    select stuid,sum(coursegrade) from grade where coursegrade is not null group by stuid
    分组前条件
    在group by 之前使用where 条件去选取数据
    分组后条件
    在 group by 分组后 + having 条件
    select stuid,sum(coursegrade) from grade where coursegrade is not null
    group by stuid having sum(coursegrade) >=200
    –统计<学生信息表>,统计每个班级中每种性别的学生人数
    select * from student
    –统计按照性别分得学生人数
    select sex,count(stuid) from student group by sex
    –统计<学生信息表>,统计每个班级中每种性别的学生人数,两个分组条件
    –统计<grade表>,统计每门课程的平均成绩,并按照成绩降序排序
    select couid,avg(coursegrade) from grade group by couid order by avg(coursegrade) desc

    RIGHT函数
    取身份证最后5位数
    SELECT right(card_id, 5) FROM student;
    将身份证补齐20位,前面用0补
    SELECT right(‘00’+card_id, 20) FROM student;
    SELECT ‘00’+card_id FROM student;
    LEFT函数
    取身份证的前10位
    SELECT left(card_id, 10) FROM student;
    将学号小于50的电话设置成NULL
    UPDATE student SET tel = NULL WHERE sid< 50;
    将电话为NULL的学生信息查询出来
    SELECT * FROM student WHERE tel IS NULL;
    判断条件是NULL的时候不能用= 要用IS IS NOT
    HAVING
    分组查询中,如果条件中有聚合函数,不能放在WHERE中,需要放在HAVING里
    查询平均出生年>1991的班级信息
    SELECT class,avg(borth_year) FROM student GROUP BY class HAVING avg(borth_year) > 1991 ;
    统计哪些班级男生平均年龄大于20
    SELECT calss FROM student WHERE sex=’男’ GROUP BY class HAVING avg(year(getdate())-borth_year)>20;
    优先级WHERE——GROUP BY——HAVING——PRDER BY
    查询学生的姓名和出生年,年龄最大的放前面
    SELECT sname, borth_year FROM student ORDER BY borth_year ;
    TOP 查询结果去前几个结果
    查询年龄最大的学生信息 年龄最大的前10名
    SELECT TOP 1 sname, borth_year FROM student ORDER BY borth_year ;
    SELECT TOP 10 sname, borth_year FROM student ORDER BY borth_year ;
    查询年龄最小的学生信息 年龄最大的前10名
    SELECT TOP 1 sname, borth_year FROM student ORDER BY borth_year DESC;
    SELECT TOP 10 sname, borth_year FROM student ORDER BY borth_year DESC;
    查询按照学号排序,前50个学生的信息
    SELECT TOP 50 * FROM student ORDER BY sid;
    查询最近入学的10名学生信息
    SELECT TOP 10 * FROM student ORDER BY enrollment DESC;
    关联查询(等值联接)
    内连接 等值连接
    外连接 1、左连 2、右连
    多表关联
    1内连接 等值连接 inner join
    语法 select 内容 from 表1 inner join 表2 on 等值条件
    select * from student inner join grade on grade.stuid = student.stuid
    select grade.couid,couname,coursegrade from grade inner join course on grade.couid = course.couid
    2外连接 outer join
    1)左连 select 内容 from 表1 left outer join 表2 on 条件
    2)右连 select 内容 from 表1 right outer join 表2 on 条件
    select * from grade outer join student on student.stuid = grade.stuid
    注:左连接 以 outer join 左边的表为准,要显示全部的左边表的数据,如果右边表没有关联的数据显示Null 与右边表比较 当右边表没有值时 只取左边表的记录
    select * from student right outer join grade on student.stuid = grade.stuid
    注:右连接 以 outer join 右边的表为准,要显示全部的右边表的数据,如果左边没有关联数据,显示Null
    多表关联
    语法:select 内容 from 表1,表2,表3 where 条件
    select stname,couname,coursegrade from student,course,grade
    where student.stuid = grade.stuid and course.couid= grade.couid and coursegrade >80
    select * from grade
    –所有男同学的平均成绩
    select avg(coursegrade) from student,grade where student.stuid = grade.stuid and sex = ‘男’ and coursegrade is not null
    select * from student
    3子查询,嵌套查询
    –当某一个查询的条件,是在另一个查询的结果集里面时,使用嵌套查询
    –查询李四的成绩。
    select * from grade where stuid = (select stuid from student where stname =‘李四’)
    –查询 张三和李四的成绩
    select * from grade where stuid in
    (select stuid from student where stname =‘张三’ or stname = ‘李四’)
    select * from grade where stuid = (select stuid from student where stname =‘张三’)
    or stuid = (select stuid from student where stname =‘李四’)
    –有考试成绩在 70~90的学生的姓名
    select stname from student where stuid in
    (select stuid from grade where coursegrade between 70 and 90)
    批量处理?
    DECLARE @sid INT 申请一个变量
    DECLARE @card_id CHAR(18)
    SET @sid=1 赋初值
    SET @card_id = ‘000000000000’+right(‘00000’+convert(VARCHAR(6),@sid),6) convert 强制转换数据类型
    PRINT @sid
    PRINT @card_id
    INSERT INTO student2 VALUES (@sid,‘蒋艳梅’,‘女’,‘49期’,‘计算机’,@card_id,1999,‘1999-9-9’,‘1111111’,‘1111’)

    CREATE PROCEDURE btInsert AS 或者 CREATE PROC btInsert AS --(保存一个过程)
    DECLARE @sid INT
    DECLARE @card_id CHAR(18)
    SET @sid = 1
    WHILE (@sid <= 100000)
    BEGIN
    SET @card_id=’1111111111111’+right(‘00000’+convert(VARCHAR(6),@sid),6)
    INSERT INTO student2 VALUES (@sid,‘蒋艳梅’,‘女’,‘49期’,‘计算机’,@card_id,1999,‘1999-9-9’,‘1111111’,‘1111’)
    SET @sid = @sid +1
    END
    EXECUTE btInsert 或者 EXEC btInsert (执行已经保存的过程)
    视图/虚表 view
    创建视图 create view 视图名 as (SQL)
    create view tiger as (
    select stname,couname,coursegrade from student,grade,course
    where student.stuid = grade.stuid and grade.couid = course.couid)
    –注意1.视图中不保存数据,不保存表结构,不保存表,没有约束。只保存sql 语句。
    –注意2.视图可以当表来使用,可以用视图去建视图。但是,不建议做 增 删 改的操作。
    –注意3.删除视图时,不会影响到原来的基础表。可以直接在视图中使用SELECT
    create view big_tiger as (select stname,coursegrade from tiger )
    delete from big_tiger where coursegrade is null
    删视图
    –语法:drop view 视图名
    drop view big_tiger
    drop view tiger

    视图的优点
    –1.对于使用sql 不熟练来说。视图是个很简单的查询途径
    –2.对于经常重复的复杂sql,使用视图可以提高查询效率
    –3.可以辅助用于权限管理,提高数据的安全性
    –4.帮助保护表和数据的完整一致性

    视图的缺点
    –1.降低了查询效率
    –2.增加保存空间
    –3.无法对数据和表进行操作。使得操作测试不方便进行。
    create view cll as (
    select class,count(stuid) as 人数 from student group by class
    )
    select * from cll where 人数 = 2

    –视图在企业中如何应用
    1.对于测试而言,降低测试的复杂度。例如:复杂 sql 写一次保存视图,以后都直接调用视图。
    2.对于测试而言,降低工作难度。例如:新来的新人可能对表结构不熟悉,对sql 也不熟悉,使用视图可以尽快上手开始工作。
    3.对于开发而言,降低服务器的工作。提高服务器运行效率。例如:如果不用视图,查询语句要在服务器端生成传给数据库。如果使用视图,服务器直接查询视图就可以满足查询功能。
    4.对产品设计和业务人员而言,降低了工作难度,不用学习和使用复杂sql 语言。例如:如果产品或者业务人员想去查询某些指定的数据时,只要让开发或测试人员建一个视图。直接去查询视图就可以了。
    索引
    –索引就像目录,表中对于一个字段的目录结构。如果想操作表中的数据,先在索引字段中找到那一行,然后再去操作那一条数据。
    –注意1:建议索引设置在主键、外键、唯一约束,效率高
    –注意2:索引是应用于查询条件的。经常使用的查询条件字段,应该被设置为索引字段。
    –注意3:一个表中可以有多个索引,索引之间可以交叉字段,一个索引可以有多个字段。

    索引的优点:
    –1.提高查询效率
    –2.提高了排序效率

    索引的缺点:
    –1.占用数据库资源
    –2.降低了对数据库增、删、改的效率

    索引在企业中如何应用:
    –1.页面上如果有很多的查询条件并且需要排序时,建议一一创建索引。
    –2.检查是否主键和外键、唯一约束建立了索引关系。
    –3.在测试过程中应该检查,运行查询条件时是否使用了索引。
    –4.测试中检查,平凡被更新的表,不要设置太多的索引。

    –建索引
    –语法:create index 索引名 on 表(字段,字段…);
    create index suoyin1 on student(stname,family);

    –删索引
    –语法:drop index 表名.索引名
    drop index student.suoyin
    存储过程 procedure
    –把一些sql 放在一起执行,并且有逻辑的执行。存储过程。
    –语法1:简单的无参数存储过程。
    – create procedure 存储过程名 as sql语句
    create procedure aa as
    update grade set couid = 6 where couid =1;
    update course set couid = 6 ,couname = ‘生物’ where couid =1;

    执行存储过程
    –语法 exec 存储过程名
    exec aa;

    select * from grade;
    select * from course;

    语法2:有参数的存储过程
    – create procedure 存储过程名 (@参数1 参数类型,@参数2 参数类型…) as sql语句
    create procedure BB (@id int,@NewId int,@name char(10))
    as
    update grade set couid = @NewId where couid = @id;
    update course set couid = @NewId ,couname = @name where couid =@id;

    执行存储过程
    –语法 exec 存储过程名(参数1,参数2,参数3)  
    SQL SERVER 参数不加括号
    –注意1.参数的个数和 数据类型必须与定义相一致
    –注意2.存储过程中的sql 是按照顺序执行的
    –注意3.当存储过程中一个sql失败时。不会影响其他sql的执行。
    exec BB 3,13,‘SQL SERVER’
    alter table grade add constraint CH check (couid < 20)
    update grade set couid = 21 where couid = 13;
    exec BB 13,21,‘ORACLE’
    create database bank;
    use bank;
    create table bj_bank
    (
    name char(10),
    money int check(money>=0)
    constraint pk_nanme_bj primary key (name)
    事务 transaction
    把所作的操作放在一组,如果有一个失败就全失败,都成功时候才成功
    事务是存储过程的一个部分,存储过程的一个写法
    – begin transacion 事务名
    – commit transacion 事务名
    – rollback transacion 事务名
    create procedure zz1
    (
    @a_name char(10),
    @b_name char(10),
    @a_money int,
    @b_money int,
    @c_name char(10)
    )
    as
    begin transaction c1 --开始事务c1
    if (select money from bj_bank where name = @a_name) > 0 --判断a账户
    begin
    update bj_bank --从a中减去
    set money=money-@a_money
    where name=@a_name;
    update zs_bank --向c中添加
    set money=money+@a_money
    where name=@c_name;
    commit transaction c1
    end
    else
    rollback transaction c1 --如果判断失败回滚所有操作

    begin transaction c2 --开始事务c2
    if (select money from bj_bank where name = @b_name) > 0 --判断b账户
    begin
    update bj_bank --从b中减去
    set money=money-@b_money
    where name=@b_name
    update zs_bank --向c中添加
    set money=money+@b_money
    where name=@c_name
    commit transaction c2
    end
    else
    rollback transaction c2 --如果判断失败回滚所有操作

    update bj_bank set money = 5000 where name = ‘a’;
    update bj_bank set money = 1000 where name = ‘b’;
    update zs_bank set money = 0 where name = ‘c’;

    exec zz1 a,b,250,600,c
    select * from bj_bank
    union
    select * from zs_bank
    exec zz2 a,b,500,700,c
    exec zz2 a,b,1000,500,c

    存储过程 zz2 开始
    create procedure zz2
    (
    @a_name char(10),
    @b_name char(10),
    @a_money int,
    @b_money int,
    @c_name char(10)
    )
    as
    begin transaction guopeng
    if (select money - @a_money from bj_bank where name = @a_name) >= 0
    begin
    update bj_bank set money = money - @a_money where name = @a_name;
    update zs_bank set money = money + @a_money where name =@c_name;
    commit transaction guopeng;
    end
    else
    begin
    rollback transaction guopeng;
    end
    begin transaction qiqian
    if (select money - @b_money from bj_bank where name = @b_name) < 0
    begin
    rollback transaction qiqian;
    end
    else
    begin
    update bj_bank set money = money - @b_money where name = @b_name;
    update zs_bank set money = money + @b_money where name =@c_name;
    commit transaction qiqian;
    end
    存储过程zz2 结束
    存储过程循环。大批量的制造测试数据。
    create procedure ww
    (
    @name char(10),
    @money int,
    @count int
    )
    as
    declare @num int;
    set @num = 0;
    while (@num < @count)
    begin
    insert into bj_bank values (@name,@money);
    set @num = @num +1;
    end;
    drop procedure ww
    alter table bj_bank drop constraint pk_nanme_bj
    exec ww ‘王沙’,900,1000000;
    select * from bj_bank where money = 30
    truncate table bj_bank

    –存储过程在企业中如何应用:
    –1.对于开发、对于测试而言,存储过程简化了工作难度。
    –2.对于开发、测试而言,存储过是可以实现逻辑的。
    –3.对于测试而言,帮助我们大批量的生成测试数据。
    –4.对于测试而言,帮助我们去检查对数据库的操作数据是否符合预期
    –5.对于开发而言,存储过程支持事务,可以做逻辑编程

    –删除存储过程
    –语法 drop procedure 存储过程名
    drop procedure ww
    触发器 trigger
    当满足触发条件时,执行后面的触发sql,支持事务
    语法: create trigger 触发器名 on 工作表表名 for 触发方式 as sql语句
    触发条件 delete,update 触发条件因数据库而异
    create trigger trigger_student_delete
    on student
    for delete
    as
    delete grade from grade,deleted where grade.stuid = deleted.stuid;
    select * from student
    select * from grade
    delete from student where stuid = 1
    alter table grade drop constraint FK__grade__stuid__7D78A4E7
    练习
    一、单表查询练习
    1、查询<学生信息表>,查询学生"张三"的全部基本信息
    Select * from student where stname=’张三’;
    2、查询<学生信息表>,查询学生"张三"和”李四”的基本信息
    select * from student where stname in (‘张三’,‘李四’)
    3、查询<学生信息表>,查询姓"张"学生的基本信息
    select * from student where stname like ‘张%’;
    4、查询<学生信息表>,查询姓名中含有"四"字的学生的基本信息
    select * from student where stname like ‘%四%’;
    5、查询<学生信息表>,查询姓名长度为三个字,姓“李”,且最后一个字是“强”的全部学生信息。
    select * from student where stname like ‘李_强’;
    6、查询<学生信息表>,查询姓"张"或者姓”李”的学生的基本信息。
    select * from student where stname like ‘张%’ or stname like ‘李%’;
    7、查询<学生信息表>,查询姓"张"并且"所属省份"是"北京"的学生信息
    select * from student where stname like ‘张%’ and family =‘北京’;
    8、查询<学生信息表>,查询"所属省份"是"北京"、”新疆”、”山东”或者"上海"的学生的信息
    select * from student where family in (‘北京’,‘新疆’,‘山东’,‘上海’);
    9、查询<学生信息表>,查询姓"张",但是"所属省份"不是"北京"的学生信息
    select * from student where family!=‘北京’ and stname like ‘张_’;
    10、查询<学生信息表>,查询全部学生信息,并按照“性别”排序,性别相同的情况下按照“所属省份”排序,所属省份相同的情况下再按照“班级”排序
    select * from student order by sex,family,class; (多个排序条件,用逗号以此分开,先排第一个、再排第二个。。。。)
    11、查询<学生信息表>,查询现有学生都来自于哪些不同的省份
    select distinct (family) from student;
    (注意distinct使用方法)
    12、查询<学生选修信息表>,查询没有填写成绩的学生的学号、课程号和成绩
    select couid,couid,coursegrade from grade where coursegrade is null;
    13、查询<学生选修信息表>,查询全部填写了成绩的学生的选修信息,并按照“成绩”从高到低进行排序
    select * from grade where coursegrade is not null order by coursegrade desc;
    二、聚合函数练习
    1、统计<学生信息表>,统计共有多少个学生
    select count(stname) from student;
    2、统计<学生信息表>,统计年龄大于20岁的学生有多少个
    select count(stname) from student where (year(getdate())-year(birthday))>20;
    3、统计<学生信息表>,统计入学时间在1998年至2000年的学生人数
    select count(stuid) from student where year(enrollment) between 1998 and 2000;
    4、统计<学生选修信息表>,统计学号为"S001"的学生的平均成绩
    select avg(coursegrade) from grade where stuid=‘1’;
    5、统计<学生选修信息表>,统计学号为"S001"的学生的总成绩
    select sum(coursegrade) from grade where stuid=‘1’;
    6、统计<学生选修信息表>,查询课程号为”C001”的课程的最高成绩
    select max(coursegrade) from grade where couid=‘1’;
    7、统计<学生信息表>,查询所有学生中的最大年龄是多少
    select max((year(getdate())-year(birthday))) from student;
    三、分组查询练习
    1、统计<学生选修信息表>,统计每个课程的选修人数
    select count(*) from grade group by couid;
    2、统计<学生选修信息表>,统计每个同学的总成绩
    select sum(coursegrade) from grade group by stuid;
    3、统计<学生信息表>,统计每个班级中每种性别的学生人数,并按照班级排序
    select class,sex,count(stuid) from student group by sex,class order by class;
    4、统计<学生选修信息表>,统计每门课程的平均成绩,并按照成绩降序排序
    select avg(coursegrade) from grade group by couid order by avg(coursegrade) desc;
    5、统计<学生选修信息表>,显示有两门以上课程不及格的学生的学号
    select stuid from grade where coursegrade<60 group by stuid having count(stuid)>2;
    6、统计<学生信息表>,统计每个班级中的最大年龄是多少
    select max(year(getdate())-year(birthday)) from student group by class ;
    四、嵌套查询练习
    1、用子查询实现,查询选修“高等数学”课的全部学生的总成绩
    select sum(coursegrade) from grade where couid=(select couid from course where couname=‘高等数学’);
    2、用子查询实现,统计<学生选修信息表>,显示学号为"S001"的学生在其各科成绩中,最高分成绩所对应的课程
    思考:如果该学号学生有两个课程分数都为最高的100分,查询会有什么结果(显示2个结果)
    select couname from course where couid=(select couid from grade where coursegrade in (select max(coursegrade) from grade where stuid=1)
    3、用子查询实现,查询2班选修"数据库技术"课的所有学生的成绩之和
    select sum(coursegrade) from grade where stuid in(select stuid from student where class=‘002’) and couid=(select couid from course where couname=‘数据库技术’);
    4、用子查询实现,查询3班"张三"同学的"测试管理"成绩
    select coursegrade from grade where stuid in (select stuid from student where class='003’and stname=‘张三’) and couid=(select couid from course where couname=‘测试管理’);
    五、联接查询练习
    1、查询"张三"的各科考试成绩,要求显示姓名、课程号和成绩
    select stname,couid,coursegrade from student inner join grade on student.stuid=grade.stuid and stname=‘张三’;

    select stname,couid,coursegrade from student,grade where student.stuid=grade.stuid and stname=‘张三’;
    2、查询"张三"的各科考试成绩中,哪科没有记录考试成绩,要求显示姓名、课程号和成绩
    select stname,couid,coursegrade from student inner join grade on student.stuid=grade.stuid and stname='张三’and coursegrade is null;

    select stname,couid,coursegrade from student,grade where student.stuid=grade.stuid and stname='张三’and coursegrade is null;
    3、查询"张三"的各门课程成绩,要求显示姓名、课程名称和成绩
    select stname,couname,coursegrade from student,course,grade where student.stuid=grade.stuid and course.couid=grade.couid and stname=‘张三’;
    4、查询3班"张三"的"测试管理"成绩,要求显示姓名、成绩
    select stname,coursegrade from student,course,grade where student.stuid=grade.stuid and course.couid=grade.couid and couname=‘测试管理’ and stname='张三’and class=003;
    5、查询所有2000年以前入学的,各班男生的各科考试平均成绩
    select class,avg(coursegrade) from grade,student where grade.stuid=student.stuid and sex='男’and year(enrollment)<2000 group by class ,couid;
    六、外联接查询
    查询”李坚强”所有课程的成绩,并显示学号、姓名、课程号和成绩,没有成绩记录的学号包括:(‘S009’,‘S010’,‘S011’)
    1、使用右联接
    select grade.stuid,stname,couid,coursegrade from grade right outer join student on student.stuid=grade.stuid and stname=‘李坚强’;
    2、使用左联接
    select grade.stuid,stname,couid,coursegrade from student left outer join grade on student.stuid=grade.stuid and stname=‘李坚强’;
    3、对比等值连接
    select grade.stuid,stname,couid,coursegrade from grade inner join student on student.stuid=grade.stuid and stname=‘李坚强’;
    七、补充提高
    1、查询“张三”比“王三”入学早几年
    select year(enrollment)-(select year(enrollment) from student where stname=‘王三’) from student where stname='张三;
    2、查询所在班级和该班内学生的年龄之和,其中每个人的年龄都大于20岁,每个班的年龄之和大于60岁
    select class,sum(year(getdate())-year(birthday)) from student group by class;

    第六章 C语言
    ATM机
    1.取钱 2.存钱 3.查询余额 4.转账

    作业1:存钱、查询、转账的流程图

    软件模块结构图
    需求:十进制一位数加法
    XX.C ——C语言的源文件
    编译 ——转换成二进制的机器语言
    XX.exe ——可执行文件

    不需要编译的脚本语言: PHP ASP JSP PYTHON VBS PEER TCL
    需要编译的高级语言: C VC C# Delphi Java .Net

    注释: // 和/* */

    作业3:绘制流程图中所有界面

    C语言 面向过程的语言 执行过程是自上向下 函数
    F10 单步执行 但不进入函数体
    F11 单步执行 进入函数体
    C语言中的存储
    数据类型
    基本数据类型
    1浮点型
    默认小数位是6位,若输出《6位,完成四舍五入
    若赋予的值小数位《5,后边会随机补数
    vc 对于定义的浮点型变量会默认为double类型,因此会产生警告。想没有警告,强制在赋值语句中的数据后加f. 比如,
    float x;
    x=0.33f;

    数组
    1)一维数据
    定义:数据类型 数组名[长度];
    初始化:1)先定义,后赋值;
    int a[3];
    a[0]=34;
    a[1]=45;
    a[2]=345;
    2) 边定义,边初始化
    float b[2]={4556.234,45.345};
    3) 只给第0个初始化,后边补0
    double c[3]={345.345345};
    访问:下标从0开始遍历数组

    2)二维数组
    定义:数据类型 数组组[行的长度][列的长度];
    初始化: 1)先定义,后赋值

         int a[2][4];
           a[0][0]=3;
           a[0][1]=4;
           a[0][2]=5;
           a[0][3]=6;
           a[1][0]=7;
           a[1][1]=8;
           a[1][2]=9;
           a[1][3]=10;
           2)边定义,变赋值;
             int b[2][4]={{3,4,5,6},{7,8,9,10}};
    

    访问: 行和列的下标从0开始遍历数组

    2字符串
    定义:char 字符串名[长度];
    初始化:先定义,后赋值
    边定义,边赋值
    1)
    char p1[5]=“abcd”; 对 (因为自动补\0占一位)
    char p2[5]=“abcde”; 错
    2)
    char p3[5]={‘a’,‘b’,‘c’,‘d’,’\0’}; 对
    char p4[5]={‘a’,‘b’,‘c’,‘d’,‘0’}; 错
    输出:prinf("%s",p1);
    printf("%c",p1[0]);
    输入:scanf("%s",&p1); /读整个字符串/
    scanf("%c",&p1[2]); /读单个字符/
    注意:赋值的长度小于定义长度时,会逐个补空

    结构体
    边定义,边初始化: struct 结构体名 {
    数据类型 数组名[长度];
    数据类型 变量名;
    …} 结构体变量名={初始化对应值}
    struct student {
    char name[10];
    int age;
    } s1={“zhangsan”,18};
    访问:结构体变量名.结构体内部定义的变量名。
    printf("%s",s1.name);
    printf("%d",s1.age);

    结构体数组
    边定义,变初始化:
    struct 结构体名 {
    数据类型 数组名[长度]; /表示长度/
    数据类型 变量名;
    …} 结构体数组变量名[长度]={{初始化对应值1},{初始化对应值2},} /这里的长度表示多少个,相当于表中的记录数/

      struct student {
                  char name[10]; /*name这个字符串能有效存储字符数9个,还有1位补空*/
              int age;
            } s[2]={{"zhangsan",18},{"lisi",20}};   /*这里的2表示有2条记录*/
    

    3运算符
    算数运算符: + - * /(求商) %(取余)
    关系运算符: > < >= <= ==(等于) != (不等于)
    真(非0) 假0
    逻辑运算符
    && (与) || (或) ! (非)

    常量
    const 数据类型 常量名=值;
    例如,圆周率 const int pi=3.14;

    变量

    1. 变量是什么?

    2. 先定义,后使用
      标准c
      int x;
      x=3;
      int j;
      j=89;

      vc
      int x;
      int j;
      x=3;
      j=89;

    3. 使用赋值语句修改变量值

    4. 变量赋予的值由数据类型决定

    5. 变量包含名字、值和地址

    6. 不同的数据类型在计算机中存储的字节大小不一样
      16位 32位
      int 2个字节 4
      long 4 4
      float 4 4
      double 8 8
      char 1 1

    7. 变量的名字
      首字母:字母,下划线
      包含:字母,下划线,%, 数字
      不能使用c语言的保留字

    8. 全局变量和局部变量
      1)局部变量如何定义:在函数中定义的变量都成为局部变量。离开函数(调用完函数),该变量消失。
      2)全局变量如何定义:在main函数上边定义的变量成为全局变量。对所有的函数都生效。
      3)当局部变量和全局变量同名时,实际上修改的是局部变量。
      常量
      常量的定义

    define 常量名 常量值

    常量名要全用大写字母
    常量没有数据类型
    1.数组
    定义数组
    数据类型 数组名[N] ;
    N 代表数组的个数

    结构体
    定义
    Struct 结构体名
    {
    变量1
    变量2



    }
    例:
    Struct
    {
    Char name[8];
    Char sex[2];
    Int age;
    Int grade;
    } Stu_49[2]={{“张三”,”男”,18,60},{“李四”,”女”,19,100}};
    结构体的显示
    Printf(“ %s”,Stu_49[0].name);
    条件/分支逻辑
    Switch
    switch (表达式)
    {
    case 值1: 处理语句1;
    break;
    case 值2:处理语句2;
    break;
    case 值3:处理语句3;
    break;
    。。。。

    }
    注意1:值的数据类型要和表达式返回值的类型要匹配;
    注意2:不要忘了使用break退出后续执行;
    注意3:表达式要使用括号括起来;
    

    条件 只能输入固定的值
    If
    分支结构
    条件
    情况1: 对应流程图,假分支直接指向后续语句,不含有处理语句
    if (条件)
    处理语句1;
    处理语句2;

    情况2: 对应流程图,处理语句1和处理语句对应真分支,处理3和4对应假分支
    if (条件)
    处理语句1;
    处理语句2;

    else
    处理语句3;
    处理语句4;

    情况3
    If (表达式1)
    if(表达式2)
    语句2;
    Else
    语句3;
    Else
    语句1;
    循环
    For
    循环结构
    定义循环控制变量
    for (控制变量赋初始值;控制变量终止条件;累加(减)器)
    {
    循环体语句;
    }

    while (条件)
    {

    循环体语句;
    }

    do
    {
    循环体语句;
    } while (条件)

    for(表达式1;满足循环条件;表达式2)
    {
    循环体;
    }
    while
    while (表达式)
    {
    循环体
    }
    do…while
    do
    {
    循环体
    }
    While(表达式)
    申请卡号时,多申请一位 并用\0座位数据的结束
    Do while 在条件不满足时,会执行一次do中的循环体
    有参数有返回值的函数
    错误跟踪 写日志
    函数
    函数:

    1. 输出函数
      1.1 printf(控制格式,变量);
      控制格式 %d - 整形
      %c - 字符型
      %ld -长整形
      %f -浮点型 (想控制小数位 %.3f)
      %lf --双精度 (想控制小数位 %.5lf)
      1.2 printf(“你想输出的内容”);
    2. 输入函数
      scanf(“控制格式”,&变量1,&变量2,…);
      %c
      %d
      %ld
      %f
      %lf
      int x,y;
      x=234;
      y=234;
      scanf("%d%d", &x,&y);
    3. 存在的必要性
      1) 职能单一
      2)定位问题
      3)便于使用
      4) 减少代码冗余
    4. 项目中只能有一个main函数。否则移除。
    5. 函数使用
      先定义(在main函数外定义)-》调用-》申明(在main函数外边申明)
      注意1:定义的函数名、调用的函数名、申明的函数名必须同名
      5.无返回且无形参的函数
      定义:
      void 函数名()
      {
      语句1;
      语句2;
      。。。。。
      }
      调用:
      函数名();
      申明:
      void 函数名();
    6. 无返回有形参的函数
      定义:
      void 函数名(形参列表)
      {
      语句1;
      语句2;
      。。。。。
      }
      在这里,形参列表实际上就是变量定义列表,只是因为放在函数定义中就叫叫它形参。
      比如:int x,int y,int z,char m
      调用:
      函数名(实参列表);
      在这里,实参列表的个数和形参列表个数一致;类型一致;实参列表可以相同数据类型的值,也可以是相同数据类型的变量
      申明:
      void 函数名(形参列表);
    7. 有返回有形参的函数
      定义
      数据类型 函数名(形参列表)
      {
      语句1;
      语句2;
      。。。。。
      return 值
      }
      在这里,return的值必须和函数名之前的数据类型匹配。
      调用:
      定义一个和函数返回数据类型相同的变量
      变量=函数名(实参列表);
      申明
      数据类型 函数名(形参列表);
    8. 函数名在一个程序中不能同名
      程序结构
      #include 语句
      #include <stdio.h>
      函数申明
      main函数
      自己定义的函数
      其他
    9. 字节
    10. ascii
      char m;
      m=“k”;
      /* 输出k字符的ascii码*/
      printf(“m=%d\n”,m);
    11. 转义
      \ - 转义符
      \n -控制换行
      \t -控制tab键的距离
      \0 -空
    12. 注释
      单行
      跨行 /* 语句 */
      Void 函数名()
      Void 函数名(参数1,参数2…)
      Int 函数名()
      Int 函数名(参数1,参数2…)
      注:1调用函数时 传入的参数类型 要和函数参数的类型一致,返回值也是一样
      2对有参数没有返回值的函数测试
      3对没有参数 没有返回值的函数测试
      4 测试main()函数 复制了一个定义为test_main()

    补充知识:
    1个字节=8位 编码是ASCII码 又叫ANSI(美国标准码)
    用两个字节表示中文 编码是GB2312
    当16位全部占用时 编码是GB18030
    后来同意标准 全部用16位表示 编码用UTF-8 只翻译16位中的低8位
    注: C语言中main()函数默认是返回int 类型的值

    第七章 Windows环境搭建
    一、名词注解与定义:
    环境:分为{1、生产环境;2、测试环境;3、开发环境。
    生产环境(也称为:上线环境)是运维人员的工作环境,有时候测试人员也会参与运维的部署工作)。
    测试环境:测试人员为了测试软件在生产环境中的功能和性能的表现,而尽量可能的模拟了一个生产环境来进行软件测试。
    开发环境:就是开发人员编写软件代码的工作环境。
    一个软件要从开发环境——>测试环境——>生产环境这个环境流程。
    问:为什么不在开发环境中进行软件测试,要测试环境中进行?
    答:因为开发环境它具有可变性,其影响测试的准确性,所以为了保证数据独立性和其测试的准确性,软件测试最好在测试环境中进行。
    测试环境-分为:1、硬件环境;2、OS(操作系统)环境;3、软件环境。
    其硬件环境和OS(操作系统)环境都是要根据被测软件的需求来搭建;软件环境包括:被测试软件和一些用户常用软件,主要测试被测软件和常用软件之间的兼容性、冲突。
    搭建:先要根据需求架设硬件环境,再根据需求架设OS系统环境,要保证架设的OS系统是无毒的,最后架设软件环境,卸载无用的软件,确认软件的证件号来保证一些不必要的错误和冲突。
    为什么要保证架设的OS操作系统环境是无毒的?因为病毒可能产生一些和被测软件无关的BUG。解决方法:可安装杀毒软件,重装系统来防止和保证。
    被测软件-分为:1、单机版;2、C/S(client/server);3、B/S(browser/server)。三种运行模式。
    C/S(client/server):是分为客户端、服务端和数据库端(如:PPS、QQ需要用户先安装客户端)。其架设的软件会用客户端来分担一部分工作;
    优点:运行速度快、部分数据存放在本地;
    缺点:兼容性差,要根据不同的系统来开发不同的系统版本,成本高和测试成本高。
    B/S(browser/server):是可以用IE浏览器直接访问和运行的一种模式,不用预先安装客户端(如:网页游戏、网上订票系统等)。
    优点:兼容性好,数据保密性好;
    缺点:运行速度较慢。
    软件要根据不同的运行环境、性能的要求来选择使用C/S架设,还是用B/S架设。
    扩展内容:
    app:应用软件,是安装在OS(操作系统)上面的。
    光的三原色:红。绿。蓝。
    服务器(软件):
    1、应用服务器:IIS,Weblogic,JBoss;
    2、Web服务器软件:Apache,Nginx,LightHttpd;
    3、数据库服务器:SQL Server,MySQL(Strucrure Query Language),Oracle;
    4、邮件服务器:QMail,Exchange,Lotus;
    5、FTP服务器

    C/S
    海达票务系统
    1.硬件环境和操作系统(略)
    2.安装SqlServer,安装客户端和服务器端软件
    3.测试数据准备,环境初始化
    DROP DATABASE hdpw1;
    CREATE DATABASE hdpw1;
    RESTORE DATABASE hdpw1 FROM DISK=‘D:\training\doc\win\student\海达票务\hdpw1’;
    4.参数配置
    4.1 Client端配置,和Server端的链接
    4.2 服务器端配置,和数据库的链接
    4.3 数据库端配置(略)
    5.启动整个海达票务系统
    系统更新时,需要更新C和S端,而B/S架构只用更新S端
    B/S
    安装虚拟机:
    1.打开VMWare
    2.新建一个虚拟机
    3.更改光驱加载的ISO
    4.开启电源
    5.将鼠标焦点放到GuestOS里(如何到HostOS?热键)
    6.格式化磁盘
    7.后续安装的步骤
    8.配置网络
    9.安装VMWareTools

    配置共享文件夹:

    进销存系统
    1.安装IIS (通过本机IP访问和netstat查看进程是否成功启动)

    2.把jxc文件夹拷贝到guest
    3.在IIS里新建一个虚拟目录->指向jxc文件夹

    4.设置jxc文件夹的权限

    5.启动相关扩展

    6.启用虚拟目录的父路径

    7.设置默认首页

    OA系统
    1.安装JDK

    2.将Jdk的bin目录追加到环境变量的Path变量里(如:C:\jdk6\bin)
    注:放在path里可以在cmd中输入命令运行,系统将自动定位jdk所在目录

    3.新建一个系统变量 JAVA_HOME,值为jdk的安装目录(如:C:\jdk6)

    4.新建一个系统变量 CLASSPATH,(如:.;C:\jdk6\lib\tools.jar;C:\jdk6\lib\dt.jar) . 指当前目录 注:CLASSPATH (java的类库)

    注: . 表示当前目录 允许jdk查找当前目录
    5.安装Tomcat,解压后运行startup.bat
    通过127.0.0.1:8080 访问,可以看到Tomcat的欢迎页面
    也可以修改conf/server.xml文件,更改Tomcat启动的端口号

    注:在conf下server.xml中查找8080(默认端口)修改端口号 更改配置后要重启服务器
    用startup.bat启动tomcat
    6.安装MySql

    7.部署OA的程序,将程序拷贝到tomcat的webapps目录

    1)先到Mysql里把测试数据导入
    登录mysql mysql -uroot -p
    进入mysql控制命令行,显示如下
    mysql>

    从硬盘上导入一个sql文件

    mysql> source c:~~~~~\oa\setup\redmoon.sql (本质是执行Sql文件里的每一个SQL语句)
    2)修改和数据库的连接、日志和缓存参数
    oa/WEB-INF/proxool.xml 改里面的数据库密码即可

    oa/WEB-INF/log4j.properties 改日志的路径,并创建相应的路径

    oa/WEB-INF/classes/cache.ccf 改缓存的路径

    8.重新启动Tomcat
    访问 127.0.0.1/oa
    admin
    111111
    注:参考 windows环境搭建
    补充知识:
    查看服务:

    MySql相关命令
    show databases 查看有哪些库
    show tables 查看库有哪些表

    desc 表名 查看表结构

    浏览器引擎: 1.渲染页面 2.执行客户端脚本JavaScript 3.执行自由控件
    w3school.com.cn学习前端语言的网站

    Trident IE
    Gecko FireFox
    Presto Opera
    Webkit Safari

    Cookies 保存用户名 密码 根据浏览器、域名保存 一个浏览器、域名一个Cookies 唯一标识一个客户
    Session 和cookies类似 是服务器端保存的
    Session 和cookies是一一对应的
    TCP/IP分四层 OSI七层

    应用层传输协议:http pop3 smtp
    传输层协议:tcp udp
    网络层协议:ip arp
    物理层协议:mac pppo
    三次握手
    目的:建立连接
    1.给服务器发送一个包[SYN] 处于send状态
    2.服务器回复一个包[SYN,ACK] 处于receive状态
    3.给服务器返回一个包[ACK] 两边同步待命 准备发送

    注:参考 网络模型和协议.vsd
    Session/Cookie:Session是存在服务器的,关闭浏览器则删除Cookie存在客户端,可以设置生命周期

    JAVA环境搭建
    1.安装jdk程序
    2.配置环境变量
    1)增加JAVA_HOME,值为jdk的根目录
    2)修改Path,在后面追加 ;%JAVA_HOME%/bin
    3)增加CLASS_PATH,值为 .;%JAVA_HOME%/lib/tools.jar
    3.运行cmd,检查java版本
    java -version
    4.运行一个java程序
    1)编辑文件 HelloWorld.java,内容为
    public class HelloWorld {
    public static void main(String[] args) {
    System.out.println(“Hello, world!”);
    }
    }
    2) 编译java文件,生成字节码文件
    javac HelloWorld.java
    3) 运行字节码文件
    java HelloWorld

    安装Tomcat

    1. 解压至某目录
    2. 运行 bin/startup.bat
    3. 使用浏览器访问
      http://127.0.0.1:8080

    安装MySQL

    1. 运行MySQL安装程序,next
    2. MySQL的配置
      1. 编码
      2. 密码
      3. 服务
    3. mysql -uroot -p

    部署oa

    1. 将程序文件拷贝到tomcat的webapps目录
    2. 初始化测试数据,登录到mysql控制台,运行source命令
      mysql> source c:…\redmoonoa.sql
    3. 程序配置
      1. oa程序和数据库的连接配置
        WEB-INF\proxool.xml
        修改用户名和密码
      2. oa的日志配置文件
        log4j.properties
        log4j.appender.R.File=C:/apache-tomcat-7.0.6/webapps/oa/log/oa.log
      3. oa的缓存配置文件
        WEB-INF\classes\cache.ccf
        jcs.auxiliary.DC.attributes.DiskPath=C:/apache-tomcat-7.0.6/webapps/oa/CacheTemp
    4. 重启一下tomcat
    5. 访问
      http://127.0.0.1:8080/oa
      admin
      11111

    第八章 需求管理
    1.什么是需求
    明确要什么做什么
    2. 需求工程在做什么
    ㈠需求开发:需求获取 需求分析 需求格式化 需求验证
    ㈡需求管理:需求分配 需求评审 需求基线 需求变更 需求跟踪
    3. ★需求变更
    a)为什么要变更:外因:市场,客户。内因:技术不足 缺陷 人员资源
    b)变更影响了什么:SRS HLD LLD SP UI ZI CODE
    c)怎么做变更的控制(需求变更控制目标):控制项目成本,控制项目风险
    d)需求变更的越早,影响范围越小,变更越晚,影响范围越大
        原则 方法
    变更控制的目标 降低变更引起的成本 防止随意的变更 通过评审和会议让用户或者企业负责人在变更上签字来确认变更
    尽量早的发生变更 多设计一些产品原形,由用户确认,
    尽量控制变更影响的范围 尽量不变更,如果变更尽量发生在后续版本
    尽量减少变更所引起的反工 当变更的需求稳定后在介入开发和测试
    降低变更引起的风险 高内聚,低耦合 代码内部干的是一件事,函数与函数之间关联尽量小,尽量使变更只影响到局部,而不影响到整个系统
    4.★需求的跟踪
    a)目的(为什么要需求变更跟踪)将和SRS有关的文档统一管理和关联起来,从而可以从任何一点找到其他文档的相关内容
    b)★★★★★输入、输出(RTM)
    ①开发的需求跟踪:SRS HLD LLD
    ②系统的需求跟踪:SRS ST计划 ST方案 ST用例
    ③集成的需求跟踪:HLD IT计划 ITf方案 IT用例
    ④单元的需求跟踪:LLD UT计划 UT方案 UT用例
    输出(RTM)Requirement Tvace Matrix需求跟踪矩阵
    c)每个阶段,跟踪的内容和变更的跟踪.
    SRS编号 SRS名称 系统测试项ID ST描述 ST子项ID ST子项描述 系统测试用例ID 系统测试用例描述
    HLD编号 HLD名称 集成测试项ID IT描述 IT子项ID IT子项描述 集成测试用例ID 集成测试用例描述
    LLD编号 LLD名称 单元测试项ID UT描述 UT子项ID UT子项描述 单元测试用例代码声明 单元测试用例代码描述
    需求跟踪矩阵的作用:
    开发RTM: 保证所有的需求都被设计实现了
    测试RTM: 保证所有的需求都被测试了
    保证可以通过需求,确定需求变更影响的范围,找到所有的成果物(HLD、LLD、系统测试计划…)
    需求的特点:
    只关心想要什么,不关心怎么去做
    需求工程

    不同阶段的需求变更的影响范围      
           
    需求阶段需求变更影响      
    需求规格说明书 系统测试计划    
    开发RTM 系统测试RTM    
           
    概要设计需求变更影响      
    需求规格说明书 概要设计    
    系统测试计划 系统测试方案 系统测试用例  
    集成测试计划      
    开发RTM 系统测试RTM 集成测试RTM  
           
    详细设计需求变更影响      
    需求规格说明书 概要设计 详细设计  
    系统测试计划 系统测试方案 系统测试用例  
    集成测试计划 集成测试方案 集成测试用例  
    单元测试计划      
    开发RTM 系统测试RTM 集成测试RTM 单元测试RTM
           
    编码以及后期测试阶段需求变更      
    需求规格说明书 概要设计 详细设计 编码
    系统测试计划 系统测试方案 系统测试用例  
    集成测试计划 集成测试方案 集成测试用例  
    单元测试计划 单元测试方案 单元测试用例  
    开发RTM 系统测试RTM 集成测试RTM 单元测试RTM
    补充知识:
    1代码编写原则:
    1).高内聚,低耦合
    2).可续性高
    3).查阅代码编写规范
    2在公司中出现以下问题如何解决
    (1)业务背景不同,导致项目延期
    明确需求文档的格式和标准,尽可能细化需求文档
    (2)需求变化频繁
    建立变更控制
    (3)需求相关的代码,用例找不到,找不全
    建立雪球跟踪

    CR(Changes requirement)需求变更
    CCB(Changes control board)变更控制委员会
    CMO(Configuration management officer)配置管理员
    PM 项目经理
    SWE 软件开发工程师
    STE 软件测试工程师
    QA 质量保证人员
    CI 基线

    —基线变更流程
    1)项目成员提交CR
    2)CMO将CR状态标识为已提交,并将CR提交给CCB进行签发
    3)CCB召开会议对CR进行评估
    4)未通过CMO将CR状态标识为已拒绝并返回提交人
    5)通过,CMO将CR状态标识为已接受,将CR与要修改的配置项发给项目组成员并开放CI的配置库权限
    6)项目组成员执行更改并进行验证
    7)CCB召开会议对修改进行审核,如果通过将CR状态标识为已验证,发给CMO,否则返回修改人
    8)CMO检查验证CR记录,收回配置权限,将CR状态标识为已关闭,返回提交人
    变更控制流程图

    第九章 缺陷管理
    缺陷相关概念
    1什么是缺陷:被测得产品部符合需求和用户使用的实际结果,不符合法律法规
    软件:满足某个功能的逻辑体
    系统:硬件、支撑软件、人员、数据等,综合起来满足某个业务需求的集合体
    2什么可以被定义为缺陷:(缺陷的分类)
    ①缺陷(defect)产品设计与需求设计部符合
    ②错误(error)没有定义的或者未知的错误信息
    ③故障(fault)由于一些原因导致产品失效,重新启动调整后可以恢复用户使用
    ④失效(failure)由于一些原因产品失效,无法自行恢复
    3缺陷提出的目的和意义
    对开发:更好发现缺陷现象,重现和定位缺陷,查找原因,保证所有的缺陷都被修复
    对测试:记录和保证BUG完整一致,回归保证所有的 BUG都验证
    提出问题,把问题交给开发去改
    跟踪缺陷,看是否已经修改
    测试报告,统计数据
    缺陷管理相关概念
    1.BUG管理的目的:
    ①.保证每个缺陷都被修改
    ②.保证每个缺陷都被回归
    ③.缺陷的完整性和一致性
    ④.避免纠纷,降低沟通成本
    2缺陷管理的意义:
    ①提高工作效率(BUG分类,状态负责人)
    ②记录唯一的缺陷信息,保证BUG完整一致(通过设置权限实现)
    ③记录中间环节,是BUG可追溯
    ④统计为测试报告提供数据
    3.参与缺陷管理的角色:
    测试工程师:发现和回归BUG
    测试经理:判断BUG的有效性
    开发经理:分配BUG
    开发工程师:修改BUG
    评审:解决矛盾
    4.缺陷的分类(属性)
    ①按模块分类:例如:登录模块,查询模块
    ②按严重级别分类:blocker阻碍的(不修改该BUG之后的开发测试无法执行)
    Critical崩溃(系统部能用)
    major严重的(严重影响功能使用流程)
    anormal一般的(不会影响主要的功能流程)
    minor轻微的(不会2影响业务流程也不影响使用)
    trvival 界面的
    suggestion建议(可用性,易用性,侧重用户体验)
    ③按优先级别分类:P1----P5(同意 BUG可能会变)
    BUG管理基本流程:

    BUG管理基本流程及相关角色
    1缺陷管理常见流程
    1)BUG回归时没有修改好:测试工程师REOPEN——开发工程师
    2)测试经理认为BUG无效,原因:不是BGU,对需求的理解误差,描述不清楚。BUG不全,重复
    测试工程师NEW----测试经理CAN OPEN-----REJECTED-----测试工程师CLOSED
    3)开发工程师拒绝修改BUG,原因:修复提高项目风险,理解分歧,技术难度大,修复成本高,修改范围广,优先级低
    测试工程师NEW----测试经理OPEN-----开发经理ASSIGNED-----开发工程师CANFIX------开发经理
    4)开发经理拒绝修改或分配BUG,原因:开发与测试已经不同意,偶发,项目风险高,关系进度成败,技术难度大,无法实现,修改成本高,难度大,影响大,影响进度优先级别低
    测试工程师NEW----测试经理OPEN----开发经理ASSIGNED----评审委员会CAN LATER----Y(LATER)-----N开发经理
    5)一般BUG生命周期
    测试工程师NEW----测试经理OPEN—开发经理ASSIGNED----开发工程师fixed----测试工程师CLOSED
    2缺陷状态:
    New新BUG单 Open确认 Reject拒绝 Assigned已分配 Fixed已修复 Reopen回归时未修改正确重新开放 Closed关闭 Later稍后再改 Postpone延迟 Abandon放弃 duplicate重复 verify验证
    测试人员: 无 → New Fixed → Reopen Fixed → Close
    测试组长: New → Open New → Abandon
    开发经理: Open → Reject Open → Postpone Open → Assign
    开发人员: Assign → Fixed
    项目经理: Reject → Passed Reject → Faild Faild → Abandon
    BUG单
    1.BUG单写作准则(5C):
    correct(准确)每个组成部分的描述准确,不会引起误解
    clear(清晰)每个组成部分的描述清晰,易于理解
    concise(简洁)只包含必不可少的信息,不包括任何多余的内容
    complete(完整) 包含复现改缺陷的完整步骤和其他本质信息
    consistent(一致)按照一致的格式书写全部缺陷报告

    2.BUG单模板

    注意:
    1一定可以重现的BUG可以不写“重复几次操作,出现几次,我认为,标题里不能写步骤,不能用主观的话描述,我在 。。。。的,不确定语句:某些好像,禁止使用”之后”,然后之类的语句”之类的话
    2需求规格说明书以外的错误可以当建议报告,不当BUG报告,开发可以改,也可以不改
    3若是随机出现的BUG,要写出操作几次,出现几次
    4若被测软件是跨平台软件,要写上在其他平台下无误
    5禁止写冗余的操作的步骤。常识性的步骤不用写进缺陷操作步骤
    6写明环境数据,如何选择数据,数据如何被破坏
    7一定要交代清楚测试书记,明确处理对那些数据进行操作

    第十章 测试需求分析
    概念:
    1.什么是需求分析:明确做什么,明确测什么,怎么测
    2.需求分析的目的(针对测试而言):
    1)对需求进行细化和分解,从而找到所有的测试点
    2)使从测试覆盖所有的需求(方法:先覆盖业务流,然后模块,关联 非功能)
    3)更细致的需求分析有利于提高测试质量(非软件质量)
    3.测试需求分析的特征
    1)所有的需求项要通过需求分析被核实
    2)测试需求分析应明确指出满足需求的前置条件和不满足需求的前置条件
    3)测试需求分析不涉及具体的测试数据,测试数据是在测试用例中产生
    ★如何做测试需求分析
    1.明确系统框架,有多少个业务流程
    2.明确业务流中有多少个功能测试点,细化分解业务流:
    a)明确每个功能模块的输入、输出、逻辑
    b)满足功能需求的条件和不满足功能需求的条件
    3.明确每个功能的独立处理流程关系
    4.明确功能之间的处理、联系
    5.明确非功能需求和隐性需求 如:安全性、性能、界面美观、易用性等…
    6.系统运行环境包括代码 硬件、软件、外设、数据库、网络
    罗老师的答案
    1考虑非功能性需求
    2挖掘规范需求形成规范需求流程
    3仔细阅读需求规格说明书(找出问题所在)形成问题列表
    4明确该系统的子系统,模块,子模块,功能,子功能(可以借助用例图的方法)
    5明确功能,子功能的流程和逻辑(可以使用活动图,状态图或流程图)
    6挖掘隐性功能,形成隐性功能规范需求
    7找出模块与模块,功能与与功能之间的 关系,确定组合测试需求
    ★UML统一建模语言(Unified Modeling Language)
    1.用例图:被称为参与者的外部用户所能观察到的系统功能模型图
    关系:
    1.关联
    2.泛化 指向父用例 如:
    3.依赖
    a)扩展 指向被扩展者
    b)包含 大的指向小的
    2.活动图:描述了一组顺序的或并发的活动
    状态 活动 开始 结束
    状态转移 循环 集 判断
    泳道
    3包含3个因素:参与者(Actor执行者),系统(Use Case用例),关系(Association关联,Dependency依赖,Generalize继承)

    第十一章 配置管理
    1.什么是配置管理
    a)对所有配置项进行标识,解决了在不同时间周期内,这些文档贯穿整个项目的生命周期并且对配置项进行权限的控制
    b)配置管理的目的(配置管理在解决生命事情,为什么要进行配置管理):解决了保证了软件产品的完整性,一致性,共享性、权限,变更可控、可追溯性
    c)配置管理管理了什么(配置项都包括哪些):配置项 版本 状态
    配置项:项目过程中每个阶段文档产物(SRS,HLD,LLD)代码,开发工具,测试工具,环境(应用服务器,数据库服务器)第三方软件、用户手册,方案、用例等等,
    对象的版本:XX.YY.ZZ.PP
    XX 主版本号——内核程序,核心代号
    YY 子版本号——主要功能、添加功能
    ZZ 维护版本号——增加次要功能,功能改进
    PP 补丁号——SP
    对象的状态状态: 未检查 入基线 冲突 锁
    注:BUG单也算配置项,但是一般单独管理 常用管理工具:QC、Jira、Bugfree、Bugzilla
    2.配置管理流程

    角色:
    项目经理(Project Manger PM)配置管理员(Configuration Mange Officer CMO)开发经理(Development Manger)测试经理 开发工程师 测试工程师
    质量保证人员(Quality Assurance)变更控制委员会(Change Control Board CCB)
    3.SVN实战
    开发可以生成branch 测试经理可以合并branch入trunk 评审可以使trunk入基线并打tag
    启动数据库服务器subversion: 用start svnserve.exe –d –r

    为每个文档建立trunk 然后再为单独的文档建立branch 测试后合并入trunk生成新版本的该文档
    优点:节省空间 缺点:tag版本不配套

    为所有文档建立trunk 每次建立branch都包括所有文档
    优点:所有文档版本相同 缺点:浪费空间
    配置管理工具SVN操作过程手册
    一、如何创建“project”项目版本库
    第一步:在D盘根目录下创建文件夹:“SVNROOT”如图所示:

    第二步:在“SVNROOT”文件夹内创建两个文件夹分别为:“project”,“project1”两个项目。

    第三步:对“project”创建版本库;
    A.选中“project”文件夹,点击右键;

    B.点击“在此创建版本库”。

    C.版本库创建成功后,“project”文件内自动生产以下文件;

    D.打开“conf”文件夹

    备注:对上述三个文件进行解释
    “authz”文件设置“project”操作人员的权限“read、write”;
    “passwd”文件设置操作的用户名和密码;
    “svnserve.conf”文件是“系统配置文件”
    E.对上述3个文件分别进行修改;
    修改“svnserve.conf”

    未修改
    修改处:

    修改方法:将“#”及空格,去掉即可。

    修改后
    修改后对文件另存,存储过程中格式选择“UTF-无BOM”然后点击“保存”。

    点击“保存后”在原文件夹内生产如图文件,这个是ultra edit 的备份文件

    修改完成。
    

    修改“authz”文件

    未修改前
    添加内容:
    p1_group_a=p1_a1
    p1_group_d=p1_d1,p1_d2
    p1_group_t=p1_t1

    [/]
    *=r
    root=rw

    [project:/]
    @p1_group_a=rw
    @p1_group_d=rw
    @p1_group_t=rw

    修改后
    修改后对文件另存,存储过程中格式选择“UTF-无BOM”然后点击“保存”。
    点击“保存后”在原文件夹内生产如图文件

    修改完成。
    修改“passwd”文件

    未修改前
    添加内容为:
    p1_a1=p1_a1
    p1_d1=p1_d1
    p1_d2=p1_d2
    p1_t1=p1_t1

    修改后对文件另存,存储过程中格式选择“UTF-无BOM”然后点击“保存”。
    点击“保存后”在原文件夹内生产如图文件

    修改完成。
    二、如何查看创建的“project”项目版本库
    通过“版本库浏览器”进行查看
    任意空白处点击“鼠标右键”

    点击:“版本库浏览器”

    输入:“svn://localhost/project”

    备注:“localhost”本机的IP地址;
    Project为项目工程名;
    点击“确定”

    问题:为何会出现“无法连接主机“localhost”:由于目前机器积极拒绝,无法连接”
    分析:“Subversion”服务器端“svnserve”服务未启动;

    如何启动“svnserve”服务,操作步骤:
    A.桌面“开始”----“运行”----输入“cmd”;

    B.用“DOS”命令打开此服务
    首先找到该文件:cd c:\Program Files\subversion 进入该目录

    查看该目录里面有哪些文件,用到命令“dir”

    3启动该项服务
    输入:start svnserve.exe –d –r D:/SVNROOT
    备注:D:/SVNROOT为客户端路径。

    运行后弹出一个窗口

    表示此服务已经运行。

    备注:在SVN运行过程中,此窗口 必须一直打开运行。

    服务运行后再次查看创建的版本库

    如图所示,创建版本库成功。
    三、在版本浏览器里面,创建文件,并进行检出
    如何在版本库里面创建文件
    A.在根目录下点击“右键”点击“创建文件夹”

    C.点击“创建文件夹”

    输入文件夹名“trunck”
    D.填写“创建日志”

    E.认证:输入用户名称和密码:
    用户名:p1_a1
    密码:p1_a1

    F.创建成功
    按照此方法在“trunck”根目录下创建“需求分析、RTM文档、测试报告、代码文档、概设文档、详设文档、用例文档”7个文件夹。

    在代码文档里面添加5个代码程序

    A.将5个代码程序 选中后直接拖入“代码文档”中;
    B.点击“复制项到此”

    添加成功。
    C.同样的方法,添加另外4个文件:min.c;mul.c;div.c;main.c;

    添加完成。
    检出添加的文件夹及文件
    A.A.在D盘根目录下建立文件夹“worksp”

    备注:此文件夹为空文件夹
    B.空白处点击“点击右键”

    C.点击“SVN检出(K)….”

    D.检出完成

    备注:检出成功
    E.打开“wroksp”文件夹,出现“trunck”文件夹

    F.打开“trunckt”文件

    G.打开“代码文档”

    备注:版本库浏览器里面的文件全部被检出,检出成功(如图所示)。

    四、如何对该项目入基线
    第一步:打开D盘文件夹“worksp”找到“trunck”文件夹。
    第二步:选中“trunck”文件夹点击“右键”
    选择“分支/标记”

    点击“确定”

    第三步:在D盘根目录中选择“worksp”文件夹,点击“右键”选择“提交更新”

    第四步:查看入基线是否成功,打开文件“worksp”

    第五步:通过“版本浏览器”进行查看;

    入基线成功。

    五、分支文件进行合并
    第一步:在D盘根目录下创建两个文件夹“group1”、“group2”

    第二步:用入基线的操作的方式,创建两个分支“branch1”、“branch2”

    “group1”文件夹

    “group2”文件夹

    第二步:
    “group1”–“branch1”中“代码文档”内添加文件:chengfang.c
    “group2”—“branch2”中“代码文档”内添加文件:kaifang.c
    以添加“chengfang.c”为例:
    A.添加文件“chengfang.c”

    B.选中“chengfang.c”文件点击“增加”

    C.点击“增加”后

    D.选中后“右键”点击“SVN提交”:

    备注:未提交前“代码文档”显示为:

    E.点击确定、添加成功

    添加“kaifang.c”
    同样的方法进行添加
    添加成功后:

    校验是否添加成功
    方法1:点击“worksp”进行更新,检查“branch1”、“branch2”中是否存在添加的两个文件;
    方法2: 版本浏览器查看

    将“chengfang.c”和“kaifang.c”进行合并;
    A.“合并”前“trunck”里面如图

    B.“合并”步骤:
    a.点击 “worksp”中的“trunck”点击“右键”

    将“kaifang.c”合并

    同样的方法对“branch1”中的“changfang.c”进行合并
    C.对“trunck”文件右键进行“提交”

    D.查看合并是否成功
    方法1:“worksp”----“trunck”----“代码文档”查看

    方法二:版本浏览器进行查看

    六、分支冲突的解决
    在D盘根目录下创建2个文件夹分别为“dev1”、“dev2”

    分别点击该文件夹的“右键”—“检出”—“trunck”

    针对“dev1”里面的“代码文档”

    进行修改添加“除数不能为0”;

    修改后“保存”

    “右键”点击“提交”

    针对“dev2”—“代码文档”里面

    进行修改添加“除数不能为0”;

    修改后“保存”

    “右键”进行提交“提交”

    提交失败,起冲突。
    解决冲突
    A.对“dev2”中的“div.c”文件进行更新

    B.更新完成后打开该文件:

    C.对该程序进行修改,完成后对该文件进行“提交”

    D.然后对“代码文档” —“右键”进行“更新”

    E.查看冲突是否解决
    方法1:“worksp”—“trunck”—“代码文档”—“dev.c”
    方法2: 版本浏览器进行查看。

    第十二章 系统测试
    概念:
    1什么事系统测试
    在对软件,硬件,外设,第三方软件,数据,人员,环境,代码,数据库考虑了的情况下,尽可能的模拟用户的使用环境下所做的测试
    另一答案:将已集成的软件系统,作为整个基于计算机系统的一个元素,与计算机硬件、外设、数据、支撑软件、人员等其他元素结合在一起,在实际运行环境下,对计算机系统进行的一系列测试活动
    注:代码称之为数据流,数据称之为信息流
    2系统测试在做什么工作
    验证系统是否满足需求规格说明书SRS
    验证是都满足隐性需求
    验证系统可以支付用户使用
    3系统测试的工作过程
    系统测试个阶段(计划,设计,实现,执行)的输入,输出,入口准则,出口准则
    4系统测试的对象:对整个产品(整个软件系统)
    5系统测试依据什么:SRS
    6系统:整体性、独立性、功能性、环境适应性
    7软件系统:包括支撑软件、数据、硬件、外设、人员及目标软件
    分类:
    功能测试:(Function testing中国 Feature testing国际)
    根据产品的功能是否满足用户需求
    工作内容 1业务,业务流是否正确实现
    2功能点是否正确实现
    3输入是否正确实现
    4输出是否正确实现
    测试工具:QTP(使用 B/S和C/S软件),LR(C/S软件),RIA TEST(针对Flash,Flex软件,用Flash编写),Selenium(firefox的插件), IBM Rational Robot
    工作原理:模拟用户操作
    性能测试:(Sercarity testing)
    定义:验证产品是否满足性能需求
    常用测试点:响应时间和资源性能(CPU,I/O,内存,信道,传输速度)
    例:1.先确认记事本的性能需求(加入50万行内正常)
    2.先输入50万行文本(造场景)
    3.监控所占用的系统资源
    4.报告,提出改进意见
    注:1内存和硬盘的区别
    内存临时存储,电脑关机,信息就消失,内存容量速度快
    硬盘是靠执行存储,断电后也能保存数据,硬盘存储量大,速度慢
    2信道与宽带有关,与访问人数有关
    3吞吐量,每个时间单元的处理数据
    4测试方法:压力测试(stres stesting)短时间
    负载测试(load testing)正常负荷下,长时间运行
    容量测试(volume testing)最大访问量
    5高级录制能找到每个按钮的控件名,低级录制只能找到鼠标移动到的位置
    6没有需求的性能测试无法进行
    测试工具:LR,Webload , Jmeter(开源软件,JAVA编写),Silk Performance
    工作原理:(B或者C端通过传送协议与S进行通信)
    录制协议,模拟多个永和传送协议(可以几句到以点,同时发给S也可以迭代发送给S)通过IP骑在变成不通的IP地址,突显多线程并发操作
    安全性测试:(Security Testing)

    定义:验证产品在系统的内部的安全保护机制和系统外对入侵的防护能力
    考虑内容:1内部包括身份验证,权限,数据的完整一致,数据的保密性(DB中有些数据加密保存)
    2外部,病毒木马,未授权攻击,传输数据安全(传输过程中密码加密,通过HTTP协议传输)
    注:病毒与木马的区别:病毒主要是针对计算机程序的破坏,木马主要用于盗取计算机内的相关机密
    测试工具:MBSA(Microsoft Basehne Sercurity Analyzer),IBM Rational Appscan,X-scan(某黑客组织开发)
    工作原理:监控服务器或客户端那些端口应该被禁止
    安装测试
    定义:产品的安装过程和结果进行测试
    工作内容:根据软件的测试特性列表,软件安装,配置文档,设计安装过程的测试用例
    包括安装前
    安装后
    安装过程中
    安装时异常终止包括:进程终止(操作系统未关闭)断电模式,断网
    测试对象:安装文件、安装系统、安装文档、配置项
    安装后检查:1件是否产生,是否正确
    2否按人工修改的方式安装
    3装日志是否记录正确
    4否有临时目录,垃圾文件,是否清理掉冷补丁(需要关闭系统的补丁) 热补丁(多数网站补丁属于热补丁)
    GUI测试(Graphical user interface)
    又称为用户界面测试,接口测试
    注:GUI测试无法脱离功能测试而独立存在,否则只能测试外观,布局,无法测试行为
    测试内容:对界面元素进行测试,
    验证产品界面是否与SRS设计一致(包括布局,外观,配色,元素行为,元素功能)
    验证界面元素的交互是否正确
    界面元素包括:整体界面,独立元素组合,独立元素
    思路:先找整体界面,再测独立元素组合和独立元素(据对用户的影响严重程度不同)
    测试步骤:对完整的界面进行测试 (包括布局,功能组合,页面展现的外观)
    组合元素(包括拆分,组合行为,独立行为,展现,外观)
    独立元素(包括外观,为)
    工具:所有做功能测试的工具都可以做GUI的测试
    可用性测试(Usability testing)
    又称易用性测试

    定义:验证用户管理和使用软件的容易程度
    工作内容:是否符合用户的实际习惯
    是否符合用户的特殊要求
    操作是否合理,简单,容易理解
    是否有明确的提示可以指导下一步操作
    异常性测试
    系统允许的操作
    健壮性测试,系统不允许的操作
    文档测试
    说明书,与易用性一起做
    备份测试
    主要测试备份策略
    目的:为了解决风险
    备份策略包括:本地备份,异地热备份(实时备份),本地异步备份,异地异步备份
    还原策略:(又称恢复策略)
    配置测试
    又称兼容性测试
    包括软件配置和硬件配置,验证系统都可以使用那些软硬件配置
    网络测试

    主要测试网络中的协议和数据
    工作内容:1网络协议测试(协议是否正确)
    2网络传输是否正确(不同网络是否正常)
    3网络结果测试

    第十三章 用例设计
    等价类
    定义:1、等价:如果多个输入在程序中处理方式(路径)相同,则认为这些输入是等价的,测试一个即可。(前提:测试不能穷举)
    2、输入:分为两类,有效输入(可以保存)、无效输入(不可保存)
    3、结合:有效等价类、无效等价类
    满足规则:只需寻找一个全部满足规则的(有效等价类)
    不满足规则:需分开,每条不满足条件的举出一个,方便定位错误(无效等价类)
    规则的几种情况:
    1 若规则是布尔式的
    有效、无效分别取一个 一个真,一个假
    2. 若规则是区
    有效的取一个 无效的,在小于区间的取一个,大于区间的取一个,空或零取一个
    3. 规则是集合:
    有效取一个 无效的在集合外取一个
    4. 规则是必须满足的一个条件:
    对无效,要细分无效(先试试其他有效等价类,再试试全部等价类全都不满足)
    例:邮箱注册,注册名只能以小写字母开头,设计无效等价类时,先试试其他有效等价类,如大写字母、数字等,再试试其他有效全部都不满足的情况
    有效等价类:程序规格说明有意义,合理的输入数据
    无效等价类:程序规格说明无意义,不合理的输入数据

    ASCII码
    7位 表示27=128个字符 每个字符存储占用1个字节
    分类:不可见字符
    控制字符:LF(换行)、CR(回车)
    通信字符
    NULL(空)
    可见字符
    空格
    数字
    字母(大写、小写)
    符号
    练习
    1.1年龄注册
    注册页面要求输入年龄,限制:1到150期间的正整数
    1、需求分析—找出全部的输入条件
    1)、正整数
    2)、[1,150]
    注意:分解的过程中,条件之间不用组合(完全独立),在设计有效用例输入的时候再考虑组合(一对多)
    2、绘制等价类表格
    条件 有效等价类 有效编号 无效等价类 无效编号
    正整数 >1 A01 数字 小数 B01
    负数 B02
    0 B03
    非数字 空(NULL) B04
    空格 B05
    字母 B06
    符号 B07
    [1,150] [1,150] A02 <1 B08
    >150 B09

    3、设计测试用例输入
    原则:有效输入—尽可能多去覆盖有效等价类 (一对多)
    无效输入—只能覆盖一个无效等价类 (一对一)
    目的:A、出现问题可以更好的去定位
    B、有可能第一个无效处理后,后续无效值被漏测
    输入序号 有效输入值 覆盖有效等价类 输入序号 无效输入值 覆盖无效等价类
    1 100 A01、A02 2 1.8 B01
    3 -9 B02
    4 0 B03、B08
    5 空(NULL) B04
    6 空格 B05
    7 W B06
    8 @ B07
    9 200 B09
    1.2.年龄注册
    某保险公司注册页面要求输入年龄,限制:1到150期间的正整数,其中:
    [1,10] 适用的费率 10%
    [11,50] 适用的费率 30%
    [51,150] 适用的费率 80%

    条件 有效等价类 有效编号 无效等价类 无效编号
    正整数 >1 A01 数字 小数 B01
    负数 B02
    0 B03
    非数字 空(NULL) B04
    空格 B05
    字母 B06
    符号 B07
    [1,150] [1,10] A02 <1 B08
    [11,50] A03 >150
    [51,150] A04

    输入序号 有效输入值 覆盖有效等价类 输入序号 无效输入值 覆盖无效等价类
    1 5 A01、A02 4 1.8 B01
    2 30 A01、A03 5 -9 B02
    3 100 A01、A04 6 0 B03、B08
    7 空(NULL) B04
    8 空格 B05
    9 W B06
    10 @ B07
    11 200 B09
    1.3.扩充
    考虑全角和半角问题(GB231)
    其中,半角占1个字节
    全角占2个字节

    字符集
    1、ASCII
    2、GB2312 -> GB18030 一个汉字占2个字节
    BIG5(繁体)
    3、ISO Unicode (UTF-16) -> UTF-8(变长存储) 一个汉字可能占3个字节
    条件 有效等价类 有效编号 无效等价类 无效编号
    正整数 >1(半角) A01

    			0	B03
    >1(全角)	A02	半角字符	空(NULL)	B04
    			空格	B05
    			字母	B06
    			符号	B07
    		全角字符	空格	B08
    			字母	B09
    			符号	B10
    		汉字
    

    (字符集) GB-2312 B11
    BIG-5 B12
    [1,150] [1,150] A03 <1 B13
    >150 B14

    分解粒度:根据功能的重要性决定(用例图----执行者角色,考虑用户的关注功能)
    根据成本、时间决定
    取消负数、小数的原因:
    1、前提:在编辑框内输入年龄,程序在接收编辑框的内容时,一般以字符(或字符串)的形式接收,再根据需要进行类型转换,如年龄,需要转换为整型
    2、小数中的“小数点”和负数中的“负号”都认为是符号,不允许保存
    边界值
    取值(5个):上点、内点、离点
    1、上点、内点取值与区间的开闭无关
    2、离点和上点互为有效
    作用:(有序、有范围)等价类的补充
    补充:考虑数据类型的边界
    如 int 类型 占4个字节 即 32bit 取值范围[-231, 231-1]
    上点:边界上的点
    内点:区间内的点
    离点:离边界值最近且与上点不属于同一等价类的点(对于小数,没有离点,不用取)
    规则的几种情况:

    1. 规则是区间:
      按上点、内点、离点取
    2. 规则是取值的个数:
      取最小、最大、中间个数
      3.规则是a~z序列:
      取a、z
      4.规则是集合:
      取一个集合内的,取一个集合外的
      (0,20)上点是0,20 离点是1,19 [0,20]上点是0,20 离点是-1,21
      若规则是下拉菜单:建议每个下拉值都选择一个
      2.1.年龄
      条件 有效等价类 有效边界值 有效编号 无效等价类 无效边界值 无效编号
      正整数 >=1 上点:1 A01 数字 小数 B01
      内点:100 A02 负数 B02
      离点:0 0 B03
      非数字 空(NULL) B04
      空格 B05
      大写字母 上点:A B06
      上点:Z
      内点:M
      符号 离点:@ B07
      离点:[
      [1,150] [1,150] 上点:1 A03 离点: 0 B08
      上点:150 A04 离点: 151 B09
      内点:100 A05
      有效用例输入:1 、100、150
      2.2.用户名注册

    1、测试需求分析
    1、内容:字母、数字、
    2、长度:[6,18]
    3、约束:字母开头
    字母或数字结尾
    不允许重名
    不允许使用保留字
    自动去除首尾空格
    2、等价类划分
    条件 有效等价类 有效编号 无效等价类 无效编号
    内容 字母 大写字母 A01 符号(除下划线) B01
    小写字母 A02 NULL(空) B02
    数字 [0,9] A03 空格 B03
    下划线 下划线 A04 GB2312 B04
    BIG5 B05
    长度 [6,18] [6,18] A05 <6 B06
    >18 B07
    约束 字母开头 大写字母开头 A06 数字开头 B08
    小写字母开头 A07 下划线开头 B09
    符号(非下划线)开头 B10
    汉字开头 B11
    字母或数字结尾 大写字母结尾 A08 下划线结尾 B12
    小写字母结尾 A09 符号(非下划线)结尾 B13
    数字结尾 A10 汉字结尾 B13
    不允许重名 不重名 A11 重名 B15
    去除首尾空格 A12
    不允许使用保留字 不使用 A13 使用保留字 B16
    3、用例设计
    序号 有效输入 有效边界值 序号 无效输入 无效边界值
    1 (当前系统无AAb_4)
    AAbb_4 A01、A02、A04、A03
    A05、A06、A10
    A11、A13 5 abc@a B01
    2 (当前系统无AAb_4)
    aAbcvb_A A01、A02、A04、A03
    A05、A07、A08
    A11、A13 …………
    3 (当前系统无AAb_4)
    aA555b_b A01、A02、A04、A03
    A05、A07、A09
    A11、A13 (当前系统存在aaf5bc)
    (空格)aaf5bc(空格) B15
    4 (当前系统无aaf5bc)
    (空格)aaf5bc(空格) A12 Administrator B16
    2.3.变量命名
    在某一版的编程语言中对变量名称规格作如下规定:变量名称是由字母开头的,后跟字母或者数字的任意组合构成,并且区分字母大小写。编译器能够区分的有效字符数为8个,并且变量名称必须先声明,后使用,在同一声明语句中,变量名称至少必须有一个。
    1、测试需求分析
    内容:字母、数字
    长度:[1,8]
    约束:字母开头
    大小写敏感
    先声明后使用
    变量的个数[1,?] (需要和需求人员沟通)
    在同一作用域中不允许重名
    不能使用关键字
    2、等价类划分
    3、确定边界值
    4、设计用例输入
    2.4.进销存价格

    代码实现:
    if (isNumberString(document.form2.tichen.value,“1234567890.”)!=1)
    {
    alert(“价格只能为数字!”);
    return false;
    }

    根据代码的实现,价格编辑框只接受键盘的“数字键”和“小数点”共11个字符

    等价类
    条件 有效等价类 无效等价类
    内容 数字 字母
    字母、符号处理方式(路径)相同,认为都是等价的
    小数点
    约束 小数点最多有1个 >1个小数点

    2.5.Windows文件命名
    目录 目录长度 文件最大长度 目录+文件最大长度
    C:\ 3 255个 = 258
    C:\ABCD 7 251个 =258
    C:\ABCD\AAAA 12 246个 =258

    根目录: 255
    非根目录: 254 (文件夹最小长度为1)

    1、测试需求分析
    内容:非“/😗?"<>|”的字符
    长度: 根目录: 255
    非根目录: 254 (文件夹最小长度为1)
    约束:同目录下不能重名(去除首尾空格)
    不同扩展名使用不同的图标
    不能为空
    总结
    1、适用范围:针对程序的输入
    2、使用步骤
    1)、测试需求分析,找出全部条件(显示、隐士)(条件之间不能交叉或者组合,到设计用例的时候再考虑多条件的组合)
    2)、划分等价类
    划分依据:相同的处理方式(路径)
    分类:有效等价类、无效等价类
    3)、使用边界值补充(有序、有范围的)等价类
    内容:上点、离点、内点
    要求:上点、内点与区间开闭无关,离点和上点互为有效
    分类:将边界值分为有效边界和无效边界,填入等价类表格
    4)、对每个等价类进行唯一的编号
    5)、设计用例的输入
    原则:有效等价类,一对多
    无效等价类,一对一
    3、优点:对输入的考虑充分
    4、缺点:如果不清楚系统的实现方式,造成大量的冗余用例(黑盒方法共有)
    对于多输入的组合不太适宜
    规则的几种情况:
    1 .若规则是布尔式的
    有效、无效分别取一个 一个真,一个假
    2. 若规则是区间
    有效的取一个 无效的,在小于区间的取一个,大于区间的取一个,空或零取一个
    3. 规则是集合:
    有效取一个 无效的在集合外取一个
    4. 规则是必须满足的一个条件:
    对无效,要细分无效(先试试其他有效等价类,再试试全部等价类全都不满足)
    例:邮箱注册,注册名只能以小写字母开头,设计无效等价类时,先试试其他有效等价类,如大写字母、数字等,再试试其他有效全部都不满足的情况
    有效等价类:程序规格说明有意义,合理的输入数据
    无效等价类:程序规格说明无意义,不合理的输入数据
    边界值
    上点:边界上的点
    内点:区间内的点
    离点:离边界值最近且与上点不属于同一等价类的点(对于小数,没有离点,不用取)
    规则的几种情况:

    1. 规则是区间:
      按上点、内点、离点取
    2. 规则是取值的个数:
      取最小、最大、中间个数
      3.规则是a~z序列:
      取a、z
      4.规则是集合:
      取一个集合内的,取一个集合外的
      (0,20)上点是0,20 离点是1,19 [0,20]上点是0,20 离点是-1,21
      若规则是下拉菜单:建议每个下拉值都选择一个

    第十四章 系统测试执行
    测试用例
    编号组成: 项目名—测试阶段—需求—用例
    测试环境搭建文档:
    1.为日后回归测试等搭建环境做指导
    2.刚开始写完后,评审,防止日后因环境搭建而引起测试时的问题
    3.可为日后上线的文档做参考
    4.可以做自动化步骤的参考
    5.项目留存
    用例执行:
    1.严格按照用例步骤,执行用例
    2.发现结果与预期结果不一致:
    a)重复步骤,重现发现的问题
    b)找同类型的数据,重新执行用例
    c)定位发现问题的步骤 (每执行一步都要做记录)
    3.提交BUG (先确认不是重复BUG)
    填BUG报告:
    (一)若开发返回”不可重现的BUG”,可能原因:
    1.开发步骤不对
    2.测试环境和开发环境不同
    3.出现时有概率的,或者其他原因导致,不是每次重现 (环境、概率)
    (二)合并BUG的原则
    1)同样的原因产生的BUG可以合并
    2)与开发沟通后如果修改一处就可以修改一些BUG可以合并
    3)当BUG之间有制约关系,BUG可以合并
    (三)补充 为什么.TXT文件中报春”联通”重新打开后会有乱码
    文件保存格式默认为ASCII码,但恰好”联通”是以EF开头的,保存时误认为UFT-8格式,导致重新打开时歘先乱码
    (四)书写测试用例应该注意一下几点
    1)测试输入数据必须是唯一的,并且明确的
    2)步骤要完整,按照步骤可以测试测试点和预期结果,建议每个步骤后面都有预期结果,步骤要编号
    3)结果要和需求规格说明书完全一致,如果SRS没有明确结果,需要产品人员补充和定义
    4)无效等价类不能合并

    第十五章 QC(Quality Center)
    QC (Quality Control)质量控制
    QC(前身TD Test Director与QTP、LoadRunner同是MI公司开发)
    QC是B/S架构的
    QC 9.0支持JBoss、IIS两款服务器支持SQL Server和Oracle两个数据库
    QC默认端口是8080 数据库连接端口是1433
    Quality Center QC前台
    Site Administration QC后台
    Add-Ins Page QC插件
    Qcsiteadmin_db 是保存后台数据的 而前台中项目的数据,是单独保存在另一个数据库中
    QC预置5个用户组,只能查看,不能修改权限
    Developer Project Manger QATester TDAdmin Viewer
    外部测试人员,只有Defects Module权限,只执行测试,报BUG
    组内测试人员,有QC所有模块权限
    QC后台:
    Site Project 设置项目
    Create Domain 建立区域
    Create Project 建立项目
    Create an empty Project 建立一个空项目
    Create project by copying data from an existing project
    从已有项目拷贝创建一个新项目

    Create a project by importing data from an exported Quality Center project file
    从一个已有项目的导出文件创建一个新项目

    QC前台:
    TOOLS下的Customize…选项
    Customize Project Entities 设置输入项 可添加新选项
    Customize Project Lists 项目列表 可设置下拉列表中的项
    Requirements 需求模块
    菜单栏下Requirements菜单项
    Covert to Tests 将需求转换成测试用例 用于比较系统的测试
    Generate Test…将需求生成测试执行 用于临时的测试
    菜单栏中View菜单项
    Expend 扩展,全部展开
    Collapse 收起
    Numeration 排序
    Full Coverage 完全覆盖(考虑测试覆盖率)
    Requirements Tree 需求树结构 用于项目经理等管理者
    Requirements Grid 需求表结构 用于浏览者(可用Favorites)
    Requirements Coverage 需求覆盖率 用于测试人员
    Coverage Analysis 需求分析视图 用于测试管理者
    菜单栏中Analysis菜单项
    Reports选项下
    Standard Requirements Report 标准需求表 用于评审
    Tabular Requirements 概要表 用于产品经理
    Requirements with Coverage Tests 带覆盖率的表 用于测试经理
    Requirements with Coverage Tests and Steps 带步骤的 用于测试用例评审
    Requirements with Linked Defects 带缺陷的 用于生成测试报告
    Graphs选项下
    Progress 给项目经理
    Requirements Coverage 给测试经理
    Trend 给BOSS
    工具条中Set filter/Sort 过滤器 用*做通配符
    View Order 结果排序 同级才能排序
    双击一条需求 Requirement Details 需求详细信息
    Coverage 覆盖率
    Linked Defects 连接缺陷
    需求的状态:not covered not run not complete passed failed
    Test Plan 测试用例模块
    点击一条测试用例,右侧在Design Steps标签页下
    Call to Test 调用测试用例 只能调用到一个参数 可用于回归测试
    Generate Script 生成脚本
    Insert Parameter 添加参数
    Renumber Steps 重新写序号 (不影响步骤的内容)
    菜单栏中Tests菜单项
    Flag for Follow up 标记一个执行
    Mark as Template Test 标记成为模板用例
    菜单栏下View菜单项
    Trace Changes 变更跟踪警告
    Analysis中所有报表均是测试工程师用
    Test Lab 测试执行模块
    需要添加一个集,用例才能被添加到集
    菜单栏下Test Sets菜单项
    Reset Test Set 重置测试集 用于测试回归,所有状态均为No Run
    Purge Runs 清理执行的状态 清理执行的状态,上个是全部,此为条件式
    状态优先级:
    Failed > Not Complete或N/A或No Run > Passed
    Trace Changes
    在Test Plan中,跟踪的是需求Requirements
    在Test Lab中,跟踪的是缺陷Defects状态时”Fixed”时
    在Defects中,跟踪的是Test Lab成功运行时
    其中红色! 表示未看过 灰色表示已看过
    QC中,Defects只能连接自己,不能连接其他而 Requirements、Test Plan、Test Lab可以连接其他任何一个,不能连接自己,所以,Defects单独划出一个模块
    权限设置:
    需求人员:写需求
    测试人员:用例、BUG、执行用例
    开发人员:改BUG
    项目经理:所有权限
    当产生纠纷时,在设置中增加一个状态,在Defects中的Description选项中的Comments下添加分歧的描述、原因等等,分配给解决纠纷的人,只有被分配的人可以修改状态,其他人不能更改

    变更控制:
    能否变更 用Reviewed(评审)字段,将之设置成必填项,默认值是Not Reviewed
    设置权限中,不给需求人员修改Reviewed的权限

    第十六章 PYTHON
    Python 是面向过程、面向对象,跨平台的高级脚本语言。 是解释性语言,执行源代码,提供丰富的库,支持多线,多进程,网络编程,可以支持C/C++的代码,可以测试C/C++和Python开发的单元产品,Python越来越多的成为开源测试自动化工具的首选语言
    Python的安装
    1.安装之前,先退出杀毒软件
    2.安装 缺省安装
    3.完毕后,配置系统环境变量 path (把解释器pathon.exe所在目录加入path)
    Python的集成环境:
    1.Python文件夹下IDLE
    2.新建文件 New Window
    3.保存(用Save As…后缀.py)
    4.运行方式:
    a)Run Module (若提示”Socket Error”是因为杀毒软件引起的错误)
    b)命令行方式 在DOS下,进入文件目录,输入命令python hello.py
    python可以用#来做注释
    输入中文时在前面加#coding:gbk
    在GUI界面下 若不加保存时会报警告

    补充知识:
    DOS命令:
    切换盘符 盘符名:
    进入文件夹 cd 文件夹名\文件夹名…
    退到根目录 cd
    退出一层目录 cd…
    数据类型:
    Str字符型字符串(可以用单引号、双引号) Int 整形 long长整形 float浮点型 bool(布尔型):True真/False假(首字母大写,不用加引号)
    运算符:
    算术运算符: + — * /
    逻辑运算符: and or not
    比较运算符: 相等 = = 不等于 != < > <= >=
    缩进:
    在行首用空格或者Tab 缩进相当于C语言中的{ } 表示对应一段完整的逻辑
    一般用TAB 因为一段代码中不能同时使用两种缩进方式,默认是TAB
    控制语句:
    IF条件
    1 if (条件1):
    处理语句1
    处理语句2
    处理语句3

    语法解释:满足条件1执行语句1,2,3,不满足条件1执行语句
    2 if (条件1):
    处理语句1
    处理语句2
    elif
    处理语句3

    语法解释:满足条件1执行语句1,2不满足条件1,执行语句3
    3 (1) if (条件1): (2)if (条件1):
    处理语句1 处理语句1
    处理语句2 处理语句2
    elif (条件2): else:
    处理语句3 if(条件2):
    处理语句4 处理语句3
    … 处理语句4
    else: else:
    处理语句5 处理语句5
    处理语句6 处理语句6
    … 。。。。
    处理语句7 处理语句7

    语法解释:满足条件1执行语句1,2,7,不满足条件1,满足条件2,执行语句3,4,7,不满足条件1,2,执行语句5,6,7
    注:条件中可以用逻辑运算符 比较运算符
    条件后面要加“;”
    WHILE循环
    while (条件):
    处理语句1
    处理语句2

    处理语句3

    语法解释:条件为真(满足条件)执行语句1,2,在判断条件,还满足条件的话,还执行1,2直到不满足条件,执行语句3

    while (条件1):
    if (条件2):
    处理语句1
    处理语句2

    elif (条件3):
    处理语句3
    处理语句4

    else:
    处理语句5
    处理语句6

    处理语句7

    语法解释:条件1为真,判断条件2,条件2为真,执行语句1,2,在判断条件1,当条件1 为假,执行7
    条件1为真,判断条件2,条件2为假,,在判断条件3,当条件3为真,执行语句3,4,判断条件1,当条件1为假,执行语句7
    条件1为真,判断条件2,条件2为假,,在判断条件3,当条件3为假,执行语句5,6,判断条件1,当条件1为假,执行语句7
    FOR循环
    for 变量 in 集合函数: 注:range是一个集合函数
    处理语句1
    处理语句2

    处理语句3

    语法解释:变量值在这个集合函数之内执行语句1,2,循环执行1,2,直到变量值不在集合函数范围内,执行语句3
    例题:for I in range(1,7); #循环了6次
    print”sjsddsj”
    BREAK \ CONTINUE
    break \ continue 只能用在循环语句中(for ,while)。
    break:跳出循环,执行循环体外的第一条语句,无论循环体内还有多少语句
    continue:跳过循环体内的语句去执行循环条件的条件判断

    	while (条件1):
    		  处理语句1
            处理语句2
    			if (条件2):
        			处理语句3
       			break
    		 	else:
        			处理语句4
        			continue
    

    处理语句5
    处理语句6

    语法解释:条件1为真,条件2为真,执行1,2,3,6
    条件1为真,条件2为假,执行语句1,2,4,1,2,4执行到条件1为假后,执行语句6
    条件1为假,执行语句6
    这个程序没有执行过语句5

    程序举例:
    a=1
    i=1
    while (a<=10):
    a=a+1
    if (a==10):
    break
    else:
    continue
    i=i+1
    print a
    print i
    运行结果:a=10 i=1
    函数
    1 type () 查看变量的数据类型

    2 Raw-input (“提示信息”) 输入函数(从界面输入的均是字符型)

    3 isdigit() 判断变量a是否是纯数字

    4 int() 强制转换类型

    5 Print输出函数
    6 range 集合函数
    Range(起始值,结束值,步长)求从开始值到小于结束值,并且以步长为某一个值的等差数列

    定义:
    Def 函数名(形参列表):
    函数体语句
    Return 返回值 #若没有返回值,不加这句
    程序举例:Def fun(a,b,c):
    Print a,b,c
    Return a+b+c
    调用:
    有返回值
    变量名=函数名(实参列表)
    例:M=fun(‘3’,’4’,’asd’)
    无返回值
    函数名(实参列表)

    第十七章 单元测试
    单元测试概念:
    1什么是单元测试:对软件的基本组成单元所作的测试(面向过程(一组函数或一个函数)面向对象(类中得方法))
    2语句:真正的处理语句才算是语句(判断框中的语句不算)。
    判定:流程图中的菱形框;
    判定数:流程图中菱形框的个数;
    分支:判定的真或假;
    分支数:判定数2;
    条件:判定中关系(比较)运算符;
    条件数:判定中关系(比较)运算符的个数;
    条件结果数:条件数
    2(每个条件有真、假两个取值)。
    3单元测试的目的:与LLD是否符合;与SRS是否符合;编程是否存在问题。
    4关注重点包括:单元接口(类型,顺序,长度,参数个数);局部数据结构;独立路径;边界值;出错处理。
    5单元测试环境包括:被测单元、驱动单元(把被测单元驱动起来,完成被测单元的调用)、桩单元(被测单元的调用的替代品,替代输入与输出),测试用例(测试数据)。
    6驱动单元的四个职责1)接收侧四数据包含测试用例输入好预期输出
    2)吧测试用例输入传送给要测试的单元
    3)将被测单元的实际输出和预期输出进行比较,得到测试结果
    4)将测试结果输出到指定位置
    7辅助技术:评估,框架应用
    8桩单元:通过一组输入和输出模拟被替代单元的行为
    单元测试静态测试:
    1.从详设的评审开始介入
    2.详设评审、编码完成后,作代码的静态检查
    (可以用专门的检查工具 如:PC_lint)
    3.代码的交叉走读 (要制定标准,标准越清晰,任务被分配者越有目标,工作越细)
    单元测试动态测试:
    1写用例之前,先确定覆盖率标准
    2写用例
    3搭建测试环境
    4执行
    5测试报告
    测试评价准则:
    系统测试评价准则:需求覆盖率(=至少被用例覆盖一次的需求项数/测试需求分析列表中的需求项数)。
    单元测试评价准则:逻辑覆盖率(=item至少被评估一次的次数/item总数)【这是一个总公式】。
    逻辑覆盖率
    逻辑覆盖率包括以下几种:语句覆盖率、分支覆盖率、条件覆盖率、分支条件覆盖率、路径覆盖率。【掌握计算公式、每种覆盖率的问题】
    1语句覆盖率=语句至少被执行一次的次数/语句总数。
    问题:有可能语句覆盖率为100%,有可能发现逻辑运算符的问题
    2判定覆盖率=每个分支取值至少被执行一次的次数/分支总数(判定数2)
    问题:当分支覆盖率为100%时,可能不能发现关系运算符的缺陷
    3条件覆盖率=每个条件取值至少被执行一次的次数/条件结果总数(条件数
    2)
    问题:条件覆盖率为100%时,有可能某个分支没有执行到,若该分支有缺陷,可能会遗漏。
    4分支覆盖率=(每个分支至少被执行一次的次数+每个条件取值至少被执行一次的次数)/(分支总数+条件结果数)
    问题:分支条件覆盖率为100%时,有可能漏路径,若该路径上有缺陷,可能遗漏
    5路径覆盖率=每个路径至少被执行一次的次数/路径总数
    问题:路径覆盖率为100%时,条件覆盖率可能不为100%
    注:独立路径覆盖,若路径覆盖率100%则条件、语句、分支覆盖率均100%
    路径一定要从始点到终点
    可以用软件来计算路径覆盖率 如BullseyeCoverage

    单元测试策略
    孤立、自顶向下、自底向下。
    ⑴ 孤立测试
    缺点:需要大量的桩和驱动
    优点:改方法是最简单最容易操作的 ,可以达到高的结构覆盖率,该方法是纯粹的单元测试
    方法:不考虑每个模块与其他模块之间的关系,为每个模块设计桩模块和驱动模块,每个模块进行独立的单元测试
    【例1】
    对象 驱动 桩
    A Driver-A Stub-B
    B Driver-B Stub-C
    C Driver-C X

    【例2】
    对象 驱动 桩
    A Driver-A Stub-B,C
    B Driver-B Stub-D
    C Driver-C Stub-E
    D Driver-D X
    E Driver-E X

    ⑵自顶向下的单元测试策略
    方法:先对最顶层的单元进行测试,把顶层所调用的单元做成桩模块。其次,对第二层进行测试,使用上面已测试的单元做驱动模块。如此类推直到测试完所有模块。
    优点:可以节省驱动函数的开发工作量,测试效率高。
    缺点:随着被测单元一个一个被加入,测试过程将变得越来越复杂,并且开发和维护的成本将增加。
    【例1】
    对象 驱动 桩
    A Driver-A Stub-B
    B Driver-A Stub-C
    C Driver-A Stub-D
    D Driver-A X

    【例2】
    对象 驱动 桩
    A Driver-A Stub-B,C,D
    B Driver-A Stub-E,C,D
    C Driver-A Stub-E,D
    D Driver-A Stub-F,E
    E Driver-A Stub-F
    F Driver-A X

    【例3】
    对象 驱动 桩
    A Driver-A Stub-B,C
    B Driver-A Stub-C,D
    C Driver-A Stub-E,D
    D Driver-A Stub-F,E
    E Driver-A Stub-F
    F Driver-A Stub-G,H
    G Driver-A Stub-H
    H Driver-A X

    a. 看被测函数下边有没有调用,如果被调用则打一个桩
    b. 假如曾经被测过的函数的时候,这些函数下边是否有调用,而那些调用是否也被测过,如果没有被测过,也需要打桩
    c. 只要驱动单元驱动的时候,所依赖的函数要run的时候,相关的调用都需要加入
    ⑶自底向上的单元测试方法
    方法:先对模块调用层次图上最低层的模块进行单元测试,模拟调用该模块的模块做驱动模块。然后再对上面一层做单元测试,用下面已被测试过的模块做桩模块。以此类推,直到测试完所有的模块
    优点:可以节省桩函数的开发工作量,测试效率较高。
    缺点:不是纯粹的单元测试,底层函数的测试质量对上层函数的测试将产生很大的影响。
    对象 驱动 桩
    E Driver-E X
    C Driver-C X
    F Driver-F X
    B Driver-B X
    D Driver-D X
    A Driver-A X

    如果桩难写,采用自底向上;如果驱动难写,采用自顶向下。
    打桩原则:1被测函数有没有调动,若有调动则打桩
    2加入曾经被测过的函数,这些函数是否有调动,这些调动是否被测过,都没有则打桩
    【例子】
    自底向下
    对象 驱动 桩
    F Driver-F X
    I Driver-I X
    J Driver-J X
    G Driver-G X
    H Driver-H X
    E Driver-E X
    C Driver-C X
    D Driver-D X
    B Driver-B X
    A Driver-A X
    自顶向下
    对象 驱动 桩
    A Driver-A Stub-B
    B Driver-A Stub-C,D
    C Driver-A Stub-E,D
    D Driver-A Stub-E
    E Driver-A Stub-F,G,H
    F Driver-A Stub-G,H
    G Driver-A Stub-I,H
    H Driver-A Stub-I,J
    I Driver-A Stub-J
    J Driver-A

    单元测试用例设计(基本路径覆盖法)★ (面试)
    步骤:(所有的循环仅执行一次)
    1)画流程图
    2)根据流程图画出流图
    3)根据流图找出独立路径
    4)根据独立路径设计用例
    结点:表示一个或者多个无分支的语句
    边:表示处理流向
    分支:判定真假的语句
    区域:由结点和边构成的,域的个数等于独立路径的条数
    注:路径一定要从始点到终点
    复杂性计算 :V(G)=E-N+2
    V ( G ) =P+1
    E:边,
    N:结点数量,
    P:条件结点的数量,
    V最好不要大于10
    程序控制流图
    1顺序结构
    2if结构
    3while循环结构
    4until重复结构
    5Case分支结构(swith结构)

    单元测试执行
    单元测试执行的过程:
    单元计划—单元设计—单元测试用例脚本----单元测试执行
    1.搭建环境 引入googletest
    a)将googletest的include和lib两个文件夹复制到VS的项目文件夹下
    b)在Visual Studio中选择项目,属性,将include和lib导入
    c)引入googletest头文件
    #include “gtest/gtest.h”
    d)在main函数中初始化GTEST
    testing::InitGoogleTest(&argc,argv); 初始化google test
    RUN_ALL_TESTS(); 运行当前工程所有test
    2.加入被测代码
    将被测代码头文件引入
    3.新建测试代码
    新建一个文件,编写测试代码
    调用googletest宏
    TEST(测试套名字,测试用例名字)
    {
    ………
    }
    用断言函数(ASSERT、EXPECT)来判断预期结果与实际结果
    ASSERT:致命断言,若前一个执行失败,则不继续执行
    EXPECT:一般断言,前一个执行失败,继续执行
    系统测试中发现不了在单元测试中比较容易发现的问题,如内存泄露、算法缺陷
    补充:
    C语言中,用malloc申请内存,free释放内存
    C++中,用new申请内存,delete释放内存
    TDD(测试驱动开发)
    内存中的堆、栈
    编译器自动分配的内存是在栈中,栈会自动维护、清理
    手工分配的内存是在堆中,堆不会自动清理,需要手工释放,容易忽略造成内存泄露

    单元测试框架

    1. 框架是一组为重用而设计的方法,单元测试框架包括junit\cppunit\phpunit\c#unit\pyunit
    2. pyunit是 d:\py26\unittest.py
    3. 单元测试框架概念
      测试固件(test fixture)
      一组测试函数执行前或执行后要执行的语句。
      例如,void insertDB(chr sql[30])
      {
      //执行insert语句
      }
      若现在测试该函数,实际上每次测试之前都要建立数据库连接,测试完成之后都要断开断开数据库连接。
      建立连接和断开连接称之为测试固件。测试固件在框架如何体现:
      setUP(…) —表示测试函数执行之前要执行的语句,比如建立连接
      teardown(…) —表示测试函数执行之后要执行的语句,比如断开连接
      有没有测试固件,取决于被测函数在测试执行需要否

    测试用例
    主要以测试函数为主,什么是测试函数?就是对被测单元完成测试的函数,类似于原始的驱动单元。
    在框架中一般来说要继承单元测试框架的TestCase。

    测试套件
    装配测试用例的车间。
    在框架中一般来说使用TestSuite的addTest方法来进行装配,装配的就是测试用例,实际上装配的用例中的测试函数。

    测试运行器
    加载测试套件,对套件中装配的测试函数的运行。
    在框架中一般来说使用TestRunner中的run方法来进行运行TestSuite。
    4. pyunit框架中有:
    unittest.py
    测试固件 -----》TestCase类中有setUp和tearDown有这两个方法
    测试用例 -----》TestCase类,在该类中写测试函数的方法 ????
    测试套件 -----》通过TestSuite类中的addTest方法将测试用例中的测试函数加载
    测试运行器-----》通过TextTestRunner中的run方法将测试套件运行起来。
    5. 实例:
    见例子
    6. 使用pyunit单元测试步骤:
    1)import unittest
    2)继承unittest.TestCase构建自己的测试类
    3)在自己构建的测试类中,若对于测试函数有测试固件,则在setUp和tearDown中进行代码编写。否则跳到1)

    第十八章 集成测试
    1什么是集成测试
    依据概要设计说明书,对软件组成的所有函数模块和子模块进行的测试
    2目的:检查软件是否符合概要设计说明书,是否符合需求
    3关注重点
    全局变量 组合功能(集成后的问题)单元接口(1穿越模块的数据是否会丢失,即做输入输出的的形参定义是否正确2全局数据结构是否被异常修改)
    4集成测试环境
    集成后的功能:单个功能都没有问题,组合在一起时否有问题,单个功能之间是否相互影响
    进程:是一个程序在计算机上的一次执行活动,当运行了一个程序就启动了一个进程,进程是操作系统进行资源分配的单位
    线程:是进行中的一个片段
    集成测试没有联系,不存在集成,联系时全局变量,全局变量可能是内存的一片区域,也可能是同一份文件,数组,堆栈,字段,记录,变量,队列,集成也需要考虑到性能匹配问题,网络集成
    5集成测试的依据:LLD
    6集成测试的对象:接口
    7集成测试策略:大爆炸集成测试,自顶向下,自底向上,三明治集成,基于集成,分层集成,基于功能集成,基于消息集成,基于进度的集成,基于风险的集成
    1)大爆炸集成测试
    方法:对每个模块分别进行单元测试,在吧所有单元组装在一起测试
    优点:从未投入模块间,子系统间角度节省时间,减少桩和驱动的开发,节省成本,方法简单

    使用范围:小型项目,大型项目已经稳定,只有少量修改
    2)自顶向下集成测试

    深度优先:在系树的根优先,根—左—右
    广度优先:从上到下,从左到右,一层一层的
    注:调用没有加入过的都需要打桩
    优点:减少驱动的开发,测试充分(一个模块一个模块的加入)定位问题容易,效率有所下降,最容易让高层人物建立信心
    缺点:打桩开发成本较高,效率有所下降,下层容易测试不充分
    适用范围:上层稳定,下层相对不稳定的系统
    3)自底向上集成测试
    优点:桩少,定位问题容易,小测试成分,下层测试充分,问题容易暴漏
    缺点:驱动开发成本高,顶层测试不充分
    适用范围:下层稳定,上层变化较多
    4)三明治集成测试方法

    优点:桩和驱动都减少,测试灵活,问题好隔离,好定位
    缺点:测试中间层可能不充分
    适用范围:大项目
    注:采用哪种方法根据系统本身确定
    8集成测试用例可借用单元测试和系统测试用例设计技术进行用例设计
    9接口覆盖率:每个接口至少被覆盖一次的次数/系统中所有的接口
    10集成测试的层次:子系统间集成测试,模块内集成测试,子系统内集成测试,还要考虑模块间集成测试

    11集成测试过程:计划(输入HLD测试计划,输出IT计划)——设计(输出IT方案)——实施(输出IT用例,脚本——执行(输出集成测试报告,缺陷报告)

    第一阶段总结
    基础课程:测试基础、测试过程、测试方法、软件质量
    开发基础:SQL、C语言
    需求分析、需求管理(变更控制、需求跟踪)
    环境搭建
    配置管理、QC
    缺陷管理
    系统测试、集成测试、单元测试、python
    要做好测试还应该学习DB 网络知识 数据结构 算法 语言(C JAVA PYTHON)OS
    所有课程全部基于测试目的:尽量多、尽量的发现BUG,并预防BUG
    在做测试之前,先考虑可以套用哪些软件质量特性,再根据特性考虑测试点

    Test platform
    管理工具:QC ,RQM
    执行工具:QTP,LR ,WinRunner,BRAT
    数据库:SQL,Oracle,MySQL
    配置管理工具:SVN,CVS,VSS,CC,DB2
    服务器:Tomcat,IIS,JBOSS
    2. 系统测试流程:
    测试流程:需求阶段(产出测试计划):1)来自客户(用户需求)特点:用户自身根据自己的需要提出来,不考虑技术的实现能力,功能和具体细节的实现不2)来自研发(开发文档):特点,进一步明确客户的需求3)来自标准协议(手机网络协议:CSM,CDMA,WCDMA,TD_WCDMA,EDEE)
    需求分析(产出测试方案):分析测试项。罗列功能模块和功能点,产出测试项1)从质量特性的角度对测试项进行分析,包括6大特性,27个子特性2)从功能交互的角度对测试项进行分析,功能是否存在交合,交互过程中有什么影响3)按用户场景进行测试分析
    设计阶段(产出测试用例)设计方法:等价类、边界值、状态迁移图、因果图等
    执行阶段(产出测试报告)提交缺陷报告: 测试结束,研发人员根据提交的bug进行修改,之后release 1.1(新版本),进行回归测试(REG)。
    补充:
    敏捷开发模式 scrum 短小、快。 没有需求、不便于管理。
    User story 功能点。
    3. 与bug相关
    Bug的其他说法
    Defect、CR(change Request)(Moto使用这种说法、submit a CR)、issue。
    缺陷流程:
    缺陷管理工具:QC、Mantis(开源工具)、bugfree(开源)、bugzilla、DDTS(Moto)、DMS(索爱)。
    缺陷状态:New、open、fixed、reopen、assigned、reject、later(postpone)、closed、abandon、duplicate(很常见的一个状态,重复bug,原有的有效,引用时引用原来的bug)。摩托罗拉的缺陷管理系统DDTS
    Postpone原因:有争议的、项目进度紧,优先级低的bug、以后版本就没有这个功能了。
    Retest时可能是不同的测试人员做回归测试:testerA(原)、TesterB(新),测试完后需要测试经理verify
    验证完成后bug没问题tester是否可以直接closed?如果tester没有对bug进行测试,直接closed后可能导致bug遗漏。

    第二阶段项目笔记
    JXC项目
    扩展名为ASP的文件是微软开发的
    扩展名为JSP的文件是JAVA编写的
    一.建立项目JXC
    1把JXC项目方在d:
    2点JXC右键—共享和安全----WEB共享----编辑别名----执行包括脚本等权限都选上
    3删掉JXC布置:控制面板—管理工具—Internet—网站----默认网站----JXC—右键删除
    4给权限:d:\点上边的文件夹—JXC—data—右键属性----安全与共享----添加—everyone----检查名称----确定----点中everyone—权限都选上—确定
    5登录:控制面板—管理工具—Internet信息服务-----JXC—右边栏里找到index.asp右键—浏览
    6找WEB共享或者安全:工具—文件夹—查看—使用简单文件共享前面的对号去掉
    7客户端需要建TSVN,服务器需要建SVN(必须)/TSVN(可建,可不建)
    二.布置JXC
    1建立仓库:新建文件夹SVN—新建文件夹jxc52-niuxiaoqing和文件夹JXC—在文件夹jxc52-niuxiaoqing里分别新建文件夹trunk branches tags—在文件夹trunk里分别新建文件夹doc code tools—在文件夹doc里分别建立文件夹croup person—在文件person里分别新建文件夹niu wang guo
    2点SVN文件夹—jxc52-niuxiaoqing右键----create repository here
    3创建的文件结构放到仓库:SVN文件夹------tortoisvn----import
    4binary文件时二进制文件(可执行的文件)
    5.Dll动态链接库文件有什么作用
    6 1)开始—运行—CMD—目录—cd空格c:\program files\svbversion\bin(svnserve的路径)—回车
    2)svnserve.exe空格–(2个下划线)help-------回车
    3)svnserve.exe空格-d空格-r空格d:\svn\jxc52-niuxiaoqing----回车
    4)停掉服务ctrl+c
    5)上光标,又出现3)回车,启动服务

    三.配置SVN
    1、svn搭建的服务环境:svnserve方式

    2、修改文件:

    svnserve.conf //修改服务器配置文件
    anon-access = none //去除注释 匿名访问 不允许
    auth-access = write //去除注释 指定用户访问 允许

     password-db = passwd //去除注释 启用密码文件passwd
     authz-db = authz     //去除注释 启用用户文件authz
    

    passwd //增加用户并设置密码
    zhangsan = 1111 // 用户名 = 密码

    authz //控制仓库的访问权限
    [groups]
    组名 = 用户名(逗号分隔)

     [/] 代表仓库的根目录
     如果使用组:@组名 = rw
    
     [/trunk/doc/person/lisi] 控制仓库里具体目录的权限
    
     如果没有特别规定某个目录的权限,则使用根目录[\]权限
    

    3、启动服务
    1、进入svn安装目录:cd C:\Program Files\Subversion\bin

    四.访问SVN
    1 svn checkout
    输入要访问的电脑IP
    File:///仓库建立在之间的计算机上
    SVN://仓库建立在其他机器上,要通过网络方式访问
    Apache为HTTP协议请求提供服务
    Tomcat为JAVA的容器,为JAVA编译的文件解释
    IIS为ASP提供服务
    QC的前身叫testdirector
    9.0之前是mercury公司
    10.0之后是惠普公司
    支持的数据库SQL ,Oracle
    支持的应用服务器JBoss
    支持的WEB服务器JBoss,IIS

    进销存项目
    上传图片:数据库中保存的是图片名称,实体保存在jxc/upload下。access中没有存储图片的类型。

    【SqlServer数据库中binary(二进制)类型可以用来保存图片。】

    为什么改名? ------有可能重名,同一个windows目录下不能重名

    为什么是日期时间?------重名的可能性小

    在哪见过类似的实现方式?----QC生成日志,日志保存名称,年月日秒毫秒(1秒=1000毫秒)
    系统生成的文件,为了解决文件重名的问题,使用日期时间命名,做好精确到毫秒级。

    日志功能怎么测?
    保存4个内容:日志级别、日志的最大保存行数(边界值)、保存天数(边界值)、日志保存路径。

    QC非活动状态(选择域后项目下拉列表中没有这个项目了)才能导出(export)----没有人操作

    离点(10001):预期结果(有三种实现方式):保存一个新的日志、覆盖第一条、整个全删了从第一条开始写。

    保存天数(-1):不限制。
    保存路径:目录空间是否够,如果不限制保存时间,硬盘保存空间不够时怎么办?tester是否对硬盘空间

    可操作?

    安装文件后会有一个bin目录,存有大量二进制文件(编译后),扩展名为.exe,为可运行程序。

    路径写到上一级,不包括本级
    文字相同

    001 用户名 用户名和编号
    002 密码

    新密码 确认新密码合为一个需求 新密码处验证特殊符号等,确认新密码只验证是否与新密码相同。

    排序 翻页 打印 详细信息

    所在仓库 有读取数据库的代码

    测试需求:

    测试需求的目的:保证测试的完整性。
    将需求导入QC中,能得出什么东西??-------not covered 应该被用例覆盖但是还没被覆盖。
    细化需求
    每个需求项下边的description:描述该项需求具体的 测试内容,提供测试思路。
    例如:
    产品图片:
    1.浏览功能
    支持的图片格式 jpg、gif(打开文件窗口对该文件类型进行过滤,默认显示过滤类型为jpg、gif)(不区分扩展名的大小写)。
    浏览本地路径、网络路径。
    2.上传功能
    被选文件路径是否合法(选择U盘中的文件,上传前拔掉U盘;存在本地,上传前删除);
    文件的大小限制(0,1M】
    被上传文件是否被独占打开(需要编写程序来独占打开该图片)。
    图片被上传到服务器的upload目录中,而且被修改图片名称(防止该目录下出现重名文件),名称格式:YYYYMMDDHHMMSS。
    上传成功后相关图片信息(图片的新名称)被保存到buy(photo字段)和produit(photo字段)。
    3.预览功能
    预览模式:平铺、拉伸、居中【一般预览功能就这几种模式】
    使用“居中”的预览模式。

    Buy表中 shulian(数量)保存时采用四舍五入。(有bug)。如何提bug???
    输多个小数点出错 编辑框输入的内容按字符(字符串)处理,放到数据库前需要进行字符转换,多个小数点时不能转换成float型,导致语法错误。
    Bug:
    页面允许输入浮点类型,数据库中为整形。
    页面控制的类型和数据库的类型不一致。
    进销存项目总结
    测试需求分析
    工作思路参考QC需求工作流:

    1、定义测试范围

        依据:ISO9126质量模型
        确定测试范围:被测质量特性
    

    2、建立需求项
    参考需求(SRS),明确具体要测试的需求项(测试点、需求点、功能点。。。)
    树形结构,考虑分析的“粒度”(参考QC)

        (1)、粗:文件夹级(只分解到模块或者页面层次)
        (2)、中:用例级  (只分解到页面中的具体控件,如“产品名称”、“入库数量”,意味这最底层需求可以直接转换为测试用例)
        (3)、细:步骤级  (分解到用例的操作步骤 Step)
        (4)、默认使用级别:用例级
    
         考虑后期用例执行,分解出一些特殊的需求(以后会专门对应某些测试类型)
    
        (1)、页面同名:(作为模板),只考虑该页面中所有控件都输入最正确的值
                       (控件同名的需求,目的从有效、无效两方面反复验证该控件输入的合法性)
        (2)、页面同名 Page: 以后作为“界面测试”使用
        (3)、模块同名:(调用该模块内所有页面同名的用例)作为预测试使用,证明版本的基本功能是否正确
    

    3、细化需求项
    描述每个需求项的详细内容

    详细内容:
    1、页面:(星号)是否允许为空
    2、数据库: 输入类型、长度(边界值)
    3、设计:跑到(所有)的路径----精简测试用例的个数

    如:入库管理模块–新产品入库页面–入库数量控件:
    1、页面:入库输入量不能为空

    2、数据库:
    数字类型(整型)
    边界:-231 ~ 231-1
    31:整型类型占用4个字节(4B),每个字节有8位(8bit),每位有两个取值(0、1),考虑符号(正、负)占用1位
    2:代表每位(bit)有两个取值(0、1)
    31:除去符号位,还剩31位

    3、代码实现:
    1)、当键盘抬起的时候,重置输入
    测试思路:(1)、抬起按键,非法字符的输入被重置
    (2)、绕过该事件,按下字母键不抬起进行鼠标焦点切换
    2)、当粘贴之前,重置输入
    考虑粘贴功能的实现(鼠标右键进行粘贴,快捷键粘贴 Crtl+V)
    3)、小数点个数最多1个(考虑边界值0,1,2个)

     具体分析思路:
    

    4.需要进行评审
    借助Rose的活动图统一思路

    4、需求覆盖率分析
    借助工具----QC
    将写好的需求导入到QC中的需求模块
    切换到需求的第四种视图方式:Coverage Analysis (需求覆盖率分析),看需求的状态(Not Covered 未覆盖状态),得知应该被覆盖到的需求的数量(只统计最底层需求的个数)(被测对象的测试规模),进而预测试出用例的数量

    当粘贴之前
    课前复习:
    需求名称为必填项,有空行不能导到QC中。
    把相同需求分类
    从需求详细描述从哪几方面去找?(1)页面角度 获取需求(星号—是否允许为空);(2)数据库 (长度----边界值、类型);(3)代码 实现方式----【目的:精简用例的个数,路径全部覆盖】
    代码实现讲解:
    onKeyUp="value=value.replace(/[^\d.]/g,’’)
    Onkeyup:当键盘键抬起的时候
    Replace:重新设置
    (/[^\d.]/g,’’):正则表达式 d----代表数字(0~9) .------代表小数点
    整个句子解释:
    当键盘抬起的时候,判断按键是否属于数组或者小数点,如果不属于这些键,则重置该输入(取消该输入)。

    这样只要设计2个用例就可(1)输入字母;(2)输入1.5。
    如果没有的代码,只按照等价类边界值的思想设计用例,需要考虑很多情况(此处略)。
    此处总结如下:

    onbeforepaste=“clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/[^\d.]/g,’’))” value=“1”>
    onbeforepaste:当粘贴之前
    入库数量测试(设计):
    1.输出-------入库输入量不能为空;
    2.代码实现:
    (1)当键盘抬起的时候,重置输入;
    测试思路:绕过该事件,按下字母键不抬起鼠标焦点切换
    (2)当粘贴之前,重置输入
    考虑粘贴功能的实现(鼠标右键进行粘贴,快捷键粘贴Ctrl+V)
    3.小数点个数最多1个
    测试需求分析:
    如何做??1.工作思路参考QC需求工作流
    2.定义测试范围; 依据:ISO9126质量特性确定测试范围:被测质量特性
    3.建立需求项------参考需求(SRS)明确具体要测试的需求项(又叫测试点、需求点、功能点….)树型结构,考虑分析的“粒度”
    【粗—文件夹级(只分解到模块或者页面层次);
    中------用例级(只分解到页面中的具体控件,如“产品名称”、“入库数量”)
    细-----步骤级】
    考虑后期用例执行,分解出一些特殊的需求(以后)
    1.页面同名
    2.页面同名page
    3.模块同名
    4.细化需求项
    5.需求覆盖率分析

    判定表
    解决:多个输入的组合问题

    方法1:利用数据库的查询命令—笛卡尔积(全排列组合)
    计算最终的组合数量:每个表记录数的乘积
    如:A(a1,a2)
    B(b1,b2,b3,b4)
    C(c1,c2,c3)
    Select * from A、B、C

    方法2:判定表多个条件,每个条件2个取值

    3.1.读书选择
    1、如果觉得不疲倦,并且对书中的内容不感兴趣,同时书中的内容让你不糊涂,跳到下一章去读
    2、如果觉得不疲倦,并且对书中的内容不感兴趣,同时书中的内容让你糊涂, 跳到下一章去读
    3、如果觉得不疲倦,并且对书中的内容感兴趣, 同时书中的内容让你不糊涂,继续读下去
    4、如果觉得不疲倦,并且对中书的内容感兴趣, 同时书中的内容让你糊涂, 回到本章重读
    5、如果觉得疲倦, 并且对书中的内容不感兴趣,同时书中的内容让你不糊涂,停止阅读,请休息
    6、如果觉得疲倦, 并且对书中的内容不感兴趣,同时书中的内容让你糊涂, 请停止阅读,休息
    7、如果觉得疲倦, 并且对书中的内容感兴趣, 同时书中的内容让你不糊涂,继续读下去
    8、如果觉得疲倦, 并且对书中的内容感兴趣, 同时书中的内容让你糊涂, 回到本章重读

    提炼需求:多个条件的组合生成不同的结果
    1、需求分析:
    条件:是否疲倦(是、否)、是否感兴趣(是、否)、是否糊涂(是、否)
    结果:跳到下一章、继续读、本章重读
    2、绘制判定表
    1、分别填入条件和结果,确定表格的“行数”
    2、计算条件组合的数量,规划表格的“列数”
    3、将条件进行排列组合(全排列–笛卡尔积),利用二进制原理(0代表否,1代表是)。
    4、根据每种组合方式(每列),推出其对应的结果

    	1	2	3	4	5	6	7	8
    

    条件 是否疲倦 0 0 0 0 1 1 1 1
    是否感兴趣 0 0 1 1 0 0 1 1
    是否糊涂 0 1 0 1 0 1 0 1
    结果 跳到下一章 X X
    继续读 X X
    本章重读 X X
    休息 X X
    注:虽然1、2的结果是一样的,但是不能使用等价类的思想将其合并,原因:处理路径不同。(时间紧张可以合并)。

    3、编写测试用例
    原则1:判定表中的每一列生成一个测试用例,多个测试用例
    原则2:判定表中的每一列生成一个测试用例的步骤,一个测试用例

    我们项目使用:原则2
    两个原则测试的充分程度(覆盖率)相同;
    第二种进行需求跟踪更简单易操作;

    原则1:----8个测试用例
    用例编号 用例标题 用例输入 操作步骤 预期结果
    ST-001 不疲倦+没兴趣+不糊涂 是否疲倦: 否
    是否感兴趣:否
    是否糊涂: 否 1、启动系统
    2、输入以上内容
    3、点击“提交”按钮 跳到下一章
    ST-002 不疲倦+没兴趣+糊涂 是否疲倦: 否
    是否感兴趣:否
    是否糊涂: 是 1、启动系统
    2、输入以上内容
    3、点击“提交”按钮 跳到下一章
    ST-008 。。。。。。。。 。。。。。。。。 。。。。。。。。 。。。。。。。。

    原则2:-----1个测试用例,8个步骤
    用例编号 用例标题 步骤名称 步骤输入 操作描述 预期结果
    ST-001 读书选择 启动系统 。。。。。。。。 。。。。。。。。 。。。。。。。。
    准备测试 。。。。。。。。 。。。。。。。。 。。。。。。。。
    Step 1不疲倦+没兴趣+不糊涂 是否疲倦: 否
    是否感兴趣:否
    是否糊涂: 否 1、启动系统
    2、输入以上内容
    3、点击“提交”按钮 跳到下一章
    Step 2不疲倦+没兴趣+糊涂 是否疲倦: 否
    是否感兴趣:否
    是否糊涂: 是 1、启动系统
    2、输入以上内容
    3、点击“提交”按钮 跳到下一章
    Step 8 。。。。。。。。 。。。。。。。。
    3.2.Counter

    1、测试需求分析
    条件:是否统计代码行、是否统计空行、是否统计注释行、是否统计总行
    结果:统计代码行、统计空行、统计注释行、统计总行

    2、绘制判定表
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
    条件 是否统计代码行 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
    是否统计空行 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
    是否统计注释行 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
    是否统计总行 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
    结果 统计代码行 X X X X X X X X
    统计空行 X X X X X X X X
    统计注释行 X X X X X X X X
    统计总行 X X X X X X X X

    3、生成测试用例
    每一列生成一个测试用例,一共16种组合方式
    原则1:----16个用例
    用例编号 用例编号 用例输入 操作步骤 预期结果 编写人 编写时间
    ST-001 1.
    ST-002 1.
    ST-003
    ST-004
    ST-005

    原则2:----1个测试用例,16个步骤
    用例编号 用例标题 步骤名称 步骤输入 操作描述 预期结果 编写人 编写时间
    ST-001 Counter统计

    3.3:word中的判定表举例
    Word中的判定表举例:
    (1)字体和字号

    输入太多,选择有代表的处理(等价类—减少输入个数)。
    字体:中文、英文(英文又可以分为2类:带横线(serif—如times new roman)、不带横线(sens serif----arial Unicode ))
    (2)

    组合:4个条件,每个条件2个值。
    (3)

    这个不能用判定表,因为不能同时选中“左对齐”和“右对齐”,不满足判定表使用条件。

    3.4.合并判定表
    前提:时间紧张,成本过高;
    原则:结果相同,条件有一个不同(貌似该条件没有作用);
    风险:被合并的条件可能走不同的“路径”,合并可能会造成漏测。
    对练习1(读书选择)中的判定表进行合并:

    	1	2	3	4	5	6	7	8
    

    条件 是否疲倦 0 0 0 0 1 1 1 1
    是否感兴趣 0 0 1 1 0 0 1 1
    是否糊涂 0 1 0 1 0 1 0 1
    结果 跳到下一章 X X
    继续读 X X
    本章重读 X X
    休息 X X

    判定表合并:

    	1	2	3	4
    	1、2	3、7	4、8	5、6
    

    条件 是否疲倦 0 ---- ---- 1
    是否感兴趣 0 1 1 0
    是否糊涂 — 0 1 —
    结果 跳到下一章 X
    继续读 X
    本章重读 X
    休息 X

    前提:
    合并:时间紧张,成本过高
    原则:结果相同,条件有一个不同(“貌似”该条件没有作用)
    风险:被合并的条件可能走不同的“路径”,合并会造出漏测

    3.4.密码修改
    若需修改密码,系统验证旧密码正确,两个新密码相同,则更新密码,旧密码即失效,其他修改项也生效,并提示“用户信息修改成功”; 若旧密码不正确,则提示“用户密码错”,系统将不修改个人信息;若两个新密码不同,则提示“新密码与验证新密码不同”,系统将不修改个人信息。
    若只修改密码外其他信息,则不需输入两个新密码,系统只验证旧密码正确,就成功更改个人信息,并提示“用户信息修改成功”;如果系统验证旧密码输入不正确,则提示“用户密码错”。
    流程图如下

    答案:
    (1)需求分析
    条件:只修改密码外其他信息(是/否)、旧密码(正确/错误)、新密码和验证新密码(相同/不相同)
    结果:提示“用户信息修改成功”、提示“用户密码错”、提示“新密码与验证新密码不同”
    (2)绘制判定表
    1 2 3 4 5 6 7 8
    条件 只修改密码外其他信息 0 0 0 0 1 1 1 1
    旧密码 0 0 1 1 0 0 1 1
    新密码和验证新密码 0 1 0 1 0 1 0 1
    结果 提示“用户信息修改成功” x x x
    提示“用户密码错” x x x
    提示“新密码与验证新密码不同” x
    说明 无效 无效
    (3)编写测试用例
    原则2:----1个测试用例,8个步骤
    用例编号 用例标题 步骤名称 步骤输入 操作描述 预期结果
    ST-001 修改信息 启动系统 无 双击 系统正常启动
    Step1:修改密码+旧密码错误+新密码与验证密码一致 是否只修改密码外其他信息:否;
    旧密码是否正确:否;
    新密码和验证新密码是否一致:否 1.启动系统;
    2.输入以上修改信息;
    3.点击“提交”按钮
    无任何提示信息
    Step2:修改密码+旧密码错误+新密码与验证密码一致 是否只修改密码外其他信息:否;
    旧密码是否正确:否;
    新密码和验证新密码是否一致:是 1.启动系统;
    2.输入以上修改信息;
    3.点击“提交”按钮
    提示“用户密码错”,个人信息未修改
    Step3:修改密码+旧密码正确+新密码与验证密码不一致 是否只修改密码外其他信息:否;
    旧密码是否正确:是;
    新密码和验证新密码是否一致:否 1.启动系统;
    2.输入以上修改信息;
    3.点击“提交”按钮
    提示“新密码与验证新密码不同”,个人信息未修改
    Step4:修改密码+旧密码正确+新密码与验证密码一致 是否只修改密码外其他信息:否;
    旧密码是否正确:是;
    新密码和验证新密码是否一致:是 1.启动系统;
    2.输入以上修改信息;
    3.点击“提交”按钮
    提示“用户信息修改成功”,旧密码生效,其他个人信息修改
    Step5:只修改密码外信息+旧密码错误 是否只修改密码外其他信息:是;
    旧密码是否正确:否;
    新密码和验证新密码是否一致:否 1.启动系统;
    2.输入以上修改信息;
    3.点击“提交”按钮
    提示“用户密码错”,个人信息未修改
    Step7:只修改密码外信息+旧密码正确 是否只修改密码外其他信息:是;
    旧密码是否正确:是;
    新密码和验证新密码是否一致:否 1.启动系统;
    2.输入以上修改信息;
    3.点击“提交”按钮
    提示“用户信息修改成功”,其他个人信息修改

    3.5.进销存
    进销存中的下列选框可以使用判定表的方法设计用例:

    (1)需求分析
    条件: 仓库(所有仓库/具体仓库)(0表示所有仓库,1表示具体仓库)【“具体”只测试一个即可,处理方式相同,等价类思想】
    类别(包括大类和小类,有三种组合,分别为所有/所有、具体/所有、具体/具体)(分别使用0、1、2表示)
    关键字(填/不填)(0表示不填,1表示填)
    结果:所有仓库所有库存、所有仓库具体库存、具体仓库所有库存、具体仓库具体库存
    (2)绘制判定表
    1 2 3 4 5 6 7 8 9 10 11 12
    条件 仓库 0 0 0 0 0 0 1 1 1 1 1 1
    类别 0 0 1 1 2 2 0 0 1 1 2 2
    关键字 0 1 0 1 0 1 0 1 0 1 0 1
    结果 所有仓库所有库存 X X
    所有仓库具体库存 X X X X
    具体仓库所有库存 X X
    具体仓库具体库存 X X X X
    (3)编写测试用例
    使用原则2:----1个测试用例,12个步骤
    用例编号 用例标题 步骤名称 步骤输入 操作描述 预期结果
    ST-001 库存查询信息组合查询 进入库存查询页面。 无 1.打开进销存网页;2.点击库存管理模块中的库存查询页面。 界面显示库存查询页面。
    Step1:所有仓库+所有大类+所有小类+不填关键字 仓库:所有仓库;
    类别:所有大类和所有小类;
    关键字:不填 1.在页面右上角搜索处选择所有仓库;
    2.在页面右上角搜索处选择所有大类和所有小类;
    3.不填写关键字;
    4.点击“查询”按钮。 页面中显示所有仓库的所有库存信息
    Step2:所有仓库+所有大类+所有小类+填关键字 仓库:所有仓库;
    类别:所有大类和所有小类;
    关键字:填 1.在页面右上角搜索处选择所有仓库;
    2.在页面右上角搜索处选择所有大类和所有小类;
    3.填写关键字;
    4.点击“查询”按钮。 页面中显示所有仓库的所有库存信息
    Step3:所有仓库+具体大类+所有小类+不填关键字 仓库:所有仓库;
    类别:具体大类和所有小类;
    关键字:不填 1.在页面右上角搜索处选择所有仓库;
    2.在页面右上角搜索处选择具体某一个大类和所有小类;
    3.不填写关键字;
    4.点击“查询”按钮。 页面中显示所有仓库的具体库存信息
    Step4:所有仓库+具体大类+所有小类+填关键字 仓库:所有仓库;
    类别:具体大类和所有小类;
    关键字:填 1.在页面右上角搜索处选择所有仓库;
    2.在页面右上角搜索处选择具体某一个大类和所有小类;
    3.填写关键字;
    4.点击“查询”按钮。 页面中显示所有仓库的具体库存信息
    Step5:所有仓库+具体大类+具体小类+不填关键字 仓库:所有仓库;
    类别:具体大类和具体小类;
    关键字:不填 1.在页面右上角搜索处选择所有仓库;
    2.在页面右上角搜索处选择具体某一个大类和具体某一个小类;
    3.不填写关键字;
    4.点击“查询”按钮。 页面中显示所有仓库的具体库存信息
    Step6:所有仓库+具体大类+具体小类+填关键字 仓库:所有仓库;
    类别:具体大类和具体小类;
    关键字:填 1.在页面右上角搜索处选择所有仓库;
    2.在页面右上角搜索处选择具体某一个大类和具体某一个小类;
    3.填写关键字;
    4.点击“查询”按钮。 页面中显示所有仓库的具体库存信息
    Step7:具体仓库+所有大类+所有小类+不填关键字 仓库:具体仓库;
    类别:所有大类和所有小类;
    关键字:不填 1.在页面右上角搜索处选择具体某一个仓库;
    2.在页面右上角搜索处选择所有大类和所有小类;
    3.不填写关键字;
    4.点击“查询”按钮。 页面中显示具体仓库的所有库存信息
    Step8:具体仓库+所有大类+所有小类+填关键字 仓库:具体仓库;
    类别:所有大类和所有小类;
    关键字:填 1.在页面右上角搜索处选择具体某一个仓库;
    2.在页面右上角搜索处选择所有大类和所有小类;
    3.填写关键字;
    4.点击“查询”按钮。 页面中显示具体仓库的所有库存信息
    Step9:具体仓库+具体大类+所有小类+不填关键字 仓库:具体仓库;
    类别:具体大类和所有小类;
    关键字:不填 1.在页面右上角搜索处选择具体某一个仓库;
    2.在页面右上角搜索处选择具体某一个大类和所有小类;
    3.不填写关键字;
    4.点击“查询”按钮。 页面中显示具体仓库的具体库存信息
    Step10:具体仓库+具体大类+所有小类+填关键字 仓库:具体仓库;
    类别:具体大类和所有小类;
    关键字:填 1.在页面右上角搜索处选择具体某一个仓库;
    2.在页面右上角搜索处选择具体某一个大类和所有小类;
    3.填写关键字;
    4.点击“查询”按钮。 页面中显示具体仓库的具体库存信息
    Step11:具体仓库+具体大类+具体小类+不填关键字 仓库:具体仓库;
    类别:具体大类和具体小类;
    关键字:不填 1.在页面右上角搜索处选择具体某一个仓库;
    2.在页面右上角搜索处选择具体某一个大类和具体某一个小类;
    3.不填写关键字;
    4.点击“查询”按钮。 页面中显示具体仓库的具体库存信息
    Step12:具体仓库+具体大类+具体小类+填关键字 仓库:具体仓库;
    类别:具体大类和具体小类;
    关键字:填 1.在页面右上角搜索处选择具体某一个仓库;
    2.在页面右上角搜索处选择具体某一个大类和具体某一个小类;
    3.填写关键字;
    4.点击“查询”按钮。 页面中显示具体仓库的具体库存信息

    3.6.总结
    1、什么时候用:
    (1)有多个输入需要组合的时候,采用判定表进行用例设计;
    2、怎么用:
    (2)使用判定表进行用例设计,有以下3个步骤:
    a)需求分析,通过对多个条件的组合生成不同的结果进行分析,得出条件和结果。
    b)绘制判定表。
    i.分别填入条件和结果,确定表格的“行数”;
    ii.计算条件的组合数量,规划表格的“列数”;
    iii.将条件进行排列组合,利用二进制原理;
    iv.根据每种组合方式,推出其对应的结果。
    c)编写测试用例
    有2种方式:判定表中的每一列生成一个测试用例,最终生成多个测试用例;
    判定表中的每一列生成一个测试用例的步骤,最终生成一个测试用例。
    3判定表的优点和缺点
    (3)优点:组合充分,没有遗漏;
    缺点:当条件数多的时候(超过5个)用例数量多,成本高。

    因果图

    条件和结果之间的关系:

    恒等:条件成立,结果成立
    非: 条件成立,结果不成立
    或: 只要有一个条件成立,结果成立
    与: 必须所有条件都成立,结果成立

    条件之间的关系:

    E:不能同时为“真”
    I:不能同时为“假”
    O:有且仅有一个为“真”

    第一个举例:呼吸,用鼻子和嘴(异)
    因果图作用:1、条件和结果之间的关系:分析业务逻辑(类似流程图的作用)
    2、条件之间的关系:去除判定表中的无效的列
    使用viso绘制因果图:
    操作步骤:
    (1):在viso中选择基本流程图,
    (2)按照等价(处理方式相同)条件,添加中间节点(临时结果)。如:A、B处理相同(等价类),做中间节点(如A or B)。
    (3)分析条件和结果之间的关系(恒等、与、或、非)。
    如果不是一次退出结果,或者连线较多,可以增加中间节点。
    (4)分析条件之间的关系(E、I、O)。

    4.1.字母判定
    第一列字符必须是A或B,第二列字符必须是一个数字(每列只能输入一个字符),在此情况下(只有这个时候才)进行文件的修改,但如果第一列字符不正确,则给出信息L;如果第二列字符不是数字,则给出信息M。
    不能使用等价类【不是单一条件】

    1、测试需求分析
    条件:第一列是A、第一列是B、第二列是数字
    结果:修改文件、 提示L、 提示M

    2、绘制因果图

    3、绘制判定表
    假设:当判断完是否是AorB条件后,如果取“否”,则退出系统运行。【实际工作中不允许假设】。

    利用因果图条件之间的关系,去除无效列

    	1	2	3	4	5	6	7	8
    

    条件 第一列是A 0 0 0 0 1 1 1 1
    第一列是B 0 0 1 1 0 0 1 1
    第二列是数字 0 1 0 1 0 1 0 1
    结果 修改文件 X X
    提示L X X
    提示M X X
    实际输入 CC T7 B@ B5 AF A6 无效 无效

    第一种条件是提示L还是提示L、M,在公司中要找开发人员询问,不能主观猜测。

    编写测试用例
    原则2:----1个测试用例,8个步骤
    用例编号 用例标题 步骤名称 步骤输入 操作描述 预期结果 编写人 编写时间
    ST-001 修改文件

    4.2.自动售货机
    有一个处理单价为5角钱的饮料的自动售货机软件测试用例的设计。其规格说明如下:若投入5角钱或1元钱的硬币,押下〖橙汁〗或〖啤酒〗的按钮,则相应的饮料就送出来。若售货机没有零钱找,则一个显示〖零钱找完〗的红灯亮,这时在投入1元硬币并押下按钮后,饮料不送出来而且1元硬币也退出来;若有零钱找,则显示〖零钱找完〗的红灯灭,在送出饮料的同时退还5角硬币。

    1、测试需求分析:
    条件:有零钱、投1元、投5角、选啤酒、选橙汁
    结果:红灯亮、退1元、找5角、出啤酒、出橙汁

    2、绘制因果图

    3、绘制判定表

    红色列为无效组合

    4、生成测试用例
    经办人不能为空,程序中通过管理员ID判断当前登陆用户是否为管理员,如果在数据库login表中删除再添加一个管理员后id变了,导致查询错误。
    Admin登陆,下拉列表中显示所有系统的用户,非admin登陆,下拉列表中只显示当前登陆用户。
    关于下拉列表的问题:

    关于单元测试逻辑覆盖率:
    在只有一个条件时,路径覆盖率为100%时,条件覆盖率也是100%。
    如果条件不是布尔类型,可以使用数据库中的多表关联,计算笛卡尔积。
    如:
    A表(a1、a2)
    B表(b1、b2、b3、b4)
    C表(c1、c2、c3)
    使用select * from A、B、C;查询。

    状态迁移
    5.1.飞机售票系统
    1、客户向航空公司打电话预定机票—>此时机票信息处于“完成”状态
    2、顾客支付了机票费用后—>机票信息就变为“已支付”状态
    3、旅行当天到达机场后,拿到机票后—>机票信息就变为“已出票”状态
    4、登机检票后—>机票信息就变为“已使用”状态
    5、在登上飞机之前任何时间可以取消自己的订票信息,如果已经支付了机票的费用,则还可以得到退款,取消后—>订票信息处于“已被取消”状态

    1、测试需求分析
    状态:完成、已支付、已出票、已使用、已被取消

    2、绘制状态迁移图
    使用rose画状态图:
    方法:
    (1)右键,新建状态图New -----stagechar Diagram。

    特点:每个状态只出现一次

    3、生成用例 — 路径覆盖
    绘制状态迁移树-----每个树枝生成一个测试用例

    特点:
    1、每个状态可以出现多次
    2、箭头方向统一向“右”延伸
    3、状态转换如果出现循环,该路径只遍历一次
    4、编写测试用例
    用例编号 标题 步骤名称 步骤描述 预期结果
    STC-001 售票流程 启动系统
    准备测试数据和环境
    Step 1 完成-取消 1、客户向航空公司打电话预定机票
    2、取消该机票 1、此时机票信息处于“完成”状态
    2、订票信息处于“已被取消”状态
    Step 2 完成-支付-取消 。。。。。 。。。。。
    Step 3 。。。。。 。。。。。
    Step 4 。。。。。 。。。。。
    那些软件适合状态迁移
    淘宝买东西、QC需求、配置管理状态(normal、modified.;……)、缺陷状态(new、open……)
    QC需求状态(只考虑一次运行)

    5.2.缺陷跟踪

    流程分析
    使用ROSE中的活动图进行分析

    状态:吃饭中(有一个延续,使用ing)。
    活动:吃饭
    方法:
    (1)右键,新建状态图New -----activity Diagram。

    6.1.处理流程
    在某嵌入式系统中,将待发送的数据打包成符合CAN协议的帧格式后,便可写入发送缓站区,并自动发送。该发送子程序的流程为:
    1、首先进入发送子程序
    2、系统判断是否有空闲发送缓冲区,如果没有则返回启动发送失败消息。
    3、如果有空闲缓冲区,将数据包写入空闲发送缓冲区
    4、系统判断是否写入成功,如果不成功则返回启动发送失败消息
    5、如果写入成功,则启动发送命令
    6、返回启动发送成功消息
    1、绘制流程(活动)图

    2、生成测试用例------ 路径覆盖
    1、(A) (B) (C) (D) (E) (F) 基本流
    2、(A) (B) (G) 备选流
    3、(A) (B) (C) (D) (G) 备选流

    6.2.系统登录

    C/S程序。
    先判断是否为空,再去判断是否合法,涉及到效率问题。
    把判断时间短的放前边。

    用例:6个(路径)
    单个测试用户名考虑:空、最大值、特殊符号、匹配、不匹配
    6.3.字母判断

    用例:
    基本流: (1) (2) (3)
    (1A) (2) (3) 6列
    (1B) (2) (3) 4列
    备选流1:(1) (4) 1、2列
    备选流2:(1) (2) (5)
    (1A) (2) (5) 5列
    (1B) (2) (5) 3列

    	1	2	3	4	5	6	7	8
    

    条件 第一列是A 0 0 0 0 1 1 1 1
    第一列是B 0 0 1 1 0 0 1 1
    第二列是数字 0 1 0 1 0 1 0 1
    结果 修改文件 X X
    提示L X X
    提示M X X
    实际输入 CC T7 B@ B5 AF A6 无效 无效

    合并判定表
    1 2 3 4 5
    1、2 3 4 5 6
    条件 第一列是A 0 0 0 1 1
    第一列是B 0 1 1 0 0
    第二列是数字 ---- 0 1 0 1
    结果 修改文件 X X
    提示L X
    提示M X X
    实际输入 CC B@ B5 AF A6
    使用流程图和判定表
    都可以,使用流程图前提要保证流程图正确
    6.4.组合查询
    库存管理–库存查询代码实现:
    //
    nowkeyword–输入在查询关键字
    nowku-------输入在仓库名对应在id
    nowbigclass—输入的大类对应的id
    nowsmallclass—输入的小类对应的id
    &—+加在之前sql语句后边

    语句覆盖100%:1个用例;
    分支覆盖100%:2个用例;
    路径覆盖100%:16个用例。
    可以使用独立路径(每个路径只走一次):A-----、AB------、AC------、AD------、AE------(非法用例,不选大类不能选小类,使用ADE)。可以再找一个全选ABCDE。共6个用例。

    用例:
    1、 (A) (F) 独立路径
    2、 (A) (B) (F) 独立路径
    3、 (A) (C) (F) 独立路径
    4、 (A) (D) (F) 独立路径
    5、 (A) (D) (E) (F) 独立路径
    6、 (A) (B) (C) (D) (E) (F) 补充
    补充1关于where中1=1的问题:

    两个查询是一样的。为什么要加上1=1呢??因为每个select查询语句调教中只能加一个where,可以加多个and;如果在这句中不加1=1,之后的sql语句需要判断之前是否加过where,再做处理,影响查询效率。
    查询效率高。
    如果查询的是两个表,两个表查询就不用写了,两个表关联时就把where语句占用了。
    补充2取仓库ID,而不是仓库名称:
    代码实现:

    下拉列表由2部分组成,分别为value和库名。

    课前复习
    单个输入------- 等价类边界值
    多条件组合------判定表(全排列组合,组合个数2n(n代表条件个数)条件是布尔类型,如果不是布尔类型,参考数据库笛卡尔积,条件取值个数相乘)。
    ------因果图(帮助描述中间处理过程,去除判定表中的无效组合,3种约束:E、I、O)
    ------正交试验(两两组合)
    每个条件取值不规范,使用allpairs工具。
    处理流程问题------状态迁移(强调状态属性,用状态来描述流程)
    -----流程分析(活动图活流程图)
    生成用例原则:单元测试的路径覆盖。路径太多可以取独立路径或分支覆盖。

    正交试验
    7.1.环境搭建
    假设一个WEB站点,该站点有大量的服务器和操作系统,并且有许多具有各种插件的浏览器浏览:

    环境配置 Web浏览器 浏览器插件 操作系统 服务器
    配置选项 Netscape RealPlayer WinXP IIS
    IE Flash Win2000 Tomcat
    Firefox PDF Reader Win2003 Weblogic

    1、测试需求分析,找出条件和取值
    条件:4个
    取值:每个条件有3个取值

    2、选择正交表: L9_3_4
    9:代表最终生成用例的个数
    4:因素(因数),代表条件的个数
    3:水平,代表每个条件取值的个数

    3、生成用例
    因素 Web浏览器 浏览器插件 操作系统 服务器
    实验1 Netscape RealPlayer WinXP IIS
    实验2 Netscape Flash Win2000 Tomcat
    实验3 Netscape PDF Reader Win2003 Weblogic
    实验4 IE RealPlayer Win2000 Weblogic
    实验5 IE Flash Win2003 IIS
    实验6 IE PDF Reader WinXP Tomcat
    实验7 Firefox RealPlayer Win2003 Tomcat
    实验8 Firefox Flash WinXP Weblogic
    实验9 Firefox PDF Reader Win2000 IIS

    正交表的特点:
        1、任意一列,每个取值出现的次数一致(均匀)(本题出现3次)
        2、任意两列,任何两个值得组合出现的次数一致(均匀)(本题出现1次)
        3、任意一列,该列的每个值都和其他列的所有值成对组合过(均匀)(本题组合1次)
           正交表:充分的两两组合(9个用例)
           判定表:全排列组合(两两组合、三三、四四。。。。组合)(81个用例)
           
    使用原则:根据经验,如果充分的两两组合不出问题,那么多次组合出问题的可能性很小,基于成本、时间等因素,可以考虑正交试验方法生成测试用例
    

    7.2.Counter

    因素 代码行 注释行 空行 总行
    实验1 选 选 选 选
    实验2 选 选 选 不选
    实验3 选 不选 不选 选
    实验4 选 不选 不选 不选
    实验5 不选 选 不选 选
    实验6 不选 选 不选 不选
    实验7 不选 不选 选 选
    实验8 不选 不选 选 不选
    补充 不选 不选 不选 选
    补充 不选 不选 不选 不选

    7.3.组合
    题目:
    土壤的酸碱度:酸性、碱性、中性
    土壤的潮湿度:潮湿、干燥
    土壤的温度: 高温、低温
    提供标准正交表:
    因素 A B C
    实验1 0 0 0
    实验2 0 1 1
    实验3 1 0 1
    实验4 1 1 0

    答案:
    方法1)、正交试验方法:
    正交表:L4_2_3
    土壤的酸碱度:0(酸性)、1(碱性+中性)
    土壤的潮湿度:0(潮湿)、1(干燥)
    土壤的温度: 0(高温)、1(低温)

    因素 酸碱度 潮湿度 温度
    实验1 酸性 潮湿 高温
    实验2 酸性 干燥 低温
    实验3 碱性+中性 潮湿 低温
    实验4 碱性+中性 干燥 高温

    拆分正交表
    

    因素 酸碱度 潮湿度 温度
    实验1 酸性 潮湿 高温
    实验2 酸性 干燥 低温
    实验3 碱性 潮湿 低温
    实验4 中性 潮湿 低温
    实验5 碱性 干燥 高温
    实验6 中性 干燥 高温

    方法2)、判定表方法:
    绘制判定表
    1 2 3 4 5 6 7 8
    条件 酸碱度 0 0 0 0 1 1 1 1
    潮湿度 0 0 1 1 0 0 1 1
    温度 0 1 0 1 0 1 0 1

    带入判定表
    1 2 3 4 5 6 7 8
    条件 酸碱度 酸性 酸性 酸性 酸性 碱性+中性 碱性+中性 碱性+中性 碱性+中性
    潮湿度 潮湿 潮湿 干燥 干燥 潮湿 潮湿 干燥 干燥
    温度 高温 低温 高温 低温 高温 低温 高温 低温

    拆分判定表
    1 2 3 4 5 6 7 8 9 10 11 12
    条件 酸碱度 酸性 酸性 酸性 酸性 碱性 中性 碱性 中性 碱性 中性 碱性 中性
    潮湿度 潮湿 潮湿 干燥 干燥 潮湿 潮湿 潮湿 潮湿 干燥 干燥 干燥 干燥
    温度 高温 低温 高温 低温 高温 高温 低温 低温 高温 高温 低温 低温

    时间不充裕选择正交实验法,否则选择判定法(充分)

    方法3)、Allpairs工具实现
    使用allpairs工具:
    Cmd-----进入allpairs目录下 cd C:\Documents and Settings\51testing\桌面\allpairs----
    新建空白excl文件,将条件复制到excl中,

    TEST CASES
    case 土壤酸碱度 土壤潮湿度 土壤温度
    1 酸性 潮湿 高温
    2 酸性 干燥 低温
    3 碱性 潮湿 低温
    4 碱性 干燥 高温
    5 中性 潮湿 高温
    6 中性 干燥 低温

    7.4.环境搭建
    假设一个WEB站点,该站点有大量的服务器和操作系统,并且有许多具有各种插件的浏览器浏览:

    环境配置 Web浏览器 浏览器插件 操作系统 服务器
    配置选项 IE RealPlayer WinXP IIS
    Firefox Flash Win2000 Tomcat
    PDF Reader Win2003 Weblogic
    Baidu Win 7
    XunLei

    练习:进销存

    条件:
    仓库:所有、具体
    大类和小类:所有-所有、具体-所有、具体-具体
    关键词:不填、货号(模糊)、产品名称(模糊)

    其他
    输入域
    寻找输入中的特殊值
    如:注册页面输入用户名:hujintao、admin、administrator…….
    如:结构化输入(相互制约)要考虑组合:日期(年月日)、国家—城市,进销存权限复选控制(库存查询、删除)
    【上下级关系的选项】
    员工权限
    Bug:不选库存查询可以选择修改和删除。
    输出域
    找输出或者设计的等价类和边界值----根据结果的边界反推出输入
    如:数据库涉及时间的查询(首尾时间参考数据的第一条和最后一条记录的时间)
    如:QC需求,同级最大的需求数量:263
    最多的子集层数:255/3 = 85
    如:QC中的日志最大行数、
    如:QC中添加字段最多可以添加24个字段(可以通过查看数据库中的表得到)。

    异常分析
    可靠特性:容错、恢复
    如:SQL Server的导入功能(在源数据上构造错误数据,看异常处理功能的代码是否正确)
    如:进销存的数据还原

    错误猜测
    凭经验
    如:数字输入框(非数字字符的输入控制,小数点的个数)
    数据库的设计(约束关系)

    作业:
    三角形问题:

    成立条件:两边之和大于第三边。
    1、等价类
    2、判定表
    3、流程分析。
    密码修改问题:
    1、判定表
    流程分析

    展开全文
  • 经营,实施 He is suitable for the position as he is young enough to understand what the teenagers think but old enough to administrate their programs. 他很适合这个职位,因为他足够年轻,能够理解青少年...
     
    

    以下是我期末复习整理部分单元的题目的翻译:
    第3版新视野大学英语4读写教程
    Unit 1、2、3、5、6 Section A word in use 和Section B Sentence structure 部分的翻译

    Unit 1 A

    Text A: Words in use

    1. crumbled
      crumble 英/'krʌmb(ə)l/ vi. 崩溃,瓦解,消失
      As the gender barriers crumbled, the number of women working as lawyers, doctors, or bankers began to increase significantly from the mid-20th century.
      随着性别障碍的瓦解,从20世纪中期开始,从事律师、医生或银行家工作的女性数量开始显著增加。
    2. discern 英/dɪ’sɜːn/ vt. 看出,觉察出,辨明
      With the data collected each year, the owner of the shop can discern customer trends and how things like weather and economic indicators affect sales performance.
      通过每年收集的数据,店主可以了解顾客的趋势,以及天气、经济指标之类的事物对销售业绩的影响。
    3. surpass 英/sə’pɑːs/ vt. 超过,胜过
      His supervisor pushes and motivates him in such a positive manner that he is not only able to reach but to surpass his personal goals.
      他的上司以这样一种积极的方式推动和激励他,使他不仅能够达到而且能够超越自己的目标。
      supervisor 英/'suːpəvaɪzə;'sjuː/ n. 监督人,指导者;[管理] 管理人;检查员
    4. shrewd 英/ʃ ruː d/ a. 精明的,机敏的,准确的,英明的
      He is a man with a shrewd business sense. He has built his initial investment into a substantial and even excessively large fortune.
      他是个精明的生意人。他把最初的投资变成了一笔可观的、甚至是巨额的财富。
    5. conversion 英/ kən’vɜːʃ(ə) n/ n. 转变,改造,转换
      The conversion of nuclear radiation directly into electricity was an exciting possibility that was being vigorously explored in many laboratories in the 1950s.
      将核辐射直接转化为电能是20世纪50年代许多实验室正在积极探索的一种令人兴奋的可能性。
    6. distort 英/dɪ’stɔːt/ vt. 歪曲,曲解
      I was not only shocked but also disgusted that the report tried to distort the scientific facts in such a manner that even some highly-educated people were fooled.
      我不仅感到震惊,而且感到恶心,因为这份报告试图歪曲科学事实,甚至一些受过高等教育的人也被愚弄了。
    7. radiant 英/'reɪdɪənt/ a. 容光焕发的,喜悦的
      Sixty-two and blessed with his mother’s skin, the fisherman had withstood a lifetime of exposure to the sun and looked as radiant as a man in his forties.
      62岁的渔夫拥有母亲的皮肤,他一生都经受住了日晒,看上去像一个四十多岁的男人一样容光焕发。
    8. ingenious 英 /ɪn’dʒiːnɪəs/ a. 有独创性的,别出心裁的,构思巧妙的
      French educator Louis Braille invented a simple but ingenious code which has had an impact on the lives of generations of people who are blind.
      法国教育家路易斯·布莱叶发明了一种简单而巧妙的密码,这种密码对几代盲人的生活产生了影响。
    9. stumped
      stump 英 /stʌmp/ v. 使困惑,难倒
      The senators didn’t expect us to ask such tough questions, and when we finally did, they got stumped and didn’t know what to say.
      参议员们没想到我们会问这么棘手的问题,当我们终于提出时,他们被难住了,不知该说些什么。
    10. proposition 英 /prɒpə’zɪʃ(ə)n/ n. 提议,建议,主张,观点,看法
      This newly established university supports the proposition that a more diverse higher education system is desirable since it would enhance opportunities for lifelong learning.
      这所新成立的大学支持这样的观点:更多样化的高等教育体系是可取的,因为它将增加终身学习的机会。

    Unit 1 B

    Sentence structure

    1. These reports differ from his earlier work in that they offer solutions to public pension problems.
      这些报告不同于他早期的工作,因为它们为公共养老金问题提供了解决方案。
    2. These forums are unique in that they provide a venue for those with varying perspectives to have an open and honest dialog.
      这些论坛的独特之处在于,它们为不同观点的人提供了一个公开和诚实对话的场所。
      venue 英 /'venjuː/ n. 聚会地点;举行场所;犯罪地点;发生地点;(英格兰律)审判地(指郡或区)
    3. Social support has been found to act as a stress reducer in that it protects people in crisis from both physical and psychological problems.
      社会支持被发现是一种减压的方法,因为它可以保护处于危机中的人们免受身体和心理问题的伤害。

    Unit 2 A

    Text A: Words in use

    1. deficient 英 /dɪ’fɪʃ(ə)nt/ a.不足的,有缺陷的,缺乏的,不足的。
      We need to improve the quality of education so that our children will not leave school deficient in literary and reasoning skills.
      我们需要提高教育质量,使我们的孩子不会离开缺乏文学和推理技能的学校。
    2. prosecution 英 /prɒsɪ’kjuːʃ(ə)n/ n. 起诉,指控
      In a society governed by the rule of law,every citizen is subject to possible prosecution if he violates the law.
      在一个由法治的社会,每个公民都可能受到起诉,如果他违反了法律。
    3. outrage 英 /'aʊtreɪdʒ/ n.义愤,愤慨,震怒
      The pay gap between average workers and top corporate officers has led to pubic outrage as executives receive large packages despite falling share prices.
      普通员工与企业高管之间的薪酬差距,已引发公众的愤怒,因为尽管股价不断下跌,高管们仍能拿到巨额薪酬。
    4. appeased
      appease 英 /ə’piːz/ vt. 平息,安抚,抚慰
      The delicious meal appeased our hunger and made us feel warm again after having walked in the snow all day.
      这顿美餐使我们的饥饿感减轻了,让我们在雪中走了一整天后又感到温暖。
    5. conformity 英 /kən’fɔːmɪtɪ/ n. 遵守;符合;一致;
      The military insists on conformity in many areas,for example, dress and haircut,with the primary objective of promoting group unity.
      军方坚持整合在许多领域,例如,服装和发型,促进集团统一的主要目标。
    6. strand 英 /strænd/ n. (线、绳、头发等的)股,缕
      My daughter used to play with the dog by taking a strand of its hair and then spending a long time rubbing, combing and twisting it.
      我女儿过去常和这只狗玩耍,把它的一缕头发剪下来,然后花很长时间揉搓、梳理和捻。
    7. complement 英 /'kɒmplɪm(ə)nt/ vt. 与……相配,与……互补
      When she left for the party,she took great care to make her necklace and shoes complement her dress.
      当她动身去聚会时,她非常认真地去试图把她的项链和鞋子与她的衣服配套起来。
    8. transient 英 /'trænzɪənt/ a. 短暂的,临时的
      It was necessary to provide living places for transient immigrants passing through the area on their way to more permanent dwellings.
      有必要为经过这一地区前往更永久住所的临时移民提供居住场所。
    9. appliance /əˈplaɪəns/ n. 家用电器
      appliances
      They had just moved in,so they needed to buy a number of kitchen appliances, including a microwave oven, a toaster,and a coffee maker.
      他们刚刚搬进来的,所以他们需要购买一些厨房电器,包括微波炉,烤面包机,咖啡机。
    10. outfit /ˈaʊtfɪt/ n. (尤指在特殊场合穿的)全套服装
      She wanted a beautiful and elegant outfit to attend the wedding of a friend, but couldn’t find anything satisfactory in the nearby shops.
      她想要一套漂亮雅致的衣服去参加一个朋友的婚礼,但在附近的商店里找不到满意的东西。

    Unit 2 B

    Sentence structure

    1. What they were worried about was more than just the cost of the machine itself. It would be expensive to keep it up too.
      他们不仅担心购买机器本身的成本,也担心维护起来机器会很昂贵。
    2. The island is more than just a place to visit for fun. It is also a center of the shipbuilding industry in this region.
      这个岛不仅是一个好玩的地方,也是该地区造船业的中心。
    3. For me and the kids, Mother Earth News is more than just a magazine that introduces various kinds of healthy diets; it is a friend who gives us comfort!
      对我和孩子们来说,地球母亲新闻不仅仅是一本介绍各种健康饮食的杂志;也是能给我们安慰的朋友!

    Unit 3 A

    Text A: Words in use

    1. exquisite 英 /'ekskwɪzɪt; ɪk’skwɪzɪt; ek-/ a. 精致的,精美的
      The curtains changed the atmosphere of the house completely and made it into a place of exquisite beauty.
      窗帘完全改变了房子的气氛,使它成为一个优美的地方。
    2. disperse 英 /dɪ’spɜːs/ v. (使)分散,驱散
      dispersed
      As the sun dispersed the clouds, we enjoyed our afternoon of playing cards in the forest under the clear sky and observing the most spectacular view I have ever seen in my life.
      当太阳驱散乌云时,我们在晴朗的天空下的森林里打牌,欣赏着我从未见过的最壮观的景色。
    3. decentralize 英 /di:'sentrə’laɪz/ v. (使)(政府、组织等的部门)分散
      decentralized
      The big company decentralized their operations last year and opened several regional offices in the country to meet the needs of the market.
      这家大公司去年分散了业务,并在该国开设了几个地区办事处,以满足市场的需要。
    4. deduce /dɪ’djuːs/ vt. 推论,推断;演绎出
      It is not easy to deduce a trend of growth from the available facts since they are quite scarce and not that convincing.
      从现有的事实推断增长趋势是不容易的,因为它们非常稀少,也没有那么令人信服。
      scarce /skeəs/adj. 缺乏的,不足的;稀有的
    5. fixture /'fɪkstʃə; -tjə/ n. 设备;固定装置;固定于某处不大可能移动之物
      Formerly found only in large industrial applications, microwave ovens now have become a standard fixture of most modern kitchens.
      以前只在大型工业应用中被发现,现在微波炉已经成为大多数现代厨房的标准设备。
    6. frugality /fruː’gælɪtɪ/ n. 俭省,节俭
      He calls on the public to save in everyday life and believes that frugality is the key to battling a culture that rewards mindless consumption.
      他呼吁公众在日常生活中储蓄,并相信节俭是对抗鼓励盲目消费的文化的关键。
    7. administrate /əd’mɪnɪstreɪt/ vt. 管理;经营,实施
      He is suitable for the position as he is young enough to understand what the teenagers think but old enough to administrate their programs.
      他很适合这个职位,因为他足够年轻,能够理解青少年的想法,但足够成熟,能够管理他们的项目。
    8. disjointed /dɪs’dʒɒɪntɪd/ adj. 脱节的;杂乱的;脱臼的
      When asked about her whereabouts at 9 o’clock that night, she gave a rather disjointed response, which caught the detective’s attention.
      当被问及那天晚上9点她在哪里时,她回答得相当不连贯,引起了侦探的注意。
    9. revive /rɪ’vaɪv/ vi. 复兴;复活;苏醒;恢复精神
      Reviving
      Reviving the stalled economy and sticking to promises to bring the deficit down next year is proving to be the principal test for the new president.
      复苏停滞的经济,并坚持承诺明年将削减赤字,这将成为新总统的主要考验。
      stall vi. 停止,停转;拖延
    10. elapse /ɪ’læps/ vi. 消逝;时间过去
      A considerable period of time has to elapse before the effects of such security measures as closed-circuit television cameras and cell-phone monitoring become evident in reducing crimes.
      闭路电视摄像机和手机监控等安全措施在减少犯罪方面的效果还需要相当长一段时间才能显现出来。

    Unit 3 B

    Sentence structure

    1. If he goes on taking ererything passively like this, he will never be confident enough to say NO to those kids who are fond of teasing him.
      如果他继续这样被动地接受一切,他将永远不会有足够的信心对那些喜欢戏弄他的孩子说不。
      tease /tiːz/ vt. 取笑;戏弄;梳理;欺负;强求;使起毛
    2. I know I’m already 80, but with a heart like mine, I will never be old enough to stop laughing at funny words.
      我知道我已经80岁了,但是有一颗像我这样的心,我永远不会老到停止对有趣的话发笑的地步。
    3. Although I was never fortunate/lucky enough to meet your grandmother, I’ve enjoyed hearing you tell stories about her and seeing your face light up when talking about her.
      虽然我从未有幸见到你的祖母,但我很高兴听到你讲述她的故事,看到你谈起她时面露喜色。

    Unit 5 A

    Text A: Words in use

    1. fabricate /'fæbrɪkeɪt/ vt. 制造;伪造;装配
      Although he was not a legal expert, he knew it would not be proper to fabricate anything to mislead the public.
      虽然他不是法律专家,但他知道编造任何误导公众的东西都是不恰当的。

    2. nominal [ˈnɒmɪnl] adj. 名义上的; 微不足道的; 票面上的;
      He does not work full time there, but he has been the nominal head of the organization’s scholarship program for five years.
      他没有在那里全职工作,但他已经担任该组织奖学金项目的名义负责人五年了。

    3. temporal [ˈtempərəl] adj. 时间的; 世俗的; 暂存的;
      As Mark walked the sites on that initial trip of the migrants, he found some important temporal clues — dated bus tickets, shopping receipts and calendars.
      当马克在最初的移民之旅中走访这些网站时,他发现了一些重要的时间线索——注明日期的公共汽车票、购物收据和日历。

    4. reciprocal /rɪ’sɪprək(ə)l/ adj. 互惠的;相互的;倒数的,彼此相反的
      In urban planning, it is important to take into consideration the reciprocal influence between the transportation network and other facilities, for example shopping centers and medical centers.
      在城市规划中,重要的是考虑交通网络和其他设施之间的相互影响,如购物中心和医疗中心。

    5. denote /dɪ’nəʊt/ vt. 表示,指示
      denotes
      The label “Smart Choices” on the front of food packages usually denotes products that meet criteria for lower fat, sugar and sodium (钠) content.
      食品包装正面的“明智选择”标签通常表示产品符合低脂肪、低糖和低钠的标准。
      criteria /kraɪ’tɪərɪə/ n. 标准,条件
      sodium /'səʊdɪəm/
      content /kən’tent/ n. 内容,目录;满足;容量

    6. consecutive /kən’sekjʊtɪv/ adj. 连贯的;连续不断的
      The public high school graduation rates in New Mexico and Arizona have been increasing for three consecutive years, thanks to an online program that helps students earn missing credits.
      新墨西哥州和亚利桑那州的公立高中毕业率已经连续三年上升,这要归功于一个在线项目,该项目帮助学生获得缺失的学分。

    7. spectator /spek’teɪtə/ n. 观众;旁观者
      spectators
      In the accident at the air show last week, a pilot and 10 spectators were killed when a fighter plane crashed into the crowd.
      在上周航空展的事故中,一架战斗机撞向人群,造成一名飞行员和10名观众死亡。
      pilot /'paɪlət/ n. 飞行员;领航员

    8. muttering /'mʌtərɪŋ/ n. 独自怨言,喃喃自语
      The mother was not sure where the boys went, but she did hear them muttering something about going out for a movie with friends.
      母亲不知道男孩们去了哪里,但她听到他们嘀咕着要和朋友出去看电影。

    9. composite /'kɒmpəzɪt/ adj. 复合的,合成的;(火车车厢)综合的;(柱式)混合的;菊科的
      This newly released portrait of Planet Earth is actually a composite of several pictures taken earlier this month by a new research satellite.
      这张最新发布的地球照片实际上是本月早些时候由一颗新的研究卫星拍摄的几张照片的合成。

    10. malicious /mə’lɪʃəs/ adj. 恶意的;恶毒的;蓄意的;怀恨的
      You shouldn’t feel insulted. We can assure you he meant to be friendly and there was nothing impolite or malicious in his words.
      你不应该感到受侮辱。我们可以向你保证,他的本意是友好的,他的话中没有任何不礼貌或恶意。

    Unit 5 B

    Sentence structure

    1. If we have enough oil in our own country, why import a large amount from somewhere else every year?
      如果我们自己的国家有足够的石油,为什么每年要从其他地方进口大量的石油呢?
    2. Since video communication through the Internet is convenient, why a time-consuming and expensive flight trip to attend the conference/meeting?
      既然通过互联网进行视频通讯很方便,为什么要花费大量的时间和金钱去乘机票参加会议呢?
    3. Why at a crowded bar so far from home? We can just meet at a restaurant close to where we live.
      为什么要在离家这么远的拥挤的酒吧里呢?我们可以在离我们住处很近的餐馆见面。

    Unit 6 A

    Text A: Words in use

    1. alien /'eɪlɪən/ adj. 外国的;相异的,性质不同的;不相容的;陌生的
      When I first came to this city, everything was alien to me. It took me a long time to adjust myself to the new environment.
      当我第一次来到这座城市时,一切对我来说都是陌生的。我花了很长时间来适应新环境。
    2. optic /'ɒptɪk/ adj. 光学的;视觉的;眼睛的
      Something growing in her brain caused damage to her optic nerve, and doctors thought she would never see again.
      她大脑中生长的一些东西对她的视神经造成了损伤,医生认为她再也见不到东西了。
    3. symmetrical /sɪ’metrɪk(ə)l/ adj. 匀称的,对称的
      The front side of the house has a symmetrical arrangement of windows and door and two windows on each side.
      房子的正面有对称的窗户和门,每一面都有两扇窗户。
    4. lubricate /'luːbrɪkeɪt/ vi. 润滑;涂油;起润滑剂作用
      lubricated
      He cleaned the old machine and lubricated the moving parts with a little mineral oil, hoping that it could work again.
      他清洗了那台旧机器,并用一点矿物油给活动部件上了润滑油,希望它能再次运转。
    5. twinkled
      twinkle /'twɪŋk(ə)l/ v. 闪烁;(眼睛)闪亮,闪闪发光;发亮;轻快移动
      We could tell it was a crisp winter night because, overhead, between the shadows of the buildings, a multitude of stars twinkled.
      我们可以看出这是一个清爽的冬夜,因为头顶上,在建筑物的阴影之间,闪烁着许多星星。
    6. mediator /'miːdɪeɪtə/ n. 调停者;传递者;中介物
      During his work on child protection, he often acts as a mediator between parents and children, making the parents know what they can do and what they cannot do.
      在他的儿童保护工作中,他经常充当父母和孩子之间的调解人,让父母知道他们能做什么和不能做什么。
    7. outpost /'aʊt,post/ n. 前哨;警戒部队;边区村落
      outposts
      Due to safety concerns, the commander ordered his troops to leave their outposts in the mountains and return to their bases in the nearby village.
      出于安全考虑,指挥官命令他的部队离开山区的前哨,返回附近村庄的基地。
    8. traverse /'trævəs; trə’vɜːs/ v. 穿过;来回移动;反驳;阻挠;详细研究;旋转
      traversing
      It’s exciting to travel to a foreign place, no matter whether you’re traversing the wilds of Africa or just making a weekend trip to the countryside.
      到国外旅行是令人兴奋的,不管你是在穿越非洲的荒野,还是只是周末去乡下旅行。
    9. emancipate /ɪ’mænsɪpeɪt/ vt. 解放;释放
      In the 1970s, a number of countries passed laws to protect women’s rights, announcing that they would emancipate women through education and work.
      20世纪70年代,一些国家通过了保护妇女权利的法律,宣布将通过教育和工作解放妇女。
    10. deductive /dɪ’dʌktɪv/ adj. 演绎的;推论的;推断的
      The basic idea of deductive reasoning is that if something is true of a class of things in general, this truth applies to all members of that class.
      演绎推理的基本思想是,如果某件事对某一类事物是真实的,那么这个真理适用于这类事物的所有成员。

    Unit 6 B

    Sentence structure

    1. Her parents could no more persuade her to study maths than they could persuade her to stop wearing skirts and makeup.
      她的父母无法说服她学习数学,就像他们无法说服她停止穿裙子和化妆一样。
    2. I would no more believe any word he said than I would allow myself to be bitten by the same snake twice.
      我不会相信他说的任何话,就像我不会让自己被同一条蛇咬两次一样。
    3. He would no more dare speak before a large audience than he would dare jump off the top of a 20-story building.
      他不敢在一大群观众面前讲话,就像他不敢从20层楼高的楼顶跳下去一样。
    展开全文
  • 软件测试面试题汇总

    万次阅读 多人点赞 2018-09-27 12:31:09
    28、软件配置管理工作开展的情况认识? ................................................................................................. 9 29、你觉得软件测试通过的标准应该是什么样的? ................
    转载自: https://blog.csdn.net/koudaidai/article/details/7394126

    软件测试面试题汇总

    测试技术面试题

    ........................................................................................................................................................................ 5

    1、什么是兼容性测试?兼容性测试侧重哪些方面?.................................................................................... 5

    2、我现在有个程序,发现在Windows上运行得很慢,怎么判别是程序存在问题还是软硬件系统存在问题?       5

    3、测试的策略有哪些?................................................................................................................................. 5

    4、正交表测试用例设计方法的特点是什么?............................................................................................... 5

    5、描述使用bugzilla缺陷管理工具对软件缺陷(BUG)跟踪的管理的流程?.......................................... 5

    6、你觉得bugzilla在使用的过程中,有什么问题?................................................................................. 5

    7、描述测试用例设计的完整过程?.............................................................................................................. 6

    8、单元测试的策略有哪些?......................................................................................................................... 6

    9、LoadRunner分哪三部分?....................................................................................................................... 6

    10、LoadRunner进行测试的流程?................................................................................................................ 6

    什么是并发?在lordrunner中,如何进行并发的测试?集合点失败了会怎么样?.................................. 6

    12、使用QTP做功能测试,录制脚本的时候,要验证多个用户的登录情况/查询情况,如何操作?......... 6

    13、QTP中的Action有什么作用?有几种?................................................................................................. 6

    14、TestDirector有些什么功能,如何对软件测试过程进行管理?............................................................... 7

    15、你所熟悉的软件测试类型都有哪些?请试着分别比较这些不同的测试类型的区别与联系(如功能测试、性能测试……)?........................................................................................................................................... 7

    16、条软件缺陷(或者叫Bug)记录都包含了哪些内容?如何提交高质量的软件缺陷(Bug)记录?...... 8

    17、Beta测试与Alpha测试有什么区别?...................................................................................................... 8

    18、软件的评审一般由哪些人参加?其目的是什么?.................................................................................. 8

    19、测试活动中,如果发现需求文档不完善或者不准确,怎么处理?........................................................ 8

    20、阶段评审与项目评审有什么区别?......................................................................................................... 8

    21、阐述工作版本的定义?............................................................................................................................ 8

    22、什么是桩模块?什么是驱动模块?......................................................................................................... 8

    23、什么是扇入?什么是扇出?.................................................................................................................... 8

    24、你认为做好测试计划工作的关键是什么?............................................................................................. 8

    25、你认为做好测试用例工作的关键是什么?............................................................................................. 9

    26、简述一下缺陷的生命周期?.................................................................................................................... 9

    27、软件的安全性应从哪几个方面去测试?................................................................................................. 9

    28、软件配置管理工作开展的情况和认识?................................................................................................. 9

    29、你觉得软件测试通过的标准应该是什么样的?.................................................................................... 10

    30、引入测试管理的含义?......................................................................................................................... 10

    31、一套完整的测试应该由哪些阶段组成?............................................................................................... 10

    32、单元测试的主要内容?......................................................................................................................... 10

    33、集成测试也叫组装测试或者联合测试,请简述集成测试的主要内容?.............................................. 10

    34、简述集成测试与系统测试关系?.......................................................................................................... 10

    35、软件测试的文档测试应当贯穿于软件生命周期的全过程,其中用户文档是文档测试的重点。那么软件系统的用户文档包括哪些?.............................................................................................................................. 10

    36、软件系统中除用户文档之外,文档测试还应该关注哪些文档?.......................................................... 10

    37、简述软件系统中用户文档的测试要点?............................................................................................... 11

    38、单元测试主要内容是什么?.................................................................................................................. 11

    39、如何理解强度测试?............................................................................................................................. 13

    40、如何理解压力、负载、性能测试测试?............................................................................................... 13

    41、什么是系统瓶颈?................................................................................................................................. 13

    42、文档测试主要包含什么内容?.............................................................................................................. 13

    43、功能测试用例需要详细到什么程度才是合格的?................................................................................ 14

    44、配置和兼容性测试的区别是什么?....................................................................................................... 14

    45、软件文档测试主要包含什么?.............................................................................................................. 15

    46、没有产品说明书和需求文档地情况下能够进行黑盒测试吗?............................................................. 15

    47、测试中的“杀虫剂怪事”是指什么?................................................................................................... 15

    48、在配置测试中,如何判断发现的缺陷是普通问题还是特定的配置问题?........................................... 15

    49、为什么尽量不要让时间有富裕的员工去做一些测试?......................................................................... 16

    50、完全测试程序是可能的吗?.................................................................................................................. 16

    51、软件测试的风险主要体现在哪里?....................................................................................................... 16

    52、发现的缺陷越多,说明软件缺陷越多吗?........................................................................................... 16

    53、所有的软件缺陷都能修复吗?所有的软件缺陷都要修复吗?............................................................. 17

    54、软件测试人员就是QA吗?.................................................................................................................... 17

    55、如何减少测试人员跳槽带来的损失?................................................................................................... 17

    56、测试产品与测试项目的区别是什么?................................................................................................... 17

    57、和用户共同测试(UAT测试)的注意点有哪些?................................................................................. 18

    58、如何编写提交给用户的测试报告?....................................................................................................... 18

    59、测试工具在测试工作中是什么地位?................................................................................................... 18

    60、什么是软件测试,软件测试的目的?................................................................................................... 18

    61、简述负载测试与压力测试的区别。....................................................................................................... 19

    62、写出bug报告流转的步骤,每步的责任人及主要完成的工作。.......................................................... 19

    63、写出bug报告当中一些必备的内容。................................................................................................... 19

    64、开发人员老是犯一些低级错误怎么解决?........................................................................................... 20

    65、画出软件测试的V模型图。.................................................................................................................. 20

    66、为什么要在一个团队中开展软件测试工作?........................................................................................ 20

    67、您在以往的测试工作中都曾经具体从事过哪些工作?其中最擅长哪部分工作?............................... 20

    68、您所熟悉的软件测试类型都有哪些?请试着分别比较这些不同的测试类型的区别与联系(如功能测试、性能测试……)............................................................................................................................................. 20

    69、您认为做好测试用例设计工作的关键是什么?.................................................................................... 21

    70、请试着比较一下黑盒测试、白盒测试、单元测试、集成测试、系统测试、验收测试的区别与联系。21

    71、测试计划工作的目的是什么?测试计划工作的内容都包括什么?其中哪些是最重要的?................. 22

    72、您所熟悉的测试用例设计方法都有哪些?请分别以具体的例子来说明这些方法在测试用例设计工作中的应用。................................................................................................................................................................ 22

    73、请以您以往的实际工作为例,详细的描述一次测试用例设计的完整的过程。.................................... 23

    74、您以往是否曾经从事过性能测试工作?如果有,请尽可能的详细描述您以往的性能测试工作的完整过程。................................................................................................................................................................ 23

    75、你对测试最大的兴趣在哪里?为什么?................................................................................................ 23

    76、你以前工作时的测试流程是什么?....................................................................................................... 24

    77、当开发人员说不是BUG时,你如何应付?.......................................................................................... 24

    78、软件的构造号与版本号之间的区别?BVT(BuildVerificationTest)............................................... 24

    79、您以往的工作中,一条软件缺陷(或者叫Bug)记录都包含了哪些内容?如何提交高质量的软件缺陷(Bug)记录?.................................................................................................................................................... 25

    80、您以往所从事的软件测试工作中,是否使用了一些工具来进行软件缺陷(Bug)的管理?如果有,请结合该工具描述软件缺陷(Bug)跟踪管理的流程。.......................................................................................... 25

    81、您认为性能测试工作的目的是什么?做好性能测试工作的关键是什么?........................................... 25

    82、单元测试、集成测试、系统测试的侧重点是什么?............................................................................. 25

    83、集成测试通常都有那些策略?............................................................................................................... 25

    84、一个缺陷测试报告的组成...................................................................................................................... 25

    85、基于WEB信息管理系统测试时应考虑的因素有哪些?......................................................................... 25

    86、软件测试项目从什么时候开始,?为什么?........................................................................................ 26

    87、需求测试注意事项有哪些?.................................................................................................................. 26

    88、简述一下缺陷的生命周期...................................................................................................................... 26

    89、你在你所在的公司是怎么开展测试工作的?是如何组织的?............................................................. 26

    90、你认为理想的测试流程是什么样子?................................................................................................... 26

    91、您在从事性能测试工作时,是否使用过一些测试工具?如果有,请试述该工具的工作原理,并以一个具体的工作中的例子描述该工具是如何在实际工作中应用的。...................................................................... 26

    92、软件测试活动的生命周期是什么?....................................................................................................... 26

    93、请画出软件测试活动的流程图?.......................................................................................................... 26

    94、针对缺陷采取怎样管理措施?.............................................................................................................. 26

    95、什么是测试评估?测试评估的范围是什么?........................................................................................ 26

    96、如果能够执行完美的黑盒测试,还需要进行白盒测试吗?为什么?.................................................. 26

    97、测试结束的标准是什么?...................................................................................................................... 26

    98、软件验收测试除了alpha ,beta测试以外,还有哪一种?.................................................................... 26

    99、做测试多久了?以前做过哪些项目?你们以前测试的流程是怎样的?用过哪些测试工具?............. 27

    100、请就如何在开发中进行软件质量控制说说你的看法.......................................................................... 27

    101、一套完整的测试应该由哪些阶段组成?分别阐述一下各个阶段。.................................................... 27

    102、软件测试的类型有那些?分别比较这些不同的测试类型的区别与联系。......................................... 27

    103、测试用例通常包括那些内容?着重阐述编制测试用例的具体做法.................................................... 27

    104、在分别测试winform的C/S结构与测试WEB结构的软件是,应该采取什么样的方法分别测试?他们存在什么样的区别与联系?.................................................................................................................................. 27

    105、在测试winform的C/S结构软件时,发现这个软件的运行速度很慢,您会认为是什么原因?您会采取哪些方法去检查这个原因?.............................................................................................................................. 27

    106、描述使用bugzilla缺陷管理工具对软件缺陷(BUG)跟踪的管理的流程........................................ 27

    107、你都用什么测试方法 针对不同的产品或者系统或者模块,有不同的测试方法。总体而言有白盒测试和黑盒测试。.................................................................................................................................................... 27

    108、怎么编写案例 案例的编写与测试阶段的定义有很大的关系。系统测试和unit测试的案例可能不同。总体而言测试案例根据系统的需求而定。....................................................................................................... 27

    109、怎么才能够全面的测试到每一个点 测试的全面性主要需要在设计测试计划的时候考虑,从测试策略,产品需求等等多个角度考虑从而定义全部的测试点。................................................................................. 27

    110、谈谈软件测试技术,以及如何提高..................................................................................................... 27

    111、谈谈软件测试职业发展,以及个人的打算......................................................................................... 27

    112、谈谈软件测试在企业的地位,也可以结合软件生命周期来谈........................................................... 27

    113、一般公司里实际的软件测试流程是什么样的?你们公司又是怎样的?............................................ 27

    114、软件工程师要具有那些素质?............................................................................................................ 27

    115、你会哪些测试工具?怎么操作?........................................................................................................ 27

    116、你能不能说下你的3到5年的职业计划(规划)............................................................................... 27

    117、你觉得你来应聘有那些优势?............................................................................................................ 27

    其他问题:(有可能清晰的思路比确切的答案更重要)............................................................................. 27

     

    开发及环境搭建类面试题

    ....................................................................................................................................................................... 28

    1、描述软件产生内存泄露的原因以及检查方式。(可以结合一种开发语言进行描述)............................ 28

    2、简述什么是值传递,什么是地址传递,两者区别是什么?................................................................... 28

    3、结构化程序设计和面向对象程序设计各自的特点及优缺点是什么?.................................................... 28

    4、简述什么是存储过程和触发器?............................................................................................................. 28

    5、使用C语言编写一个函数,用于交换两个变量的值(地址传递)。...................................................... 29

    6、请简述DNS、活动目录、域的概念。..................................................................................................... 29

    7、描述TCP/IP协议的层次结构,以及每一层中重要协议。...................................................................... 29

    8、简述子网掩码的用途。............................................................................................................................ 29

    9、说出4种以上常用的操作系统及其主要的应用范围(微软的操作系统除外)。.................................... 29

    10、在Linux系统中,一个文件的访问权限是755,其含义是什么?......................................................... 29

    11、Windows操作系统中PATH环境变量的作用是什么?.......................................................................... 30

    12、Ghost的主要用途和常用方法?........................................................................................................... 30

    13、在RedHat中,从root用户切到userl用户,一般用什么命令?..................................................... 30

    14、Linux中,一般怎么隐藏文件?........................................................................................................... 30

    15、如何将自己的本地磁盘(D)做成FTP供远端主机使用?................................................................... 30

    16、对RUP.CMM,CMMI,XP,PSP.TSP的认识?............................................................................................. 30

    17、DNS是什么,它是如何工作的?............................................................................................................... 31

    18、防火墙如何保证安全的?主要有哪些?............................................................................................... 31

    19、目前流行的操作的系统有哪些?请举例说明安装操作系统的注意事项?........................................... 33

    20、简述一下c/s模式或者b/s模式?....................................................................................................... 33

    21、TCP/UDP有哪些区别?.......................................................................................................................... 34

    22、ISO模型?HUB、tch、Router是ISO的第几层设备?....................................................................... 34

    23、内存有哪几种存储组织结构.请分别加以说明?.................................................................................. 34

     

    人力资源面试题

    ....................................................................................................................................................................... 34

    1、你的测试职业发展是什么?你自认为做测试的优势在哪里?................................................................ 34

    2、你为什么想离开目前的职务?................................................................................................................ 34

    3、你对我们公司了解有多少?.................................................................................................................... 34

    4、你找工作时,最重要的考虑因素为何?................................................................................................. 34

    5、为什么我们应该录取你?........................................................................................................................ 34

    6、请谈谈你个人的最大特色。.................................................................................................................... 34

    7、一个测试工程师应具备那些素质和技能?.............................................................................................. 35

    8、您认为在测试人员同开发人员的沟通过程中,如何提高沟通的效率和改善沟通的效果?维持测试人员同开发团队中其他成员良好的人际关系的关键是什么?..................................................................................... 35

    9、在您以往的测试工作中,最让您感到不满意或者不堪回首的事情是什么?您是如何来对待这些事情的?35

    10、在即将完成这次笔试前,您是否愿意谈一些自己在以往的学习和工作中获得的工作经验和心得体会?(可以包括软件测试、过程改进、软件开发或者与此无关的其他方面)....................................................... 35

    11、为什么选择测试这行?......................................................................................................................... 35

    12、你的工作通常能在时限内完成吗.(我想问一下就是她问这个问题的动机是什么).......................... 35

    13、通常你对于别人批评你会有什么样的反应........................................................................................... 35

    14、如果明知这样做不对,你还会依主管的指过去做吗?......................................................................... 35

    15、如果你接到一个客户抱怨的电话,你确知无法解决他的问题,你会怎么处理?............................... 35

    16、请就软件测试人员应该具备什么样的基本素质说说你的看法。.......................................................... 36

    17、你在五年内的个人目标和职业目标分别是什么?................................................................................ 36

    18、你怎样做出自己的职业选择?.............................................................................................................. 36

     

     

     

     

     

     

     

     

    测试技术面试题

    1、什么是兼容性测试?兼容性测试侧重哪些方面?

    参考答案:

    兼容测试主要是检查软件在不同的硬件平台、软件平台上是否可以正常的运行,即是通常说的软件的可移植性。

    兼容的类型,如果细分的话,有平台的兼容,网络兼容,数据库兼容,以及数据格式的兼容。

    兼容测试的重点是,对兼容环境的分析。通常,是在运行软件的环境不是很确定的情况下,才需要做兼容。根据软件运行的需要,或者根据需求文档,一般都能够得出用户会在什么环境下使用该软件,把这些环境整理成表单,就得出做兼容测试的兼容环境了。

    兼容和配置测试的区别在于,做配置测试通常不是Clean OS下做测试,而兼容测试多是在Clean OS的环境下做的。

    2、我现在有个程序,发现在Windows上运行得很慢,怎么判别是程序存在问题还是软硬件系统存在问题?

    参考答案:

    1、检查系统是否有中毒的特征;

    2、检查软件/硬件的配置是否符合软件的推荐标准;

    3、确认当前的系统是否是独立,即没有对外提供什么消耗CPU资源的服务;

    4、如果是C/S或者B/S结构的软件,需要检查是不是因为与服务器的连接有问题,或者访问有问题造成的;

    5、在系统没有任何负载的情况下,查看性能监视器,确认应用程序对CPU/内存的访问情况。

    3、测试的策略有哪些?

    参考答案:

    黑盒/白盒,静态/动态,手工/自动,冒烟测试,回归测试,公测(Beta测试的策略)

    4、正交表测试用例设计方法的特点是什么?

    参考答案:

    用最少的实验覆盖最多的操作,测试用例设计很少,效率高,但是很复杂;

    对于基本的验证功能,以及二次集成引起的缺陷,一般都能找出来;但是更深的缺陷,更复杂的缺陷,还是无能为力的;

    具体的环境下,正交表一般都很难做的。大多数,只在系统测试的时候使用此方法。

    5、描述使用bugzilla缺陷管理工具对软件缺陷(BUG)跟踪的管理的流程?

    参考答案:

    就是Bugzilla的状态转换图。

    6、你觉得bugzilla在使用的过程中,有什么问题?

    参考答案:

    界面不稳定;

    根据需要配置它的不同的部分,过程很烦琐。

    流程控制上,安全性不好界定,很容易对他人的Bug进行误操作;

    没有综合的评分指标,不好确认修复的优先级别。

    7、描述测试用例设计的完整过程?

    参考答案:

    需求分析 + 需求变更的维护工作;

    根据需求 得出测试需求;

    设计测试方案,评审测试方案;

    方案评审通过后,设计测试用例,再对测试用例进行评审;

    8、单元测试的策略有哪些?

    参考答案:

    逻辑覆盖、循环覆盖、同行评审、桌前检查、代码走查、代码评审、景泰数据流分析

    9、LoadRunner分哪三部分?

    参考答案:

    用户动作设计;

    场景设计;

    测试数据分析;

    10、LoadRunner进行测试的流程?

    参考答案:

    1、 测试测试

    2、 创建虚拟用户脚本

    3、 创建运行场景

    4、 运行测试脚本

    5、 监视场景

    6、 分析测试的结果

    以上,最好是结合一个案例,根据以上流程来介绍。

    什么是并发?在lordrunner中,如何进行并发的测试?集合点失败了会怎么样?

    参考答案:

    在同一时间点,支持多个不同的操作。

    LoadRunner中提供IP伪装,集合点,配合虚拟用户的设计,以及在多台电脑上设置,可以比较好的模拟真实的并发。

    集合点,即是多个用户在某个时刻,某个特定的环境下同时进行虚拟用户的操作的。集合点失败,则集合点的才操作就会取消,测试就不能进行。

    12、使用QTP做功能测试,录制脚本的时候,要验证多个用户的登录情况/查询情况,如何操作?

    参考答案:

    分析用户登录的基本情况,得出一组数据,通过性测试/失败性测试的都有(根据TC来设计这些数据),然后录制登录的脚本,将关键的数据参数化,修改脚本,对代码进行加强,调试脚本。

    13、QTP中的Action有什么作用?有几种?

    参考答案:

    Action的作用

    用Action可以对步骤集进行分组

    步骤重组,然后被整体调用

    拥有自己的sheet

    组合有相同需求的步骤,整体操作

    具有独立的对象仓库

    Action的种类

    可复用Action

    不可复用Action

    外部Action

    14、TestDirector有些什么功能,如何对软件测试过程进行管理?

    参考答案:

     需求管理

    定义测试范围

    定义需求树

    描述需求树的功能点

    测试计划

    定义测试目标和测试策略。

    分解应用程序,建立测试计划树。

    确定每个功能点的测试方法。

    将每个功能点连接到需求上,使测试计划覆盖全部的测试需求。

    描述手工测试的测试步骤

    指明需要进行自动测试的功能点

    测试执行

    定义测试集合。

    为每个测试人员制定测试任务和测试日程安排。

    运行自动测试。

    缺陷跟踪

    记录缺陷

    查看新增缺陷,并确定哪些是需要修正的

    相关技术人员修改缺陷

    回归测试

    分析缺陷统计图表,分析应用程序的开发质量。

    15、你所熟悉的软件测试类型都有哪些?请试着分别比较这些不同的测试类型的区别与联系(如功能测试、性能测试……)?

    参考答案:Compatibility Testing(兼容性测试),也称“Configuration testing(配置测试)”,测试软件是否和系统的其它与之交互的元素之间兼容,如:浏览器、操作系统、硬件等。验证测试对象在不同的软件和硬件配置中的运行情况。

     

    Functional testing (功能测试),也称为behavioral testing(行为测试),根据产品特征、操作描述和用户方案,测试一个产品的特性和可操作行为以确定它们满足设计需求。本地化软件的功能测试,用于验证应用程序或网站对目标用户能正确工作。使用适当的平台、浏览器和测试脚本,以保证目标用户的体验将足够好,就像应用程序是专门为该市场开发的一样。

    Performance testing(性能测试),评价一个产品或组件与性能需求是否符合的测试。包括负载测试、强度测试、数据库容量测试、基准测试等类型。

    16、软件缺陷(或者叫Bug)记录都包含了哪些内容?如何提交高质量的软件缺陷(Bug)记录?

    参考答案:5C标准

    17、Beta测试与Alpha测试有什么区别?

    参考答案:Beta testing(β测试),测试是软件的多个用户在一个或多个用户的实际使用环境下进行的测试。开发者通常不在测试现场

    Alpha testing (α测试),是由一个用户在开发环境下进行的测试,也可以是公司内部的用户在模拟实际操作环境下进行的受控测试

    18、软件的评审一般由哪些人参加?其目的是什么?

    参考答案:

    在正式的会议上将软件项目的成果(包括各阶段的文档、产生的代码等)提交给用户、客户或有关部门人员对软件产品进行评审和批准。其目的是找出可能影响软件产品质量、开发过程、维护工作的适用性和环境方面的设计缺陷,并采取补救措施,以及找出在性能、安全性和经济方面的可能的改进。

    人员:用户、客户或有关部门开发人员,测试人员,需求分析师都可以,就看处于评审那个阶段

    19、测试活动中,如果发现需求文档不完善或者不准确,怎么处理?

    参考答案:

    测试需求分析发现需求文档不完善或者不准确,应该立即和相关人员进行协调交流。

    20、阶段评审与项目评审有什么区别?

    参考答案:

    阶段评审对项目各阶段评审:对阶段成果和工作

    项目评审对项目总体评审:对工作和产品

    21、阐述工作版本的定义?

    参考答案:

    构造号: BUILD

    22、什么是桩模块?什么是驱动模块?

    参考答案:

    桩模块:被测模块调用模块

    驱动模块调用被测模块

    23、什么是扇入?什么是扇出?

    参考答案:

    扇入:被调次数,扇出:调其它模块数目

    24、你认为做好测试计划工作的关键是什么?

    参考答案:

    软件测试计划就是在软件测试工作正式实施之前明确测试的对象,并且通过对资源、时间、风险、测试范围和预算等方面的综合分析和规划,保证有效的实施软件测试;

    做好测试计划工作的关键:目的,管理,规范

    1. 明确测试的目标,增强测试计划的实用性

    编写软件测试计划得重要目的就是使测试过程能够发现更多的软件缺陷,因此软件测试计划的价值取决于它对帮助管理测试项目,并且找出软件潜在的缺陷。因此,软件测试计划中的测试范围必须高度覆盖功能需求,测试方法必须切实可行,测试工具并且具有较高的实用性,便于使用,生成的测试结果直观、准确

    2.坚持“5W”规则,明确内容与过程

    “5W”规则指的是“What(做什么)”、“Why(为什么做)”、“When(何时做)”、“Where(在哪里)”、“How(如何做)”。利用“5W”规则创建软件测试计划,可以帮助测试团队理解测试的目的(Why),明确测试的范围和内容(What),确定测试的开始和结束日期(When),指出测试的方法和工具(How),给出测试文档和软件的存放位置(Where)。

    3.采用评审和更新机制,保证测试计划满足实际需求

    测试计划写作完成后,如果没有经过评审,直接发送给测试团队,测试计划内容的可能不准确或遗漏测试内容,或者软件需求变更引起测试范围的增减,而测试计划的内容没有及时更新,误导测试执行人员。

    4. 分别创建测试计划与测试详细规格、测试用例

    应把详细的测试技术指标包含到独立创建的测试详细规格文档,把用于指导测试小组执行测试过程的测试用例放到独立创建的测试用例文档或测试用例管理数据库中。测试计划和测试详细规格、测试用例之间是战略和战术的关系,测试计划主要从宏观上规划测试活动的范围、方法和资源配置,而测试详细规格、测试用例是完成测试任务的具体战术。

    25、你认为做好测试用例工作的关键是什么?

    参考答案:

     需求和设计文档的理解程度,对系统的熟悉程度

    26、简述一下缺陷的生命周期?

    参考答案:提交->确认->分配->修复->验证->关闭

    27、软件的安全性应从哪几个方面去测试?

    参考答案:

    (1)用户认证机制:如数据证书、智能卡、双重认证、安全电子交易协议

    (2)加密机制

    (3)安全防护策略:如安全日志、入侵检测、隔离防护、漏洞扫描

    (4)数据备份与恢复手段:存储设备、存储优化、存储保护、存储管理

    (5)防病毒系统

    28、软件配置管理工作开展的情况和认识?

    参考答案:

    软件配置管理贯穿于软件开发、测试活动的始终,覆盖了开发、测试活动的各个环节,它的重要作用之一就是要全面的管理保存各个配置项,监控各配置项的状态,并向项目经理及相关的人员报告,从而实现对软件过程的控制。

    软件测试配置管理包括4个最基本的活动:

    配置项标识

    配置项控制

    配置项状态报告

    配置审计

           软件配置管理通常借助工具来辅助,主要有MS SourceSafe、Rational ClearCase等

    29、你觉得软件测试通过的标准应该是什么样的?

    参考答案:

        缺陷密度值达到客户的要求

    30、引入测试管理的含义?

    参考答案:风险分析,进度控制、角色分配、质量控制

    31、一套完整的测试应该由哪些阶段组成?

    参考答案:测试计划、测试设计与开发、测试实施、测试评审与测试结论

    32、单元测试的主要内容?

    参考答案:

     模块接口测试、局部数据结构测试、路径测试、错误处理测试、边界测试

    33、集成测试也叫组装测试或者联合测试,请简述集成测试的主要内容?

    参考答案:

    (1)在把各个模块连接起来的时候,穿越模块接口的数据是否会丢失;

     (2)一个模块的功能是否会对另一个模块的功能产生不利的影响;

     (3)各个子功能组合起来,能否达到预期要求的父功能;

     (4)全局数据结构是否有问题;

     (5)单个模块的误差累积起来,是否会放大,从而达到不能接受的程度。

    34、简述集成测试与系统测试关系?

    参考答案:

     (1)集成测试的主要依据概要设计说明书,系统测试的主要依据是需求设计说明书;

     (2)集成测试是系统模块的测试,系统测试是对整个系统的测试,包括相关的软硬件平台、网络以及相关外设的测试。

    35、软件测试的文档测试应当贯穿于软件生命周期的全过程,其中用户文档是文档测试的重点。那么软件系统的用户文档包括哪些?

    参考答案:

      用户手册

      安装和设置指导

      联机帮助

      指南、向导

      样例、示例和模板

      授权/注册登记表

    最终用户许可协议

    36、软件系统中除用户文档之外,文档测试还应该关注哪些文档?

    参考答案:

    开发文档

    软件需求说明书

        数据库设计说明书

        概要设计说明书

        详细设计说明书

        可行性研究报告

    管理文档

        项目开发计划

        测试计划

        测试报告

        开发进度月报

        开发总结报告

    37、简述软件系统中用户文档的测试要点?

    参考答案:

     (1)读者群。文档面向的读者定位要明确。对于初级用户、中级用户以及高级用户应该有不同的定位

     (2)术语。文档中用到的术语要适用与定位的读者群,用法一致,标准定义与业界规范相吻合。

     (3)正确性。测试中需检查所有信息是否真实正确,查找由于过期产品说明书和销售人员夸大事实而导致的错误。检查所有的目录、索引和章节引用是否已更新,尝试链接是否准确,产品支持电话、地址和邮政编码是否正确。

     (4)完整性。对照软件界面检查是否有重要的分支没有描述到,甚至是否有整个大模块没有描述到。

     (5)一致性。按照文档描述的操作执行后,检查软件返回的结果是否与文档描述的相同。

     (6)易用性。对关键步骤以粗体或背景色给用户以提示,合理的页面布局、适量的图表都可以给用户更高的易用性。需要注意的是文档要有助于用户排除错误。不但描述正确操作,也要描述错误处理办法。文档对于用户看到的错误信息应当有更详细的文档解释。

     (7)图表与界面截图。检查所有图表与界面截图是否与发行版本相同。

     (8)样例与示例。像用户一样载入和使用样例。如果是一段程序,就输入数据并执行它。以每一个模块制作文件,确认它们的正确性。

     (9)语言。不出现错别字,不要出现有二义性的说法。特别要注意的是屏幕截图或绘制图形中的文字。

     (10)印刷与包装。检查印刷质量;手册厚度与开本是否合适;包装盒的大小是否合适;有没有零碎易丢失的小部件等等。

    38、单元测试主要内容是什么?

    参考答案:

    单元测试大多数由开发人员来完成,测试人员技术背景较好或者开发系统软件时可能会安排测试人员进行单元测试,大多数进行的单元测试都是开发人员调试程序或者开发组系统联合调试的过程。讨论这个问题主要是扩充一下读者的视野。

    单元测试一般包括五个方面的测试:

    (1)模块接口测试:模块接口测试是单元测试的基础。只有在数据能正确流入、流出模块的前提下,其他测试才有意义。模块接口测试也是集成测试的重点,这里进行的测试主要是为后面打好基础。测试接口正确与否应该考虑下列因素:

    -输入的实际参数与形式参数的个数是否相同;

    -输入的实际参数与形式参数的属性是否匹配;

    -输入的实际参数与形式参数的量纲是否一致;

    -调用其他模块时所给实际参数的个数是否与被调模块的形参个数相同;

    -调用其他模块时所给实际参数的属性是否与被调模块的形参属性匹配;

    -调用其他模块时所给实际参数的量纲是否与被调模块的形参量纲一致;

    -调用预定义函数时所用参数的个数、属性和次序是否正确;

    -是否存在与当前入口点无关的参数引用;

    -是否修改了只读型参数;

    -对全程变量的定义各模块是否一致;

    -是否把某些约束作为参数传递。

    如果模块功能包括外部输入输出,还应该考虑下列因素:

    -文件属性是否正确;

    -OPEN/CLOSE语句是否正确;

    -格式说明与输入输出语句是否匹配;

    -缓冲区大小与记录长度是否匹配;

    -文件使用前是否已经打开;

    -是否处理了文件尾;

    -是否处理了输入/输出错误;

    -输出信息中是否有文字性错误。

    -局部数据结构测试;

    -边界条件测试;

    -模块中所有独立执行通路测试;

    (2)局部数据结构测试:检查局部数据结构是为了保证临时存储在模块内的数据在程序执行过程中完整、正确,局部功能是整个功能运行的基础。重点是一些函数是否正确执行,内部是否运行正确。局部数据结构往往是错误的根源,应仔细设计测试用例,力求发现下面几类错误:

    -不合适或不相容的类型说明;

    -变量无初值;

    -变量初始化或省缺值有错;

    -不正确的变量名(拼错或不正确地截断);

    -出现上溢、下溢和地址异常。

    (3)边界条件测试:边界条件测试是单元测试中最重要的一项任务。众所周知,软件经常在边界上失效,采用边界值分析技术,针对边界值及其左、右设计测试用例,很有可能发现新的错误。边界条件测试是一项基础测试,也是后面系统测试中的功能测试的重点,边界测试执行的较好,可以大大提高程序健壮性。

    (4)模块中所有独立路径测试:在模块中应对每一条独立执行路径进行测试,单元测试的基本任务是保证模块中每条语句至少执行一次。测试目的主要是为了发现因错误计算、不正确的比较和不适当的控制流造成的错误。具体做法就是程序员逐条调试语句。常见的错误包括:

    -误解或用错了算符优先级;

    -混合类型运算;

    -变量初值错;

    -精度不够;

    -表达式符号错。

    比较判断与控制流常常紧密相关,测试时注意下列错误:

    -不同数据类型的对象之间进行比较;

    -错误地使用逻辑运算符或优先级;

    -因计算机表示的局限性,期望理论上相等而实际上不相等的两个量相等;

    -比较运算或变量出错;

    -循环终止条件或不可能出现;

    -迭代发散时不能退出;

    -错误地修改了循环变量。

    模块的各条错误处理通路测试:程序在遇到异常情况时不应该退出,好的程序应能预见各种出错条件,并预设各种出错处理通路。如果用户不按照正常操作,程序就退出或者停止工作,实际上也是一种缺陷,因此单元测试要测试各种错误处理路径。一般这种测试着重检查下列问题:

    -输出的出错信息难以理解;

    -记录的错误与实际遇到的错误不相符;

    -在程序自定义的出错处理段运行之前,系统已介入;

    -异常处理不当;

    -错误陈述中未能提供足够的定位出错信息。

    39、如何理解强度测试?

    参考答案:

    强度测试是为了确定系统在最差工作环境的工作能力,也可能是用于验证在标准工作压力下的各种资源的最下限指标。

    它和压力测试的目标是不同的,压力测试是在标准工作环境下,不断增加系统负荷,最终测试出该系统能力达到的最大负荷(稳定和峰值),而强度测试则是在非标准工作环境下,甚至不断人为降低系统工作环境所需要的资源,如网络带宽,系统内存,数据锁等等,以测试系统在资源不足的情况下的工作状态,通过强度测试,可以确定本系统正常工作的最差环境.

    强度测试和压力测试的测试指标相近,大多都是与时间相关的指标,如并发量(吞吐量),延迟(最大\最小\平均)以及顺序指标等

    强度测试需要对系统的结构熟悉,针对系统的特征设计强度测试的方法

    40、如何理解压力、负载、性能测试测试?

    参考答案:

    性能测试是一个较大的范围,实际上性能测试本身包含了性能、强度、压力、负载等多方面的测试内容。

    压力测试是对服务器的稳定性以及负载能力等方面的测试,是一种很平常的测试。增大访问系统的用户数量、或者几个用户进行大数据量操作都是压力测试。而负载测试是压力相对较大的测试,主要是测试系统在一种或者集中极限条件下的相应能力,是性能测试的重要部分。100个用户对系统进行连续半个小时的访问可以看作压力测试,那么连续访问8个小时就可以认为负载测试,1000个用户连续访问系统1个小时也可以看作是负载测试。

    实际上压力测试和负载测试没有明显的区分。测试人员应该站在关注整体性能的高度上来对系统进行测试。

    41、什么是系统瓶颈?

    参考答案:

    瓶颈主要是指整个软硬件构成的软件系统某一方面或者几个方面能力不能满足用户的特定业务要求,“特定”是指瓶颈会在某些条件下会出现,因为毕竟大多数系统在投入前。

    严格的从技术角度讲,所有的系统都会有瓶颈,因为大多数系统的资源配置不是协调的,例如CPU使用率刚好达到100%时,内存也正好耗尽的系统不是很多见。因此我们讨论系统瓶颈要从应用的角度讨论:关键是看系统能否满足用户需求。在用户极限使用系统的情况下,系统的响应仍然正常,我们可以认为改系统没有瓶颈或者瓶颈不会影响用户工作。

    因此我们测试系统瓶颈主要是实现下面两个目的:

    -发现“表面”的瓶颈。主要是模拟用户的操作,找出用户极限使用系统时的瓶颈,然后解决瓶颈,这是性能测试的基本目标。

    -发现潜在的瓶颈并解决,保证系统的长期稳定性。主要是考虑用户在将来扩展系统或者业务发生变化时,系统能够适应变化。满足用户目前需求的系统不是最好的,我们设计系统的目标是在保证系统整个软件生命周期能够不断适应用户的变化,或者通过简单扩展系统就可以适应新的变化。

    42、文档测试主要包含什么内容?

    参考答案:

    在国内软件开发管理中,文档管理几乎是最弱的一项,因而在测试工作中特别容易忽略文档测试也就不足为奇了。要想给用户提供完整的产品,文档测试是必不可少的。文档测试一般注重下面几个方面:

    文档的完整性:主要是测试文档内容的全面性与完整性,从总体上把握文档的质量。例如用户手册应该包括软件的所有功能模块。

    描述与软件实际情况的一致性:主要测试软件文档与软件实际的一致程度。例如用户手册基本完整后,我们还要注意用户手册与实际功能描述是否一致。因为文档往往跟不上软件版本的更新速度。

    易理解性:主要是检查文档对关键、重要的操作有无图文说明,文字、图表是否易于理解。对于关键、重要的操作仅仅只有文字说明肯定是不够的,应该附有图表使说明更为直观和明了。

    文档中提供操作的实例:这项检查内容主要针对用户手册。对主要功能和关键操作提供的应用实例是否丰富,提供的实例描述是否详细。只有简单的图文说明,而无实例的用户手册看起来就像是软件界面的简单拷贝,对于用户来说,实际上没有什么帮助。

    印刷与包装质量:主要是检查软件文档的商品化程度。有些用户手册是简单打印、装订而成,过于粗糙,不易于用户保存。优秀的文档例如用户手册和技术白皮书,应提供商品化包装,并且印刷精美。

    43、功能测试用例需要详细到什么程度才是合格的?

    参考答案:

    这个问题也是测试工程师经常问的问题。有人主张测试用例详细到每个步骤执行什么都要写出来,目的是即使一个不了解系统的新手都可以按照测试用例来执行工作。主张这类写法的人还可以举出例子:欧美、日本等软件外包文档都是这样做的。

    另外一种观点就是主张写的粗些,类似于编写测试大纲。主张这种观点的人是因为软件开发需求管理不规范,变动十分频繁,因而不能按照欧美的高标准来编写测试用例。这样的测试用例容易维护,可以让测试执行人员有更大的发挥空间。

    实际上,软件测试用例的详细程度首先要以覆盖到测试点为基本要求。举个例子:“用户登陆系统”的测试用例可以不写出具体的执行数据,但是至少要写出五种以上情况(),如果只用一句话覆盖了这个功能是不合格的测试用例。覆盖功能点不是指列出功能点,而是要写出功能点的各个方面(如果组合情况较多时可以采用等价划分)。

    另一个影响测试用例的就是组织的开发能力和测试对象特点。如果开发力量比较落后,编写较详细的测试用例是不现实的,因为根本没有那么大的资源投入,当然这种情况很随着团队的发展而逐渐有所改善。测试对象特点重点是指测试对象在进度、成本等方面的要求,如果进度较紧张的情况下,是根本没有时间写出高质量的测试用例的,甚至有些时候测试工作只是一种辅助工作,因而不编写测试用例。

    因此,测试用例的编写要根据测试对象特点、团队的执行能力等各个方面综合起来决定编写策略。最后要注意的是测试人员一定不能抱怨,力争在不断提高测试用例编写水平的同时,不断地提高自身能力。

    44、配置和兼容性测试的区别是什么?

    参考答案:

    配置测试的目的是保证软件在其相关的硬件上能够正常运行,而兼容性测试主要是测试软件能否与不同的软件正确协作。

    配置测试的核心内容就是使用各种硬件来测试软件的运行情况,一般包括:

    (1)软件在不同的主机上的运行情况,例如Dell和Apple;

    (2)软件在不同的组件上的运行情况,例如开发的拨号程序要测试在不同厂商生产的Modem上的运行情况;

    (3)不同的外设;

    (4)不同的接口;

    (5)不同的可选项,例如不同的内存大小;

    兼容性测试的核心内容:

    (1)测试软件是否能在不同的操作系统平台上兼容;

    (2)测试软件是否能在同一操作系统平台的不同版本上兼容;

    (3)软件本身能否向前或者向后兼容;

    (4)测试软件能否与其它相关的软件兼容;

    (5)数据兼容性测试,主要是指数据能否共享;

    配置和兼容性测试通称对开发系统类软件比较重要,例如驱动程序、操作系统、数据库管理系统等。具体进行时仍然按照测试用例来执行。

    45、软件文档测试主要包含什么?

    参考答案:

    随着软件文档系统日益庞大,文档测试已经成为软件测试的重要内容。文档测试对象主要如下:

    -包装文字和图形;

    -市场宣传材料、广告以及其它插页;

    -授权、注册登记表;

    -最终用户许可协议;

    -安装和设置向导;

    -用户手册;

    -联机帮助;

    -样例、示范例子和模板;

    -……

    文档测试的目的是提高易用性和可靠性,降低支持费用,因为用户通过文档就可以自己解决问题。因文档测试的检查内容主要如下:

    -读者对象——主要是文档的内容是否能让该级别的读者理解;

    -术语——主要是检查术语是否适合读者;

    -内容和主题——检查主题是否合适、是否丢失、格式是否规范等;

    -图标和屏幕抓图——检查图表的准确度和精确度;

    -样例和示例——是否与软件功能一致;

    -拼写和语法;

    -文档的关联性——是否与其它相关文档的内容一致,例如与广告信息是否一致;

    文档测试是相当重要的一项测试工作,不但要给予充分的重视,更要要认真的完成,象做功能测试一样来对待文档测试。

    46、没有产品说明书和需求文档地情况下能够进行黑盒测试吗?

    参考答案:

    这个问题是国内测试工程师经常遇到的问题,根源就是国内软件开发文档管理不规范,对变更的管理方法就更不合理了。实际上没有任何文档的时候,测试人员是能够进行黑盒测试的,这种测试方式我们可以称之为探索测试,具体做法就是测试工程师根据自己的专业技能、领域知识等不断的深入了解测试对象、理解软件功能,进而发现缺陷。

    在这种做法基本上把软件当成了产品说明书,测试过程中要和开发人员不断的进行交流。尤其在作项目的时候,进度压力比较大,可以作为加急测试方案。最大的风险是不知道有些特性是否被遗漏。

    47、测试中的“杀虫剂怪事”是指什么?

    参考答案:

    “杀虫剂怪事”一词由BorisBeizer在其编著的《软件测试技术》第二版中提出。用于描述测试人员对同一测试对象进行的测试次数越多,发现的缺陷就会越来越少的现象。就像老用一种农药,害虫就会有免疫力,农药发挥不了效力。这种现象的根本原因就是测试人员对测试软件过于熟悉,形成思维定势。

    为了克服这种现象,测试人员需要不断编写新的测试程序或者测试用例,对程序的不同部分进行测试,以发现更多的缺陷。也可以引用新人来测试软件,刚刚进来的新手往往能发现一些意想不到的问题。

    48、在配置测试中,如何判断发现的缺陷是普通问题还是特定的配置问题?

    参考答案:

    在进行配置测试时,测试工程师仍然会发现一些普通的缺陷,也就是与配置环境无关的缺陷。因此判断新发现的问题,需要在不同的配置中重新执行发现软件缺陷的步骤,如果软件缺陷不出现了,就可能是配置缺陷;如果在所有的配置中都出现,就可能是普通缺陷。

    需要注意的是,配置问题可以在一大类配置中出现。例如,拨号程序可能在所有的外置Modem中都存在问题,而内置的Modem不会有任何问题。

    49、为什么尽量不要让时间有富裕的员工去做一些测试?

    参考答案:

    表面上看这体现了管理的效率和灵活性,但实际上也体现了管理者对测试的轻视。测试和测试的人有很大关系。测试工作人员应该是勤奋并富有耐心,善于学习、思考和发现问题,细心有条理,总结问题,如果具备这样的优点,做其它工作同样也会很出色,因此这里还有一个要求,就是要喜欢测试这项工作。如果他是专职的,那么肯定更有经验和信心。国内的小伙子好象都喜欢做程序员,两者工作性质不同,待遇不同,地位不同,对自我实现的价值的认识也不同,这是行业的一个需要改善的问题。如果只是为了完成任务而完成任务,或者发现了几个问题就觉得满意了,这在任何其它工作中都是不行的。

    50、完全测试程序是可能的吗?

    参考答案:

    软件测试初学者可能认为拿到软件后需要进行完全测试,找到全部的软件缺陷,使软件“零缺陷”发布。实际上完全测试是不可能的。主要有以下一个原因:

    -完全测试比较耗时,时间上不允许;

    -完全测试通常意味着较多资源投入,这在现实中往往是行不通的;

    -输入量太大,不能一一进行测试;

    -输出结果太多,只能分类进行验证;

    -软件实现途径太多;

    -软件产品说明书没有客观标准,从不同的角度看,软件缺陷的标准不同;

    因此测试的程度要根据实际情况确定。

    51、软件测试的风险主要体现在哪里?

    参考答案:

    我们没有对软件进行完全测试,实际就是选择了风险,因为缺陷极有可能存在没有进行测试的部分。举个例子,程序员为了方便,在调试程序时会弹出一些提示信息框,而这些提示只在某种条件下会弹出,碰巧程序发布前这些代码中的一些没有被注释掉。在测试时测试工程师又没有对其进行测试。如果客户碰到它,这将是代价昂贵的缺陷,因为交付后才被客户发现。

    因此,我们要尽可能的选择最合适的测试量,把风险降低到最小。

    52、发现的缺陷越多,说明软件缺陷越多吗?

    参考答案:

    这是一个比较常见的现象。测试工程师在没有找到缺陷前会绞尽脑汁的思考,但是找到一个后,会接二连三的发现很多缺陷,颇有个人成就感。其中的原因主要如下:

    -代码复用、拷贝代码导致程序员容易犯相同的错误。类的继承导致所有的子类会包含基类的错误,反复拷贝同一代码意味可能也复制了缺陷。

    -程序员比较劳累是可以导致某些连续编写的功能缺陷较多。程序员加班是一种司空见惯的现象,因此体力不只时容易编写一些缺陷较多的程序。而这些连续潜伏缺陷恰恰时测试工程师大显身手的地方。

    “缺陷一个连着一个”不是一个客观规律,只是一个常见的现象。如果软件编写的比较好,这种现象就不常见了。测试人员只要严肃认真的测试程序就可以了。

    53、所有的软件缺陷都能修复吗?所有的软件缺陷都要修复吗?

    参考答案:

    从技术上讲,所有的软件缺陷都是能够修复的,但是没有必要修复所有的软件缺陷。测试人员要做的是能够正确判断什么时候不能追求软件的完美。对于整个项目团队,要做的是对每一个软件缺陷进行取舍,根据风险决定那些缺陷要修复。发生这种现象的主要原因如下:

    -没有足够的时间资源。在任何一个项目中,通常情况下开发人员和测试人员都是不够用的,而且在项目中没有预算足够的回归测试时间,再加上修改缺陷可能引入新的缺陷,因此在交付期限的强大压力下,必须放弃某些缺陷的修改。

    -有些缺陷只是特殊情况下出现,这种缺陷处于商业利益考虑,可以在以后升级中进行修复。

    -不是缺陷的缺陷。我们经常会碰到某些功能方面的问题被当成缺陷来处理,这类问题可以以后有时间时考虑再处理。

    最后要说的是,缺陷是否修改要由软件测试人员、项目经理、程序员共同讨论来决定是否修复,不同角色的人员从不同的角度来思考,以做出正确的决定。

    54、软件测试人员就是QA吗?

    参考答案:

    软件测试人员的职责是尽可能早的找出软件缺陷,确保得以修复。而质量保证人员(QA)主要职责是创建或者制定标准和方法,提高促进软件开发能力和减少软件缺陷。测试人员的主要工作是测试,质量保证人员日常工作重要内容是检查与评审,测试工作也是测试保证人员的工作对象。

    软件测试和质量是相辅相成的关系,都是为了提高软件质量而工作。

    55、如何减少测试人员跳槽带来的损失?

    参考答案:

    在IT行业里跳槽已经是一种司空见惯的现象,而且跳槽无论给公司还是给个人都会带来一定的损失。测试队伍也无疑会面临跳槽的威胁,作为测试经理管理者,只有从日常工作中开始做起,最能最大限度的减少损失。建议我们从以下两个方面做起:

    -加强部门内员工之间的互相学习,互相学习是建立学习型组织的基本要求,是知识互相转移的过程。在此基础上,可以把个人拥有的技术以知识的形式沉积下来,也就完成了隐性知识到显性知识的转化。

    -通常情况下,企业能为员工提供足够大的发展空间时,如果不是待遇特别低,员工都不会主动离开企业。因此我们要想留住员工,管理者就应该把员工的个人成长和企业的发展联系起来,为员工设定合理发展规划并付诸实现。不过这项要求做起来比较,要有比较好的企业文化为依托。

    56、测试产品与测试项目的区别是什么?

    参考答案:

    习惯上把开发完成后进行商业化、几乎不进行代码修改就可以售给用户使用的软件成为软件产品,也就是可以买“卖拷贝”的软件,例如Windows2000。而通常把针对一个或者几个特定的用户而开发的软件成为软件项目,软件项目是一种个性化的产品,可以是按照用户要求全部重新开发,也可以修改已有的软件产品来满足特定的用户需求。项目和产品的不同特点,决定我们测试产品和测试项目仍然会有很多不同的地方:

    -质量要求不同。通常产品的质量要高一些,修复发布后产品的缺陷成本较高,甚至会带来很多负面的影响。而做项目通常面向某一用户,虽然质量越高越好,但是一般只要满足用户要求就可以了。

    -测试资源投入多少不同。做软件产品通常是研发中心来开发,进度压力要小些。同时由于质量要求高,因此会投入较多的人力、物力资源。

    -项目最后要和用户共同验收测试,这是产品测试不具有的特点。

    此外,测试产品与测试项目在缺陷管理方面、测试策略制定都会有很大不同,测试管理者应该结合具体的环境,恰如其分的完成工作。

    57、和用户共同测试(UAT测试)的注意点有哪些?

    参考答案:

    软件产品在投产前,通常都会进行用户验收测试。如果用户验收测试没有通过,直接结果就是那不到“Money”,间接影响是损害了公司的形象,而后者的影响往往更严重。根据作者的经验,用户验收测试一定要让用户满意。

    实际上用户现场测试更趋于是一种演示。在不欺骗用户的前提下,我们向用户展示我们软件的优点,最后让“上帝”满意并欣然掏出“银子”才是我们的目标。因此用户测试要注意下面的事项:

    (1)用户现场测试不可能测试全部功能,因此要测试核心功能。这需要提前做好准备,这些核心功能一定要预先经过测试,证明没有问题才可以和用户共同进行测试。测试核心模块的目的是建立用户对软件的信心。当然如果这些模块如果问题较多,不应该进行演示。

    (2)如果某些模块确实有问题,我们可以演示其它重要的业务功能模块,必要时要向用户做成合理的解释。争得时间后,及时修改缺陷来弥补。

    (3)永远不能欺骗用户,蒙混过关。道理很简单,因为软件是要给用户用的,问题早晚会暴露出来,除非你可以马上修改。

    和用户进行测试还要注意各种交流技巧,争取不但短期利益得到了满足,还要为后面得合作打好基础。

    58、如何编写提交给用户的测试报告?

    参考答案:

    随着测试工作越来越受重视,开发团队向客户提供测试文档是不可避免的事情。很多人会问:“我们可以把工作中的测试报告提供给客户吗?”答案是否定的。因为提供内部测试报告,可能会让客户失去信心,甚至否定项目。

    测试报告一般分为内部测试报告和外部测试报告。内部报告是我们在测试工作中的项目文档,反映了测试工作的实施情况,这里不过多讨论,读者可以参考相关教材。这里主要讨论一下外部测试报告的写法,一般外部测试报告要满足下面几个要求:

    -根据内部测试报告进行编写,一般可以摘录;

    -不可以向客户报告严重缺陷,即使是已经修改的缺陷,开发中的缺陷也没有必要让客户知道;

    -报告上可以列出一些缺陷,但必须是中级的缺陷,而且这些缺陷必须是修复的;

    -报告上面的内容尽量要真实可靠;

    -整个测试报告要仔细审阅,力争不给项目带来负面作用,尤其是性能测试报告。

    总之,外部测试报告要小心谨慎的编写。

    59、测试工具在测试工作中是什么地位?

    参考答案:

    国内的很多测试工程师对测试工具相当迷恋,尤其是一些新手,甚至期望测试工具可以取代手工测试。测试工具在测试工作中起的是辅助作用,一般用来提高测试效率。自动化测试弥补了手工测试的不足,减轻一定的工作量。实际上测试工具是无法替代大多数手工测试的,而一些诸如性能测试等自动化测试也是手工所不能完成的。

    对于自动测试技术,应当依据软件的不同情况来分别对待,一般自动技术会应用在引起大量重复性工作的地方、系统的压力点、以及任何适合使用程序解决大批量输入数据的地方。然后再寻找合适的自动测试工具,或者自己开发测试程序。一定不要为了使用测试工具而使用。

    60、什么是软件测试,软件测试的目的?

    参考答案:

    61、简述负载测试与压力测试的区别。

    参考答案:

        压力测试(Stress Testing)

    压力测试的主要任务就是获取系统正确运行的极限,检查系统在瞬间峰值负荷下正确执行的能力。例如,对服务器做压力测试时就可以增加并发操作的用户数量;或者不停地向服务器发送请求;或一次性向服务器发送特别大的数据等。看看服务器保持正常运行所能达到的最大状态。人们通常使用测试工具来完成压力测试,如模拟上万个用户从终端同时登录,这是压力测试中常常使用的方法。

    负载测试(Volume Testing)

    用于检查系统在使用大量数据的时候正确工作的能力,即检验系统的能力最高能达到什么程度。例如,对于信息检索系统,让它使用频率达到最大;对于多个终端的分时系统,让它所有的终端都开动。在使整个系统的全部资源达到“满负荷”的情形下,测试系统的承受能力。

    62、写出bug报告流转的步骤,每步的责任人及主要完成的工作。

    参考答案:(要结合自己实际的工作经验进行回答,不同公司略有区别)

        测试人员提交新的Bug入库,错误状态为New。

    高级测试员/测试经理验证错误,如果确认是错误,分配给开发组。设置状态为Open。如果不是错误,则拒绝,设置为Declined状态。

    开发经理分配bug至对应的模块开发人员。

    开发人员查询状态为Open的Bug,如果不是错误,则置状态为Declined;如果是Bug则修复并置状态为Fixed。不能解决的Bug,要留下文字说明及保持Bug为Open状态。

    对于不能解决和延期解决的Bug,不能由开发人员自己决定,一般要通过某种会议(评审会)通过才能认可。

    测试人员查询状态为Fixed的Bug,然后验证Bug是否已解决,如解决,置Bug的状态为Closed,如没有解决,置bug状态为Reopen。

    63、写出bug报告当中一些必备的内容。

    参考答案:

           硬件平台和操作系统

           测试应用的硬件平台(Platform),通常选择“PC”。

           测试应用的操作系统平台(OS)。

    a)        版本

           提交缺陷报告时通过该字段标识此缺陷存在于被测试软件的哪个版本。

    b)        Bug报告优先级

    c)         Bug状态

    d)        Bug的编号

    e)         发现人

    f)         提交人

    g)        指定处理人

    h)        概述

    i)          从属关系

    j)         详细描述

    k)        严重程度

    l)          所属模块

    m)      附件

    n)        提交日期

    64、开发人员老是犯一些低级错误怎么解决?

    参考答案:

    这种现象在开发流程不规范的团队里特别常见,尤其是一些“作坊式”的团队里。解决这种问题一般从两个方面入手:

    一方面从开发管理入手,也就是从根源来解决问题。可以制定规范的开发流程,甚至可以制定惩罚制度,还有就是软件开发前做好规划设计。

    另一方面就是加强测试,具体做法就是加强开发人员的自己测试,把这些问题“消灭”在开发阶段,这是比较好的做法,读者可以参考第13章试案例分析的“13.1.2缺陷反复出现,谁的责任”小节,13.1.2专门讨论了这类问题的方法。

    此外,还可以通过规范的缺陷管理来对开发人员进行控制,比如测试部门整理出常见的缺陷,让开发人员自己对照进行检查,以减少这类低级错误的发生。

    开发人员犯错误是正常的现象,作为测试人员一定不能抱怨,要认认真真的解决问题才是上策。

    65、画出软件测试的V模型图。

      参考答案:

            

    66、为什么要在一个团队中开展软件测试工作?

    参考答案:

    因为没有经过测试的软件很难在发布之前知道该软件的质量,就好比ISO质量认证一样,测试同样也需要质量的保证,这个时候就需要在团队中开展软件测试的工作。在测试的过程发现软件中存在的问题,及时让开发人员得知并修改问题,在即将发布时,从测试报告中得出软件的质量情况。

    67、您在以往的测试工作中都曾经具体从事过哪些工作?其中最擅长哪部分工作?

    参考答案:(根据项目经验不同,灵活回答即可)

    我曾经做过web测试,后台测试,客户端软件,其中包括功能测试性能测试,用户体验测试。最擅长的是功能测试

    68、您所熟悉的软件测试类型都有哪些?请试着分别比较这些不同的测试类型的区别与联系(如功能测试、性能测试……)

    参考答案:

    测试类型有:功能测试,性能测试,界面测试。

      功能测试在测试工作中占的比例最大,功能测试也叫黑盒测试。是把测试对象看作一个黑盒子。利用黑盒测试法进行动态测试时,需要测试软件产品的功能,不需测试软件产品的内部结构和处理过程。采用黑盒技术设计测试用例的方法有:等价类划分、边界值分析、错误推测、因果图和综合策略。

      性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。负载测试和压力测试都属于性能测试,两者可以结合进行。通过负载测试,确定在各种工作负载下系统的性能,目标是测试当负载逐渐增加时,系统各项性能指标的变化情况。压力测试是通过确定一个系统的瓶颈或者不能接收的性能点,来获得系统能提供的最大服务级别的测试。

      界面测试,界面是软件与用户交互的最直接的层,界面的好坏决定用户对软件的第一印象。而且设计良好的界面能够引导用户自己完成相应的操作,起到向导的作用。同时界面如同人的面孔,具有吸引用户的直接优势。设计合理的界面能给用户带来轻松愉悦的感受和成功的感觉,相反由于界面设计的失败,让用户有挫败感,再实用强大的功能都可能在用户的畏惧与放弃中付诸东流。

      区别在于,功能测试关注产品的所有功能上,要考虑到每个细节功能,每个可能存在的功能问题。性能测试主要关注于产品整体的多用户并发下的稳定性和健壮性。界面测试更关注于用户体验上,用户使用该产品的时候是否易用,是否易懂,是否规范(快捷键之类的),是否美观(能否吸引用户的注意力),是否安全(尽量在前台避免用户无意输入无效的数据,当然考虑到体验性,不能太粗鲁的弹出警告)?做某个性能测试的时候,首先它可能是个功能点,首先要保证它的功能是没问题的,然后再考虑该功能点的性能测试

    69、您认为做好测试用例设计工作的关键是什么?

    参考答案:

           白盒测试用例设计的关键是以较少的用例覆盖尽可能多的内部程序逻辑结果

    黑盒法用例设计的关键同样也是以较少的用例覆盖模块输出和输入接口。不可能做到完全测试,以最少的用例在合理的时间内发现最多的问题

    70、请试着比较一下黑盒测试、白盒测试、单元测试、集成测试、系统测试、验收测试的区别与联系。

    参考答案:

           黑盒测试:已知产品的功能设计规格,可以进行测试证明每个实现了的功能是否符合要求。

      白盒测试:已知产品的内部工作过程,可以通过测试证明每种内部操作是否符合设计规格要求,所有内部成分是否以经过检查。

      软件的黑盒测试意味着测试要在软件的接口处进行。这种方法是把测试对象看做一个黑盒子,测试人员完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书,检查程序的功能是否符合它的功能说明。因此黑盒测试又叫功能测试或数据驱动测试。黑盒测试主要是为了发现以下几类错误:

      1、是否有不正确或遗漏的功能?

      2、在接口上,输入是否能正确的接受?能否输出正确的结果?

      3、是否有数据结构错误或外部信息(例如数据文件)访问错误?

      4、性能上是否能够满足要求?

      5、是否有初始化或终止性错误?

      软件的白盒测试是对软件的过程性细节做细致的检查。这种方法是把测试对象看做一个打开的盒子,它允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试。通过在不同点检查程序状态,确定实际状态是否与预期的状态一致。因此白盒测试又称为结构测试或逻辑驱动测试。白盒测试主要是想对程序模块进行如下检查:

      1、对程序模块的所有独立的执行路径至少测试一遍。

      2、对所有的逻辑判定,取“真”与取“假”的两种情况都能至少测一遍。

      3、在循环的边界和运行的界限内执行循环体。

      4、测试内部数据结构的有效性,等等。

      单元测试(模块测试)是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。

      单元测试是由程序员自己来完成,最终受益的也是程序员自己。可以这么说,程序员有责任编写功能代码,同时也就有责任为自己的代码编写单元测试。执行单元测试,就是为了证明这段代码的行为和我们期望的一致。

      集成测试(也叫组装测试,联合测试)是单元测试的逻辑扩展。它的最简单的形式是:两个已经测试过的单元组合成一个组件,并且测试它们之间的接口。从这一层意义上讲,组件是指多个单元的集成聚合。在现实方案中,许多单元组合成组件,而这些组件又聚合成程序的更大部分。方法是测试片段的组合,并最终扩展进程,将您的模块与其他组的模块一起测试。最后,将构成进程的所有模块一起测试。

      系统测试是将经过测试的子系统装配成一个完整系统来测试。它是检验系统是否确实能提供系统方案说明书中指定功能的有效方法。(常见的联调测试)

      系统测试的目的是对最终软件系统进行全面的测试,确保最终软件系统满足产品需求并且遵循系统设计。

      验收测试是部署软件之前的最后一个测试操作。验收测试的目的是确保软件准备就绪,并且可以让最终用户将其用于执行软件的既定功能和任务。

    验收测试是向未来的用户表明系统能够像预定要求那样工作。经集成测试后,已经按照设计把所有的模块组装成一个完整的软件系统,接口错误也已经基本排除了,接着就应该进一步验证软件的有效性,这就是验收测试的任务,即软件的功能和性能如同用户所合理期待的那样。

    71、测试计划工作的目的是什么?测试计划工作的内容都包括什么?其中哪些是最重要的?

    参考答案:

           软件测试计划是指导测试过程的纲领性文件,包含了产品概述、测试策略、测试方法、测试区域、测试配置、测试周期、测试资源、测试交流、风险分析等内容。借助软件测试计划,参与测试的项目成员,尤其是测试管理人员,可以明确测试任务和测试方法,保持测试实施过程的顺畅沟通,跟踪和控制测试进度,应对测试过程中的各种变更。

    测试计划和测试详细规格、测试用例之间是战略和战术的关系,测试计划主要从宏观上规划测试活动的范围、方法和资源配置,而测试详细规格、测试用例是完成测试任务的具体战术。所以其中最重要的是测试测试策略和测试方法(最好是能先评审)

    72、您所熟悉的测试用例设计方法都有哪些?请分别以具体的例子来说明这些方法在测试用例设计工作中的应用。

    参考答案:

           1.等价类划分

      划分等价类: 等价类是指某个输入域的子集合.在该子集合中,各个输入数据对于揭露程序中的错误都是等效的.并合理地假定:测试某等价类的代表值就等于对这一类其它值的测试.因此,可以把全部输入数据合理划分为若干等价类,在每一个等价类中取一个数据作为测试的输入条件,就可以用少量代表性的测试数据.取得较好的测试结果.等价类划分可有两种不同的情况:有效等价类和无效等价类.

      2.边界值分析法

      边界值分析方法是对等价类划分方法的补充。测试工作经验告诉我,大量的错误是发生在输入或输出范围的边界上,而不是发生在输入输出范围的内部.因此针对各种边界情况设计测试用例,可以查出更多的错误.

      使用边界值分析方法设计测试用例,首先应确定边界情况.通常输入和输出等价类的边界,就是应着重测试的边界情况.应当选取正好等于,刚刚大于或刚刚小于边界的值作为测试数据,而不是选取等价类中的典型值或任意值作为测试数据.

        3.错误推测法

      基于经验和直觉推测程序中所有可能存在的各种错误, 从而有针对性的设计测试用例的方法.

      错误推测方法的基本思想: 列举出程序中所有可能有的错误和容易发生错误的特殊情况,根据他们选择测试用例. 例如, 在单元测试时曾列出的许多在模块中常见的错误. 以前产品测试中曾经发现的错误等, 这些就是经验的总结. 还有, 输入数据和输出数据为0的情况. 输入表格为空格或输入表格只有一行. 这些都是容易发生错误的情况. 可选择这些情况下的例子作为测试用例.

        4.因果图方法

      前面介绍的等价类划分方法和边界值分析方法,都是着重考虑输入条件,但未考虑输入条件之间的联系, 相互组合等. 考虑输入条件之间的相互组合,可能会产生一些新的情况. 但要检查输入条件的组合不是一件容易的事情, 即使把所有输入条件划分成等价类,他们之间的组合情况也相当多. 因此必须考虑采用一种适合于描述对于多种条件的组合,相应产生多个动作的形式来考虑设计测试用例. 这就需要利用因果图(逻辑模型). 因果图方法最终生成的就是判定表. 它适合于检查程序输入条件的各种组合情况.

    73、请以您以往的实际工作为例,详细的描述一次测试用例设计的完整的过程。

    参考答案:

           就说最近的这次网站功能的测试吧

      首先:得到相关文档(需求文档和设计文档),理解需求和设计设计思想后,想好测试策略(测试计划简单点就OK了),考虑到测试环境,测试用例,测试时间等问题。

      第二步:设计测试用例,测试策略是:把网站部分的功能点测试完,然后在进行系统测试(另外个模块呢有另一个测试人员负责,可以进行联调测试),网站模块的测试基本是功能测试和界面测试(用户并发的可能性很小,所以不考虑):这次的网站的输入数据呢是使用数据库中的某张表记录,如果表中某一数据记录中新加进来的(还没有被处理的,有个标志位),网站启动后会立刻去刷那张表,得到多条数据,然后在进行处理。处理过程中,会经历3个步骤,网站才算完成了它的任务。有3个步骤呢,就可以分别对  这3个步骤进行测试用例的设计,尽量覆盖到各种输入情况(包括数据库中的数据,用户的输入等),得出了差不多50个用例。界面测试,也就是用户看的到的地方,包括发送的邮件和用户填写资料的页面展示。

      第三步:搭建测试环境(为什么这个时候考虑测试环境呢?因为我对网站环境已经很熟了,只有有机器能空于下来做该功能测试就可以做了),因为网站本身的环境搭建和其他的系统有点不同,它需要的测试环境比较麻烦,需要web服务器(Apache,tomcat),不过这次需求呢,网站部分只用到了tomcat,所以只要有tomcat即可

      第四步:执行测试

    74、您以往是否曾经从事过性能测试工作?如果有,请尽可能的详细描述您以往的性能测试工作的完整过程。

    参考答案:(以自己最熟悉的性能测试项目为例)

           是的,曾经做过网站方面的性能测试,虽然做的时间并不久(2个月吧),当时呢,是有位网站性能测试经验非常丰富的前辈带着我一起做。

    性能测试类型包括负载测试,强度测试,容量测试等

      负载测试:负载测试是一种性能测试指数据在超负荷环境中运行,程序是否能够承担。

      强度测试:强度测试是一种性能测试,他在系统资源特别低的情况下软件系统运行情况

      容量测试:确定系统可处理同时在线的最大用户数   

      在网站流量逐渐加大的情况下,开始考虑做性能测试了,首先要写好性能测试计划,根据运营数据得出流量最大的页面(如果是第一次的话,一般是首页,下载页,个人帐户页流量最大,而且以某种百分比),

      Web服务器指标指标:

      * Avg Rps: 平均每秒钟响应次数=总请求时间 / 秒数;

      * Successful Rounds:成功的请求;

      * Failed Rounds :失败的请求;

      * Successful Hits :成功的点击次数;

      * Failed Hits :失败的点击次数;

      * Hits Per Second :每秒点击次数;

      * Successful Hits Per Second :每秒成功的点击次数;

      * Failed Hits Per Second :每秒失败的点击次数;

      * Attempted Connections :尝试链接数; 

    75、你对测试最大的兴趣在哪里?为什么?

    参考答案:

           最大的兴趣就是测试有难度,有挑战性!做测试越久越能感觉到做好测试有多难。曾经在无忧测试网上看到一篇文章,是关于如何做好一名测试工程师。一共罗列了11,12点,有部分是和人的性格有关,有部分需要后天的努力。但除了性格有关的1,2点我没有把握,其他点我都很有信心做好它。

      刚开始进入测试行业时,对测试的认识是从无忧测试网上了解到的一些资料,当时是冲着做测试需要很多技能才能做的好,虽然入门容易,但做好很难,比开发更难,虽然当时我很想做开发(学校专业课我基本上不缺席,因为我喜欢我的专业),但看到测试比开发更难更有挑战性,想做好测试的意志就更坚定了。

      不到一年半的测试工作中,当时的感动和热情没有减退一点(即使环境问题以及自身经验,技术的不足,做测试的你一定也能理解)。

      我觉得做测试整个过程中有2点让我觉得很有难度(对我来说,有难度的东西我就非常感兴趣),第一是测试用例的设计,因为测试的精华就在测试用例的设计上了,要在版本出来之前,把用例写好,用什么测试方法写?(也就是测试计划或测试策略),如果你刚测试一个新任务时,你得花一定的时间去消化业务需求和技术基础,业务需求很好理解(多和产品经理和开发人员沟通就能达到目的),而技术基础可就没那么简单了,这需要你自觉的学习能力,比如说网站吧,最基本的技术知识你要知道网站内部是怎么运作的的,后台是怎么响应用户请求的?测试环境如何搭建?这些都需要最早的学好。至少在开始测试之前能做好基本的准备,可能会遇到什么难题?需求细节是不是没有确定好?这些问题都能在设计用例的时候发现。

      第二是发现BUG的时候了,这应该是测试人员最基本的任务了,一般按测试用例开始测试就能发现大部分的bug,还有一部分bug需要测试的过程中更了解所测版本的情况获得更多信息,补充测试用例,测试出bug。还有如何发现bug?这就需要在测试用例有效的情况下,通过细心和耐心去发现bug了,每个用例都有可能发现bug,每个地方都有可能出错,所以测试过程中思维要清晰(测试过程数据流及结果都得看仔细了,bug都在里面发现的)。如何描述bug也很有讲究,bug在什么情况下会产生,如果条件变化一点点,就不会有这个bug,以哪些最少的操作步骤就能重现这个bug,这个bug产生的规律是什么?如果你够厉害的话,可以帮开发人员初步定位问题。

    76、你以前工作时的测试流程是什么?

    参考答案:(灵活回答)

    公司对测试流程没有规定如何做,但每个测试人员都有自己的一套测试流程。我说下我1年来不断改正(自己总结,吸取同行的方法)后的流程吧。需求评审(有开发人员,产品经理,测试人员,项目经理)->需求确定(出一份确定的需求文档)->开发设计文档(开发人员在开始写代码前就能输出设计文档)->想好测试策略,写出测试用例->发给开发人员和测试经理看看(非正式的评审用例)->接到测试版本->执行测试用例(中间可能会补充用例)->提交bug(有些bug需要开发人员的确定(严重级别的,或突然发现的在测试用例范围之外的,难以重现的),有些可以直接录制进TD)->开发人员修改(可以在测试过程中快速的修改)->回归测试(可能又会发现新问题,再按流程开始跑)。

    77、当开发人员说不是BUG时,你如何应付?

    参考答案:

      开发人员说不是bug,有2种情况,一是需求没有确定,所以我可以这么做,这个时候可以找来产品经理进行确认,需不需要改动,3方商量确定好后再看要不要改。二是这种情况不可能发生,所以不需要修改,这个时候,我可以先尽可能的说出是BUG的依据是什么?如果被用户发现或出了问题,会有什么不良结果?程序员可能会给你很多理由,你可以对他的解释进行反驳。如果还是不行,那我可以给这个问题提出来,跟开发经理和测试经理进行确认,如果要修改就改,如果不要修改就不改。其实有些真的不是bug,我也只是建议的方式写进TD中,如果开发人员不修改也没有大问题。如果确定是bug的话,一定要坚持自己的立场,让问题得到最后的确认。

    78、软件的构造号与版本号之间的区别?BVT(BuildVerificationTest)

    参考答案:版本控制命名格式: 主版本号.子版本号[.修正版本号[.编译版本号 ]]

    Major.Minor [.Revision[.Build]]

          应根据下面的约定使用这些部分:

    Major :具有相同名称但不同主版本号的程序集不可互换。例如,这适用于对产品的大量重写,这些重写使得无法实现向后兼容性。

    Minor :如果两个程序集的名称和主版本号相同,而次版本号不同,这指示显著增强,但照顾到了向后兼容性。例如,这适用于产品的修正版或完全向后兼容的新版本。

    Build :内部版本号的不同表示对相同源所作的重新编译。这适合于更改处理器、平台或编译器的情况。

    Revision :名称、主版本号和次版本号都相同但修订号不同的程序集应是完全可互换的。这适用于修复以前发布的程序集中的安全漏洞。

    BVT(BuildVerificationTest):

    作为Build的一部分,主要是通过对基本功能、特别是关键功能的测试,保证新增代码没有导致功能失效,保证版本的持续稳定。实现BVT方式是有以下几种:1、测试人员手工验证关键功能实现的正确性。特点:这是传统开发方法中,通常采用的方式。无需维护测试脚本的成本,在测试人力资源充足,测试人员熟悉业务、并对系统操作熟练情况下效率很高,比较灵活快速。缺点:人力成本较高;对测试人员能力有一定要求;测试人员面对重复的工作,容易产生疲倦懈怠,从而影响测试质量。2、借助基于GUI的自动化功能测试工具来完成,将各基本功能操作录制成测试脚本,每次回放测试脚本验证功能实现的正确性。特点:能够模拟用户操作完成自动的测试,从UI入口到业务实现,每一层的代码实现都经过验证;节约人力成本;降低测试人员重复劳动的工作量,机器不会疲倦;缺点:对于UI变动比较频繁的系统来说,这种方式的维护成本很高,实施起来非常困难。另外,在项目周期较短且后续无延续性或继承的情况下,也不推荐使用此方式。3、由开发人员通过自动化测试工具完成业务层的BVT测试。特点:通过对业务层关键功能的持续集成测试,保证系统功能的持续稳定。可以结合DailyBuild,做为Build的一部分,自动实现并输入BVT报告。缺点:仅对业务规则实现的正确性进行了测试,对表现层无法测试到,对于诸如:前台页面控件各种事件响应、页面元素变化等方面的问题无法保证。

    79、您以往的工作中,一条软件缺陷(或者叫Bug)记录都包含了哪些内容?如何提交高质量的软件缺陷(Bug)记录?

    参考答案:

    80、您以往所从事的软件测试工作中,是否使用了一些工具来进行软件缺陷(Bug)的管理?如果有,请结合该工具描述软件缺陷(Bug)跟踪管理的流程。

    参考答案:

    81、您认为性能测试工作的目的是什么?做好性能测试工作的关键是什么?

    参考答案:

    82、单元测试、集成测试、系统测试的侧重点是什么?

           参考答案:

    83、集成测试通常都有那些策略?

    参考答案:

    84、一个缺陷测试报告的组成

    参考答案:

    85、基于WEB信息管理系统测试时应考虑的因素有哪些?

    参考答案:

    86、软件测试项目从什么时候开始,?为什么?

    参考答案:

    87、需求测试注意事项有哪些?

    参考答案:

    88、简述一下缺陷的生命周期

    参考答案:

    89、你在你所在的公司是怎么开展测试工作的?是如何组织的?

    参考答案:

    90、你认为理想的测试流程是什么样子?

    参考答案:

    91、您在从事性能测试工作时,是否使用过一些测试工具?如果有,请试述该工具的工作原理,并以一个具体的工作中的例子描述该工具是如何在实际工作中应用的。

    参考答案:        

    92、软件测试活动的生命周期是什么?

    参考答案:

    93、请画出软件测试活动的流程图?

    参考答案:

    94、针对缺陷采取怎样管理措施?

    参考答案:

    95、什么是测试评估?测试评估的范围是什么?

    参考答案:

    96、如果能够执行完美的黑盒测试,还需要进行白盒测试吗?为什么?

    参考答案:

    97、测试结束的标准是什么?

    参考答案:

    98、软件验收测试除了alpha ,beta测试以外,还有哪一种?

    参考答案:

    99、做测试多久了?以前做过哪些项目?你们以前测试的流程是怎样的?用过哪些测试工具?

    参考答案:

    100、请就如何在开发中进行软件质量控制说说你的看法

    参考答案:

    101、一套完整的测试应该由哪些阶段组成?分别阐述一下各个阶段。

    102、软件测试的类型有那些?分别比较这些不同的测试类型的区别与联系。

    103、测试用例通常包括那些内容?着重阐述编制测试用例的具体做法

    104、在分别测试winform的C/S结构与测试WEB结构的软件是,应该采取什么样的方法分别测试?他们存在什么样的区别与联系?

    105、在测试winform的C/S结构软件时,发现这个软件的运行速度很慢,您会认为是什么原因?您会采取哪些方法去检查这个原因?

    106、描述使用bugzilla缺陷管理工具对软件缺陷(BUG)跟踪的管理的流程

    107、你都用什么测试方法

    针对不同的产品或者系统或者模块,有不同的测试方法。总体而言有白盒测试和黑盒测试。

    108、怎么编写案例

    案例的编写与测试阶段的定义有很大的关系。系统测试和unit测试的案例可能不同。总体而言测试案例根据系统的需求而定。

    109、怎么才能够全面的测试到每一个点

    测试的全面性主要需要在设计测试计划的时候考虑,从测试策略,产品需求等等多个角度考虑从而定义全部的测试点。

    110、谈谈软件测试技术,以及如何提高

    111、谈谈软件测试职业发展,以及个人的打算

    112、谈谈软件测试在企业的地位,也可以结合软件生命周期来谈

    113、一般公司里实际的软件测试流程是什么样的?你们公司又是怎样的?

    114、软件工程师要具有那些素质?

    115、你会哪些测试工具?怎么操作?

    116、你能不能说下你的3到5年的职业计划(规划)

    117、你觉得你来应聘有那些优势?

    其他问题:(有可能清晰的思路比确切的答案更重要)

    对测试的理解——考查点:基本的测试知识,对测试是否认可

    谈一谈过去自己的工作——考查点:了解经历、提供进一步提问的素材,表达能力、测试技能

    测试设计的方法并举例说明——考查点:测试技术的使用

    测试工具——考查点:熟悉程度,能否与当前工作匹配?

    如何做计划?如何跟踪计划?——考查点:日常工作能力

    如果开发人员提供的版本不满足测试的条件,如何做?——考查点:与开发人员协作的能力

    熟悉unix系统、oracle数据库吗?——考查点:是否具备系统知识

    做过开发吗?写过哪些代码?——考查点:开发技能

    阅读英语文章,给出理解说明?——考查点:部分英语能力

    文档的意义——考查点:是否善于思考?(最简单的概念,不同层次的理解)

    假如进入我们公司,对我们哪些方面会有帮助?——考查点:讲讲自己的特长

    随便找一件物品,让其测试——考查点:测试的实际操作能力

    有一个新的软件,假如你是测试工程师,该如何做——考查点:实际项目经验、是否有带领测试团队的经验和潜力

    开发及环境搭建类面试题

    1、描述软件产生内存泄露的原因以及检查方式。(可以结合一种开发语言进行描述)

    参考答案:

    内存泄露的原因,主要是由于开发过程当中申请了计算机资源(例如对象、内存等),但是使用资源完成以后没有及时释放资源导致的。例如在C语言当中使用了malloc申请了内存,但是未使用free来释放内存。

    2、简述什么是值传递,什么是地址传递,两者区别是什么?

    参考答案:

    值传递主调函数传递给被调函数的是值的拷贝,不是原值;地址传递主调函数传递给被调函数的是值的地址。区别是值传递被调函数中的操作不改变主调函数的值,而地址传递则不同。

    3、结构化程序设计和面向对象程序设计各自的特点及优缺点是什么?

    参考答案:(不需要回答如此复杂)

    结构化程序设计思想采用了模块分解与功能抽象和自顶向下、分而治之的方法,从而有效地将一个较复杂的程序系统设计任务分解成许多易于控制和处理的子程序,便于开发和维护。它的重点在于把功能进行分解。但是由于在实际开发过程当中需求会经常发生变化,因此,它不能很好的适应需求变化的开发过程。结构化程序设计是面向过程的。

    面向对象程序设计以需求当中的数据作为中心,来进行设计,具有良好的代码重用性。

    封装性:也叫数据隐藏,用户无需知道内部工作流程,只要知道接口和操作就可以的,C++中一般用类来实现封装。

    继承性:一种支持重用的思想,在现有的类型派生出新的子类,例如新型电视机在原有型号的电视机上增加若干中功能而得到,新型电视机是原有电视机的派生,继承了原有电视机的属性,并增加了新的功能。

    多态性:指在一般类中定义的属性或行为,被特殊类继承之后,可以具有不同的数据类型或表现出不同的行为。

    动态联编:指一个计算机程序自身彼此关联的过程,按照联编所进行的阶段不同,可分为两种不同的联编方法:静态联编和动态联编。

    4、简述什么是存储过程和触发器?

    参考答案:

    存储过程:是数据库中的一个对象,Transact-SQL 语句的预编译集合,这些语句在一个名称下存储并作为一个单元进行处理。(可以理解为C语言中的函数,有参数、返回值等函数特性)

    触发器是一种特殊类型的存储过程,当使用下面的一种或多种数据修改操作在指定表中对数据进行修改时,触发器会生效:UPDATE、INSERT 或 DELETE。

    5、使用C语言编写一个函数,用于交换两个变量的值(地址传递)。

           参考答案:

           void Swap(int *a,int *b)

    {

                  int temp;

                  int temp=*a;

                  int *a=*b;

                  int *b=temp;

    }

    6、请简述DNS、活动目录、域的概念。

    参考答案:

    DNS:域名服务,作用是将网络域名解析成IP地址;

    活动目录:微软提供的目录服务的一种,它存储有关网络上的对象信息,并使管理员和用户更方便的查找和使用这类信息;

    域:网络系统的一个安全边界,在一个域当中,计算机和用户共享一些列的安全信息。

    7、描述TCP/IP协议的层次结构,以及每一层中重要协议。

    参考答案:(可以回答五层结构)

    TCP/IP

    协议

    应用层/Application

    HTTP、SMTP、FTP

    传输层/Transport

    TCP、UDP

    网络层/Network

    IP

    链路层/Link

    ARP、RARP

          

     

     

     

     

     

    8、简述子网掩码的用途。

    参考答案:

        子网掩码主要用来判断两个IP地址是否处在同一个局域网当中;子网掩码是由连续的2进制1组成的。子网掩码和IP地址进行按位与运算后,结果一致,表示处于一个局域网当中,如果不一致,表示不再一个局域网当中,需要寻找路由。

    9、说出4种以上常用的操作系统及其主要的应用范围(微软的操作系统除外)。

    参考答案:

    Linux(Red Hat、SUSE、Debian、Trubo Linux):主要用于搭建各类服务器

    MAC OS:苹果机的操作系统,用于图像处理

    Unix(AIX:IBM服务器的专用操作系统;

    Solaris:Sun操作系统;FreeBSD、NetBSD)

    10、在Linux系统中,一个文件的访问权限是755,其含义是什么?

    参考答案:

           755表示该文件所有者对该文件具有读、写、执行权限,该文件所有者所在组用户及其他用户对该文件具有读和执行权限。

    11、Windows操作系统中PATH环境变量的作用是什么?

    参考答案:

           PATH是Windows操作系统环境变量,PATH作用是用户在命令行窗口执行一个命令,则在PATH变量设置的目录下依次寻找该命令或对应的执行文件,若找到,则执行,若没有找到,则命令行窗口返回无效命令。

    12、Ghost的主要用途和常用方法?

    参考答案:

    Ghost是一个非常著名的硬盘克隆工具。该工具的主要作用是可以将一个硬盘或硬盘中的某个分区原封不动的复制到另一个硬盘或其他的分区中。如果你需要备份启动分区或者是需要在多台机器上安装相应的系统和应用程序,都可以通过Ghost来实现,相信通过这个工具备份,恢复速度和硬盘安装速度会成倍的提高。

    Norton Ghost有一个很大的特点,就是在克隆硬盘时不会改变任何文件信息,程序可以很好的支持FAT16、FAT32以及NTFS格式的文件分配结构(其中包括Windows 2000的文件分配格式),虽然是DOS环境下运行的程序,但工具可支持Win 9x的长文件名特性。

    常用方法包括:硬盘克隆、分区克隆、硬盘或分区克隆成镜像文件等。

    13、在RedHat中,从root用户切到userl用户,一般用什么命令?

    参考答案:su

    su user1  切换到user1,但切换后的当前目录还是root访问的目录

    su – user1 切换到user1,并且当前目录切换到user1的根目录下(/home/user1/)

    14、Linux中,一般怎么隐藏文件?

    参考答案:文件名以一个.开头

    15、如何将自己的本地磁盘(D)做成FTP供远端主机使用?

    参考答案:Windows下安装FTP服务,并将FTP的根目录指向D盘即可。

    16、对RUP.CMM,CMMI,XP,PSP.TSP的认识?

    参考答案:软件过程标准:CMMI、PSP、TSP、RUP、软件工程规范国家标准;(AP、XP、ASD等开发过程思想好像还不能称其为标准)

    RUP(Rational Unified Process)是Rational公司提出的一套开发过程模型,它是一个面向对象软件工程的通用业务流程。它描述了一系列相关的软件工程流程,它们具有相同的结构,即相同的流程构架。RUP 为在开发组织中分配任务和职责提供了一种规范方法,其目标是确保在可预计的时间安排和预算内开发出满足最终用户需求的高品质的软件。RUP具有两个轴,一个轴是时间轴,这是动态的。另一个轴是工作流轴,这是静态的。在时间轴上,RUP划分了四个阶段:初始阶段、细化阶段、构造阶段和发布阶段。每个阶段都使用了迭代的概念。在工作流轴上,RUP设计了六个核心工作流程和三个核心支撑工作流程,核心工作流轴包括:业务建模工作流、需求工作流、分析设计工作流、实现工作流、测试工作流和发布工作流。核心支撑工作流包括:环境工作流、项目管理工作流和配置与变更管理工作流。RUP 汇集现代软件开发中多方面的最佳经验,并为适应各种项目及组织的需要提供了灵活的形式。作为一个商业模型,它具有非常详细的过程指导和模板。但是同样由于该模型比较复杂,因此在模型的掌握上需要花费比较大的成本。尤其对项目管理者提出了比较高的要求。

    CMM(Capability Maturity Model能力成熟度模型) 由美国卡内基-梅隆大学的软件工程研究所(简称SEI)受美国国防部委托,于1991年研究制定,初始的主要目的是为了评价美国国防部的软件合同承包组织的能力,后因为在软件企业应用CMM模型实施过程改进取得较大的成功,所以在全世界范围内被广泛使用,SEI同时建立了主任评估师评估制度,CMM的评估方法为CBA-IPI。CMM的本质是软件管理工程的一个部分。它是对于软件组织在定义,实现,度量,控制和改善其软件过程的进程中各个发展阶段的描述。他通过5个不断进化的层次来评定软件生产的历史与现状:初始层是混沌的过程;可重复层是经过训练的软件过程;定义层是标准一致的软件过程;管理层是可预测的软件过程;优化层是能持续改善的软件过程。

    CMM/PSP/TSP即软件能力成熟度模型/ 个体软件过程/群组软件过程,是1987年美国 Carnegie Mellon 大学软件工程研究所(CMU/SEI)以W.S.Humphrey为首的研究组发表的研究成果"承制方软件工程能力的评估方法"。

    CMMI是SEI于2000年发布的CMM的新版本。CMMI不但包括了软件开发过程改进,还包含系统集成、软硬件采购等方面的过程改进内容。

    CMMI纠正了CMM存在的一些缺点,使其更加适用企业的过程改进实施。CMMI适用SCAMPI评估方法。需要注意的是,SEI没有废除CMM模型,只是停止了CMM评估方法:CBA-IPI。现在如要进行CMM评估,需使用SCAMPI方法。但CMMI模型最终代替CMM模型的趋势不可避免。

    XP (极限编程)规定了一组核心价值和方法,可以让软件开发人员发挥他们的专长:编写代码。XP 消除了大多数重量型过程的不必要产物,通过减慢开发速度、耗费开发人员的精力(例如干特图、状态报告,以及多卷需求文档)从目标偏离。

    XP 的核心价值:交流、简单、反馈、勇气。

    17、DNS是什么,它是如何工作的?

    参考答案:域名解析服务。用于将域名解析为IP,或反和将IP解析为域名。

    客户机可指定DNS服务器来解析,或用本机hosts文件进行解析。

    Windows下配置DNS服务器在《搭建Windows测试环境》中有。

    18、防火墙如何保证安全的?主要有哪些?

    参考答案:防火墙分类1

    从防火墙的软、硬件形式来分的话,防火墙可以分为软件防火墙和硬件防火墙以及芯片级防火墙。

    第一种:软件防火墙

    软件防火墙运行于特定的计算机上,它需要客户预先安装好的计算机操作系统的支持,一般来说这台计算机就是整个网络的网关。俗称“个人防火墙”。软件防火墙就像其它的软件产品一样需要先在计算机上安装并做好配置才可以使用。防火墙厂商中做网络版软件防火墙最出名的莫过于Checkpoint。使用这类防火墙,需要网管对所工作的操作系统平台比较熟悉。

    第二种:硬件防火墙

    这里说的硬件防火墙是指“所谓的硬件防火墙”。之所以加上"所谓"二字是针对芯片级防火墙说的了。它们最大的差别在于是否基于专用的硬件平台。目前市场上大多数防火墙都是这种所谓的硬件防火墙,他们都基于PC架构,就是说,它们和普通的家庭用的PC没有太大区别。在这些PC架构计算机上运行一些经过裁剪和简化的操作系统,最常用的有老版本的Unix、Linux和FreeBSD系统。值得注意的是,由于此类防火墙采用的依然是别人的内核,因此依然会受到OS(操作系统)本身的安全性影响。

    传统硬件防火墙一般至少应具备三个端口,分别接内网,外网和DMZ区(非军事化区),现在一些新的硬件防火墙往往扩展了端口,常见四端口防火墙一般将第四个端口做为配置口、管理端口。很多防火墙还可以进一步扩展端口数目。

    第三种:芯片级防火墙

    芯片级防火墙基于专门的硬件平台,没有操作系统。专有的ASIC芯片促使它们比其他种类的防火墙速度更快,处理能力更强,性能更高。做这类防火墙最出名的厂商有NetScreen、FortiNet、Cisco等。这类防火墙由于是专用OS(操作系统),因此防火墙本身的漏洞比较少,不过价格相对比较高昂。

    防火墙技术虽然出现了许多,但总体来讲可分为“包过滤型”和“应用代理型”两大类。前者以以色列的Checkpoint防火墙和美国Cisco公司的PIX防火墙为代表,后者以美国NAI公司的Gauntlet防火墙为代表。

    (1). 包过滤(Packet filtering)型

    包过滤型防火墙工作在OSI网络参考模型的网络层和传输层,它根据数据包头源地址,目的地址、端口号和协议类型等标志确定是否允许通过。只有满足过滤条件的数据包才被转发到相应的目的地,其余数据包则被从数据流中丢弃。

    包过滤方式是一种通用、廉价和有效的安全手段。之所以通用,是因为它不是针对各个具体的网络服务采取特殊的处理方式,适用于所有网络服务;之所以廉价,是因为大多数路由器都提供数据包过滤功能,所以这类防火墙多数是由路由器集成的;之所以有效,是因为它能很大程度上满足了绝大多数企业安全要求。

    在整个防火墙技术的发展过程中,包过滤技术出现了两种不同版本,称为“第一代静态包过滤”和“第二代动态包过滤”。

    ●第一代静态包过滤类型防火墙

    这类防火墙几乎是与路由器同时产生的,它是根据定义好的过滤规则审查每个数据包,以便确定其是否与某一条包过滤规则匹配。过滤规则基于数据包的报头信息进行制订。报头信息中包括IP源地址、IP目标地址、传输协议(TCP、UDP、ICMP等等)、TCP/UDP目标端口、ICMP消息类型等。

    ●第二代动态包过滤类型防火墙

    这类防火墙采用动态设置包过滤规则的方法,避免了静态包过滤所具有的问题。这种技术后来发展成为包状态监测(Stateful Inspection)技术。采用这种技术的防火墙对通过其建立的每一个连接都进行跟踪,并且根据需要可动态地在过滤规则中增加或更新条目。

    包过滤方式的优点是不用改动客户机和主机上的应用程序,因为它工作在网络层和传输层,与应用层无关。但其弱点也是明显的:过滤判别的依据只是网络层和传输层的有限信息,因而各种安全要求不可能充分满足;在许多过滤器中,过滤规则的数目是有限制的,且随着规则数目的增加,性能会受到很大地影响;由于缺少上下文关联信息,不能有效地过滤如UDP、RPC(远程过程调用)一类的协议;另外,大多数过滤器中缺少审计和报警机制,它只能依据包头信息,而不能对用户身份进行验证,很容易受到“地址欺骗型”攻击。对安全管理人员素质要求高,建立安全规则时,必须对协议本身及其在不同应用程序中的作用有较深入的理解。因此,过滤器通常是和应用网关配合使用,共同组成防火墙系统。

     (2). 应用代理(Application Proxy)型

    应用代理型防火墙是工作在OSI的最高层,即应用层。其特点是完全"阻隔"了网络通信流,通过对每种应用服务编制专门的代理程序,实现监视和控制应用层通信流的作用。其典型网络结构如图所示。

    在代理型防火墙技术的发展过程中,它也经历了两个不同的版本,即:第一代应用网关型代理防火和第二代自适应代理防火墙。

    第一代应用网关(Application Gateway)型防火墙

    这类防火墙是通过一种代理(Proxy)技术参与到一个TCP连接的全过程。从内部发出的数据包经过这样的防火墙处理后,就好像是源于防火墙外部网卡一样,从而可以达到隐藏内部网结构的作用。这种类型的防火墙被网络安全专家和媒体公认为是最安全的防火墙。它的核心技术就是代理服务器技术。

    第二代自适应代理(Adaptive proxy)型防火墙

    它是近几年才得到广泛应用的一种新防火墙类型。它可以结合代理类型防火墙的安全性和包过滤防火墙的高速度等优点,在毫不损失安全性的基础之上将代理型防火墙的性能提高10倍以上。组成这种类型防火墙的基本要素有两个:自适应代理服务器(Adaptive Proxy Server)与动态包过滤器(Dynamic Packet filter)。

    在“自适应代理服务器”与“动态包过滤器”之间存在一个控制通道。在对防火墙进行配置时,用户仅仅将所需要的服务类型、安全级别等信息通过相应Proxy的管理界面进行设置就可以了。然后,自适应代理就可以根据用户的配置信息,决定是使用代理服务从应用层代理请求还是从网络层转发包。如果是后者,它将动态地通知包过滤器增减过滤规则,满足用户对速度和安全性的双重要求。

    代理类型防火墙的最突出的优点就是安全。由于它工作于最高层,所以它可以对网络中任何一层数据通信进行筛选保护,而不是像包过滤那样,只是对网络层的数据进行过滤。

    另外代理型防火墙采取是一种代理机制,它可以为每一种应用服务建立一个专门的代理,所以内外部网络之间的通信不是直接的,而都需先经过代理服务器审核,通过后再由代理服务器代为连接,根本没有给内、外部网络计算机任何直接会话的机会,从而避免了入侵者使用数据驱动类型的攻击方式入侵内部网。

    代理防火墙的最大缺点就是速度相对比较慢,当用户对内外部网络网关的吞吐量要求比较高时,代理防火墙就会成为内外部网络之间的瓶颈。那因为防火墙需要为不同的网络服务建立专门的代理服务,在自己的代理程序为内、外部网络用户建立连接时需要时间,所以给系统性能带来了一些负面影响,但通常不会很明显。

    防火墙分类3

    从防火墙结构上分,防火墙主要有:单一主机防火墙、路由器集成式防火墙和分布式防火墙三种。

    单一主机防火墙是最为传统的防火墙,独立于其它网络设备,它位于网络边界。

    这种防火墙其实与一台计算机结构差不多(如下图),同样包括CPU、内存、硬盘等基本组件,当然主板更是不能少了,且主板上也有南、北桥芯片。它与一般计算机最主要的区别就是一般防火墙都集成了两个以上的以太网卡,因为它需要连接一个以上的内、外部网络。其中的硬盘就是用来存储防火墙所用的基本程序,如包过滤程序和代理服务器程序等,有的防火墙还把日志记录也记录在此硬盘上。虽然如此,但我们不能说它就与我们平常的PC机一样,因为它的工作性质,决定了它要具备非常高的稳定性、实用性,具备非常高的系统吞吐性能。正因如此,看似与PC机差不多的配置,价格甚远。

    随着防火墙技术的发展及应用需求的提高,原来作为单一主机的防火墙现在已发生了许多变化。最明显的变化就是现在许多中、高档的路由器中已集成了防火墙功能,还有的防火墙已不再是一个独立的硬件实体,而是由多个软、硬件组成的系统,这种防火墙,俗称“分布式防火墙”。

    原来单一主机的防火墙由于价格非常昂贵,仅有少数大型企业才能承受得起,为了降低企业网络投资,现在许多中、高档路由器中集成了防火墙功能。如Cisco IOS防火墙系列。但这种防火墙通常是较低级的包过滤型。这样企业就不用再同时购买路由器和防火墙,大大降低了网络设备购买成本。

    分布式防火墙再也不是只是位于网络边界,而是渗透于网络的每一台主机,对整个内部网络的主机实施保护。在网络服务器中,通常会安装一个用于防火墙系统管理软件,在服务器及各主机上安装有集成网卡功能的PCI防火墙卡,这样一块防火墙卡同时兼有网卡和防火墙的双重功能。这样一个防火墙系统就可以彻底保护内部网络。各主机把任何其它主机发送的通信连接都视为“不可信”的,都需要严格过滤。而不是传统边界防火墙那样,仅对外部网络发出的通信请求“不信任”。

    防火墙分类4

    如果按防火墙的应用部署位置分,可以分为边界防火墙、个人防火墙和混合防火墙三大类。

    边界防火墙是最为传统的那种,它们于内、外部网络的边界,所起的作用的对内、外部网络实施隔离,保护边界内部网络。这类防火墙一般都是硬件类型的,价格较贵,性能较好。

    个人防火墙安装于单台主机中,防护的也只是单台主机。这类防火墙应用于广大的个人用户,通常为软件防火墙,价格最便宜,性能也最差。

    混合式防火墙可以说就是“分布式防火墙”或者“嵌入式防火墙”,它是一整套防火墙系统,由若干个软、硬件组件组成,分布于内、外部网络边界和内部各主机之间,既对内、外部网络之间通信进行过滤,又对网络内部各主机间的通信进行过滤。它属于最新的防火墙技术之一,性能最好,价格也最贵。

    防火墙分类5

    如果按防火墙的性能来分可以分为百兆级防火墙和千兆级防火墙两类。

    因为防火墙通常位于网络边界,所以不可能只是十兆级的。这主要是指防火的通道带宽(Bandwidth),或者说是吞吐率。当然通道带宽越宽,性能越高,这样的防火墙因包过滤或应用代理所产生的延时也越小,对整个网络通信性能的影响也就越小。

    19、目前流行的操作的系统有哪些?请举例说明安装操作系统的注意事项?

    参考答案:MS Windows系列:win 98、windows 2000系列、win XP、win 2003 Server、win Vista等等。

    UNIX类:SVRx、FreeBSD、OpenBSD、NetBSD、Solaris、各种Linux等等。Mac OS……

    多重引导时,一般先安装win操作系统,从低版本到高,再安装Linux

    20、简述一下c/s模式或者b/s模式?

    参考答案:C/S模式:客户端/服务器模式。工作原理:Client向Server提交一个请求;Server则使用一些方法处理这个请求,并将效果返回给Client。

    B/S结构,即Browser/Server(浏览器/服务器)结构,是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户界面完全通过WWW浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现,形成所谓3-tier结构。B/S结构,主要是利用了不断成熟的WWW浏览器技术,结合浏览器的多种Script语言(VBScript、JavaScript…)和ActiveX技术,用通用浏览器就实现了原来需要复杂专用软件才能实现的强大功能,并节约了开发成本,是一种全新的软件系统构造技术。

    21、TCP/UDP有哪些区别?

    参考答案:TCP-有连接,所以握手过程会消耗资源,过程为可靠连接,不会丢失数据,适合大数据量交换
    UDP-非可靠连接,会丢包,没有校验,速度快,无须握手过程

     
    TCP
    UDP
    是否连接
    面向连接
    面向非连接
    传输可靠性
    可靠的
    不可靠的
    应用场合
    传输大量数据
    少量数据
    速度

    22、ISO模型?HUB、tch、Router是ISO的第几层设备?

    参考答案:从底向上:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层

    HUB:1层(物理层);Switch:2层(数据链路层);Router:3层(网络层)

    23、内存有哪几种存储组织结构.请分别加以说明?

    参考答案:

    人力资源面试题

    1、你的测试职业发展是什么?你自认为做测试的优势在哪里?

    参考答案:

           测试经验越多,测试能力越高。所以我的职业发展是需要时间累积的,一步步向着高级测试工程师奔去。而且我也有初步的职业规划,前3年累积测试经验,按如何做好测试工程师的要求自己,不断的更新自己改正自己,做好测试任务。

      优势在于我对测试坚定不移的信心和热情,虽然经验还不够,但测试需要的基本技能我有信心在工作中得以发挥。

    2、你为什么想离开目前的职务?

    参考答案:

    3、你对我们公司了解有多少?

    参考答案:

    4、你找工作时,最重要的考虑因素为何?

    参考答案:工作的性质和内容是否能让我发挥所长,并不断成长。

    5、为什么我们应该录取你?

    参考答案:您可以由我过去的工作表现所呈现的客观数据,明显地看出我全力以赴的工作态度。

    6、请谈谈你个人的最大特色。

    参考答案:我的坚持度很高,事情没有做到一个令人满意的结果,绝不罢手。

    7、一个测试工程师应具备那些素质和技能?

    参考答案:

    8、您认为在测试人员同开发人员的沟通过程中,如何提高沟通的效率和改善沟通的效果?维持测试人员同开发团队中其他成员良好的人际关系的关键是什么?

    参考答案:

    9、在您以往的测试工作中,最让您感到不满意或者不堪回首的事情是什么?您是如何来对待这些事情的?

    参考答案:

    10、在即将完成这次笔试前,您是否愿意谈一些自己在以往的学习和工作中获得的工作经验和心得体会?(可以包括软件测试、过程改进、软件开发或者与此无关的其他方面)

    参考答案:

    11、为什么选择测试这行?

    参考答案:

      它是一个新兴的行业,有发展潜力,而且很锻炼人,需要掌握更多的技能,比做开发要更难

      为什么值得他们公司雇用?如果我雇用你,你能给部门带来什么贡献?

        如果明知这样做不对,你还会依主管的指过去做吗

      如果你接到一个客户抱怨的电话,你确知无法解决他的问题,你会怎么处理

      你觉得什么样的人最难相处

      为什么值得他们公司雇用?

        帮助公司提高软件质量和测试部门的技术水平

      如果我雇用你,你能给部门带来什么贡献?

        分享我的测试经验和测试技能,提高测试部门技术水平

      如何从工作中看出你是个自动自觉的人

            自动自觉范围太广

         1. 工作成果

         2. 工作质量  

    12、你的工作通常能在时限内完成吗.(我想问一下就是她问这个问题的动机是什么)

    参考答案:

        在有足够的资源和合理的工作量的情况下,完全可以按时完成,并能比一般人做的更好

    13、通常你对于别人批评你会有什么样的反应

    参考答案:有错即改,无错勉之

    14、如果明知这样做不对,你还会依主管的指过去做吗?

           参考答案:

    15、如果你接到一个客户抱怨的电话,你确知无法解决他的问题,你会怎么处理?

    参考答案:

        弄清楚客户为什么抱怨?是怎么样的问题?

      如果是客服问题,提交客服部门解决

      如果是质量问题,分析原因,下一版本改进

    16、请就软件测试人员应该具备什么样的基本素质说说你的看法。

    参考答案:

    17、你在五年内的个人目标和职业目标分别是什么?

    参考答案:

    分析这个问题是用来了解你的计划能力的,通过这个问题,面试人同时还可以知道你的目标是否符合企业对你的安排。

      错误回答我想在将来的某个时候考虑这个问题。如今企业的领导者更换频繁,我认为做太多的个人计划是荒谬可笑的,不是吗?

      评论这种回答属于令人反感的一类。首先,当有人想了解你的目标时,"将来的某个时候"这种通俗说法并不奏效。其次,认为企业很脆弱,领导者更换频繁,这种说法毫无疑问会令人反感,而且也是不合理的。最后,认为做计划可笑,看不起这个问题,而且反问面试人,这些都注定了这样的求职者最终会失败。

      正确回答从现在起的五年之内,我希望能够在一个很好的职位上待几年,而且最好有一次晋升,然后就期待着下一步。不管是向上提升,还是在企业内横向调动,对我个人来说,我希望找到一家企业——一家愿意做相互投入的企业——待上一段时间。

      评论这个问题没有回答得过分具体(那样可能会产生漏洞),而且它表明你有雄心,并且思考过在企业中的成长方式。通过表达横向调动和向上提升的愿望,表明你是一个有灵活性的人。

    18、你怎样做出自己的职业选择?

    参考答案:

           分析 面试人提出这个问题是为了了解求职者的动机,看看他(她)应聘这份工作是否有什么历史渊源,是否有职业规划,是不是仅仅在漫无目的地申请很多工作。

      错误回答 我一直都想在企业界工作。自孩提时代起,我就梦想自己至少也要成为大企业的副总裁。

      评论 除了难以令人相信之外,这种回答还存在一个问题:它表明求职者会对副总裁以下的职位不感兴趣。

      正确回答 在上大学四年级前的那个夏天,我决定集中精力在某一领域谋求发展。尽管我是学商业的,但是我不知道自己最终会从事哪一行业的工作。我花了一定的时间考虑自己的目标,想清楚了自己擅长做的事情以及想从工作中得到的东西,最后我得出了一个坚定的结论,那就是这个行业是最适合我的。

      评论 这种回答表明,求职者认真地做过一些计划,缩小了自己的关注点,而且也认准了前进的方向。这种回答还表明,求职者理解个人职业规划的重要性,并且有能力做出认真的个人决策。

     

     

    展开全文
  • 软件测试&软件测试工程师

    千次阅读 多人点赞 2016-07-08 15:58:01
    日期: 2016-7-8: 内容: 测试工程师软件测试工程师 起源: 最近在面试软件测试工程师方面的工作,今天在整理整理一下关于软件测试这方面的知识点。 一、 测试工程师: 1、 国内定位发展前景: 测试...
  • Tomcat面试题+http面试题+Nginx面试题+常见面试题

    千次阅读 多人点赞 2019-12-12 15:04:43
    worker工作模式 worker模式prefork模式比起来,是使用了多进程+多线程的模式,它也是预先fork了几个子进程,每个子进程能够生成一些服务线程一个监听线程,该监听线程及接入请求并传递给服务线程处理应答。...
  • WPF开发教程

    万次阅读 多人点赞 2019-07-02 23:13:20
    ------WPF开发教程 目录 WPF基础入门....... 1. WPF基础之体系结构......2. WPF基础之XAML....3. WPF基础之基元素......4. WPF基础之属性系统......5. WPF基础之路由事件......7. WPF基础之样式设置模板化... ...
  • 软件测试入门知识了解

    万次阅读 多人点赞 2018-09-05 14:59:58
    需求评审设计评审是验证软件产品的需求定义设计实现,验证所定义的产品特性是否符合客户的期望、系统的设计是否合理、是否具有可测试性以及满足非功能质量特性的要求。这个阶段主要通过对需求文档、设计文档等...
  • Alpha发布日期:2018年2月 Beta发布日期:2018年5月 预计发布日期:EOY 2018 安装 $ npm install --save @onixjs/core 特征 框架是一个企业级Node.JS平台,该平台仅实现行业标准模式,以便提供可能的最佳开发体验...
  • 软件测试方案 V1.0 软件测试方案 文 档 标 当 前 版 V1.0 识 本 当 前 状 草稿 发 布 日 态 发布 期 修改历史 版 变 更 日期 作者 修改内容 评审号 控 制 本 号 V1. 0 第 2 页 共 21页 第 3 页 共 21页 目录 1 6 1.1...
  • 国家军用标准《软件可靠性安全性设计准则》的实践,概述了型号软件可靠性安全性设计标准化研究的重要性,论述了其标准中的软件设计工作涉及到的软件需求分析、软件设计软件实现等三个阶段需要特别注意的几个关键...
  • 在GDC期间,我们宣布了Unity全新的版本发布计划。包含:Unity TECH技术前瞻版本(简称:Unity TECH版)Unity LTS稳定支持版本(简称:Unity LTS版)。 Unity TECH版本每年将有三次主要更新,它们会带来最新的...
  • 基于JAVA的购物网站(毕业论文)

    万次阅读 多人点赞 2010-12-20 14:25:00
    人们可以足不出户的寻找自己所需的物品,通过对不同虚拟商城的访问,“顾客”可以找出性价比最高的商品,自己有极大地选择空间,通过下订单,你可以很快得到自己想要的物品,这给顾客节省很多时间精力,对于厂家来...
  • 手册使用说明 ERP项目实施中有一个成功等式: 企业 ERP系统的成功应用 =有准备的企业 + 合适的软件 +成功实施,三个条件缺一不可。对于用友来说,客户企业的自身条 件属于外部因素, 用友无法控制,只能通过合同...
  • {管理信息化ERPMRP}水泥 企业ERP 系统架构设计与实 施规划 <此页空白> 核检表 日期 年 月 日 设计...发布日期 制号 2009-11-8 V0.05.00 杨立峰 初稿完成 目录 1.引言 1 1.1 撰写背景 1 1.2 撰写目的 1 1.3 内容概述
  • PAGE - 1 - 项目全称部署实施报告 PAGE - 3 - 项目全称 部署实施报告 承建方全称 2013年8月 文件ISO版本控制 文件概述 文件名称 项目全称--部署实施报告 文件编号 项目编号-BSSSBG-TOTAL 编 写 人: 张涛 起编日期 ...
  • 公司 文件编号 版 本 号 总 页 数 测试与发布过程规范 编制 年 月 日 审核 年 月 日 批准 年 月 日 年 月 日 发布 年 月 日 实施 XXXXXXXXXXXXXXXXXXXXXXX 公司 发布 文件更改记录 序号 版本号 更改内容 更改日期 ...
  • 校园招聘系统测试方案 文档标识 当前版本 当前状态 草稿 发布日期 发布 修改历史 日期 版本 作者 修改内容 评审号 变更控制号 1 / 9 目录 1 概述 . 3 2 测试资源环境 . 3 2.1 硬件配置 . 3 2.2 软件配置 . 3 2.3 ...
  • XXXXXXXXXXXXXXXXXXX公司 文件编号 版 本 号 总 页 数 测试与发布过程规范 编制 : 年 月 日 审核 : 年 月 日 批准 : 年 月 日 年 月 日 发布 年 月 日 实施 XXXXXXX XXXXXXXXXXXX公司 发布 文件更改记录 序号 版本号...
  • 发布和使用 ArcGIS Server 服务之--OGC服务
  • 发布日期 :2013-05-15 ?浏览次数 :419 2012年 7 月 5 日修订 为更好的提高文献类数据库资源使用效果 , 保证采购工作质量 , 完善监督制 约机制 ,提高经费使用效益 ,促进学校图书馆建设发展 ,按照图书馆文献资 源...
  • XX市XX板业有限公司 商务部成员岗位职责 OL-A4/03-20XX 版 号 A / 0 制定部门 审核 批准 发布日期20XX年5月1日实施日期20XX年5月1日 XX市XX板业 有限公司 文件编号 OL-A4/03-20XX 版 本 号 A/0 商务部成员岗位职责 ...
  • 计算机软件文档编制规范GB-T8567-2006 本标准是GB/T8567—1988《计算机软件产品开发文件编制指南》的修订版,并改名为《计算机软件文档编制规范》。本标准从实施之日起代替GB/T8567—1988。
  • 电子商务营销策划方案 最新发布的电子商务营销策划方案的详细范文参考文章觉得应该跟大家分享重新整理了一下发到这里 篇一电子商务营销计划书 建廷皮具电子商务营销企划书 名 称建廷皮具电子商务营销企划书 策 划 人...
  • 自动化测试实施步骤最佳实践

    千次阅读 2014-09-01 16:21:07
     我在很多软件公司工作过,公司规模有大有小,也来自其他公司的人员交流,因此经历过或者听说过影响自动化测试效果的各种各样的的问题。本文将提供若干方法规避可能在自动化测试中出现的问题。我先给大家讲一个...
  • 第二次发布日期: 2015年11月17日 介绍 感谢您对此项目感兴趣。 该存储库中的代码作为SophiaBeads数据集项目的一部分发布,并经过专门设计以用于处理/或重建SophiaBeads数据集。 目的 SophiaBeads数据集专门用于...
  • 建 省 地 方 标 准 DBX/T 政务信息数据存储安全 等级保护实施规范 Specification of Implementation for classified protection of government information data storage 意见稿 本稿完成日期2013 年8 月10 日 ...
  • 可行性分析报告 版本号 1.0 修订历史 版本 发布日期 生效日期 修订说明 作者 审核人 批准人 当前状态 1.0 2012-05-05 2012-05-06 新建 * * * 试用发布 目录 TOC \o "1-3" \h \z 1. 引言 4 1.1 项目背景 4 1.2 术语...
  • 软件开发设计文档 文档管理信息表 主题 web服务器 版本 1.0 内容 可响应客户端发送文件请求的web服务器 关键字 套接字请求报文响应报文tcp编程 参考文档 无 创建时间 2016/4/2 创建人 吴鑫 最新发布日期 2016/4/2 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,863
精华内容 8,345
关键字:

发布日期和实施日期