精华内容
下载资源
问答
  • PTA46题(Java基础练习)

    万次阅读 多人点赞 2019-10-03 20:40:59
    Java作业练习(1) 这学期Java课的第一次作业嗷 (做完再删掉这句话) 我觉得可以 7-1 写一个程序,输出你的姓名、年龄、所在学院、所在专业、所在班级 写一个程序,输出你的姓名、年龄、所在学院、所在专业、所在班级...

    Java作业练习(1)

    这学期Java课的第一次作业嗷
    (做完再删掉这句话)
    我觉得可以

    7-1 写一个程序,输出你的姓名、年龄、所在学院、所在专业、所在班级

    写一个程序,输出你的姓名、年龄、所在学院、所在专业、所在班级。

    输出样例:
    姓名:张三
    年龄:20
    所在学院:计算机学院
    所在专业:计算机科学与技术
    所在班级:1班

    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            if (scanner.hasNext()) {
                String n, m1, m2;
                int old, m3;
                n = scanner.nextLine();
                old = Integer.parseInt(scanner.nextLine());
                m1 = scanner.nextLine();
                m2 = scanner.nextLine();
                m3 = Integer.parseInt(scanner.nextLine());
                System.out.println("姓名:" + n + "\n" +
                        "年龄:" + old + "\n" +
                        "所在学院:" + m1 + "\n" +
                        "所在专业:" + m2 + "\n" +
                        "所在班级:" + m3 + "班");
            }else {
                System.out.println("姓名:张三\n" +
                        "年龄:20\n" +
                        "所在学院:计算机学院\n" +
                        "所在专业:计算机科学与技术\n" +
                        "所在班级:1班");
            }
        }
    }
    
    7-2 jmu-Java-02基本语法-05-浮点数的精确计算

    输入若干对浮点数,对每对浮点数输出其精确的和与乘积。
    以下输入样例为两对浮点数输入,实际上有可能有不定对数的浮点数需要输入计算。

    注1:直接使用double类型数据进行运算,无法得到精确值。
    注2:输出时直接调用BigDecimal的toString方法。

    输入样例:

    69.1 0.02
    1.99 2.01

    输出样例:

    69.12
    1.382
    4.00
    3.9999

    import java.math.BigDecimal;
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            BigDecimal a,b;
            while (scanner.hasNext()){
                a = scanner.nextBigDecimal();
                b = scanner.nextBigDecimal();
                System.out.println(a.add(b));
                System.out.println(a.multiply(b));
            }
        }
    }
    
    7-3 jmu-Java-02基本语法-06-枚举

    定义一个枚举类型Grade来表示考试的4个等级,值包含A,B,C,D,E

    编写一个函数Grade getGrade(int score)将传递进来的score转化为枚举类型

    score>=90 and <=100返回A,
    score>=80 and <90 返回B,
    score>=70 and <80 返回C,
    score>=60 and <70返回D,
    其他的返回E
    main方法
    输入分数后,调用getGrade函数返回相应的Grade,使用switch根据Grade,根据分数打印不同的评价:
    Excellent Good Average Fair Poor
    并且每输出一个评语后,要调用如下函数

    public static void printGradeInfo(Grade grade){
           System.out.println("class name="+Grade.class);
           System.out.println("grade value="+grade);
    }
    

    输入样例:

    90
    80
    70
    60

    输出样例:

    Excellent
    class name=class Grade
    grade value=A
    Good
    class name=class Grade
    grade value=B
    Average
    class name=class Grade
    grade value=C
    Fair
    class name=class Grade
    grade value=D

    import java.util.Scanner;
    
    enum  Grade{
        A,B,C,D,E
    }
    public class Main {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            int m;
            while (scanner.hasNext()){
                m = scanner.nextInt();
                printGradeInfo(getGrade(m));
            }
        }
        public static Grade getGrade(int score){
            if(score>=90&&score<=100){
                System.out.println("Excellent");
                return Grade.A;
            }
            else if(score>=80&&score<90){
                System.out.println("Good");
                return Grade.B;
            }
            else if(score>=70&&score<80){
                System.out.println("Average");
                return Grade.C;
            }
            else if(score>=60&&score<70){
                System.out.println("Fair");
                return Grade.D;
            }
            else {
                System.out.println("Poor");
                return Grade.E;
            }
        }
        public static void printGradeInfo(Grade grade){
            System.out.println("class name="+Grade.class);
            System.out.println("grade value="+grade);
        }
    }
    
    
    7-4 jmu-Java-02基本语法-07-大整数相加 (4 分)

    有若干大整数,需要对其进行求和操作。

    输入格式
    每行输入一个字符串代表一个大整数,连续输入若干行,当某行字符为e或E时退出。

    输入样例:

    42846280183517070527831839425882145521227251250327
    55121603546981200581762165212827652751691296897789
    e

    输出样例:

    97967883730498271109594004638709798272918548148116

    
    import java.math.BigDecimal;
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            String n;
            BigDecimal bigDecimal,sum = BigDecimal.valueOf(0L);
            while (scanner.hasNext()){
                n = scanner.nextLine();
                if ("e".equals(n) || "E".equals(n)){
                    break;
                }
                bigDecimal = new BigDecimal(n);
                sum = sum.add(bigDecimal);
            }
            System.out.println(sum);
        }
        
    }
    
    
    7-5 testestjava

    这是一个编程题模板。请在这里写题目描述。例如:本题目要求读入2个整数A和B,然后输出它们的和。

    输入格式:
    请在这里写输入格式。例如:输入在一行中给出2个绝对值不超过1000的整数A和B。

    输出格式:
    请在这里描述输出格式。例如:对每一组输入,在一行中输出A+B的值。

    输入样例:

    在这里给出一组输入。例如:
    18 -299

    输出样例:

    在这里给出相应的输出。例如:
    -281

    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            String shuru = scanner.nextLine();
            String n = scanner.nextLine();
            String[] s = n.split(" ");
            System.out.println("在这里给出相应的输出。例如:");
            System.out.println(Integer.parseInt(s[0]) + Integer.parseInt(s[1]));
        }
        
    }
    
    7-6 字符串处理

    编写一个程序,用户输入任意一个字符串,显示它的长度和第一个字符。

    输入格式:
    输入任意一个字符串。

    输出格式:
    显示它的长度和第一个字符,其间用,分隔。

    输入样例:

    abc 4567

    输出样例:

    8,a

    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            String strings = scanner.nextLine();
            System.out.println(strings.length() + "," + strings.charAt(0));
        }
        
    }
    
    7-7 十进制转十六进制

    编写一个程序,提示用户输入0~15之间的一个整数,显示其对应的十六进制数。

    输入格式:
    输入一个0~15之间的整数。

    输出格式:
    若输入的整数在0~15范围内,则输出对应的十六进制数。否则输出“Invalid input”。

    输入样例:

    11

    输出样例:

    B

    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            char m = 'A';
            int n = scanner.nextInt();
            if(n > 15) {
                System.out.println("Invalid input");
            }else if (n >= 10 && n <= 15){
                System.out.println((char) (m+n-10));
            }else {
                System.out.println(n);
            }
            
        }
        
    }
    
    7-8 求最大值

    本题目要求读入2个整数A和B,然后输出两个数的最大值。

    输入格式:
    输入在一行中给出2个绝对值不超过1000的整数A和B。

    输出格式:
    对每一组输入,在一行中输出最大值。

    输入样例:
    在这里给出一组输入。例如:

    18 -299

    输出样例:
    在这里给出相应的输出。例如:

    18

    
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            int A = scanner.nextInt();
            int B = scanner.nextInt();
            if(A > B)
                System.out.println(A);
            else
                System.out.println(B);
            scanner.close();
        }
        
    }
    
    
    7-9 jmu-java-01入门-基本输入

    对输入的若干行(每行以空格或者多个空格)数字字符串求和并输出。

    输入格式:
    每行包含两个数字字符串,中间以一个或者多个空格分隔。

    输出格式:
    输出两个数的和

    输入样例:

    1 1
    2 3
    -100 100
    -100 -100
    10 0

    输出样例:
    在这里给出相应的输出。例如:

    2
    5
    0
    -200
    10

    
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
    
            while (scanner.hasNext()){
                String s,a = "",b="";
                int sum = 0;
                s = scanner.nextLine();
                int i,j = 0;
                boolean f= false;
                for (i = 0; i < s.length(); i++) {
                    if (s.charAt(i) != ' ') {
                        a = a + s.charAt(i);
                        f = true;
                    }else if (f == true) {
                        j = i;
                        break;
                    }
                }
    
                for (j = i; j < s.length(); j++) {
                    if (s.charAt(j) != ' '){
                        b+=s.charAt(j);
                    }
                }
    
                System.out.println(Integer.parseInt(a) + Integer.parseInt(b));
            }
        }
        
    }
    
    
    7-10 编程题:统计符合条件元素的个数-hebust

    统计1…n的闭区间中,能够被3整除元素的奇数和偶数的个数

    输入格式:
    输入值n的范围是 【1…1000】

    输出格式:
    奇数个数,偶数个数

    输入样例:

    5

    输出样例:

    1,0

    import java.util.Scanner;
    
    public class Main {
        
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            int n = scanner.nextInt();
            int a = 0,b = 0;
            for (int i = 1; i <= n; i++) {
                if (i % 3 == 0 && i % 2 == 0){
                    b++;  
                }
                if (i % 3 == 0 && i % 2 != 0){
                    a++;
                }
            }
            System.out.println(a+","+b);
        }
        
    }
    
    
    7-11 编程题:判断闰年-hebust

    根据输入的正整数y所代表的年份,计算输出该年份是否为闰年 闰年的判断标准:

    能够被4整除且不能被100整除的年份

    或者能够被400整除的年份

    输入格式:
    输入n取值范围是 【1…3000】

    输出格式:
    是闰年,输出 yes

    非闰年,输出 no

    输入样例:
    在这里给出一组输入。例如:

    100

    输出样例:
    在这里给出相应的输出。例如:

    no

    
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int y = scanner.nextInt();
        if (((y % 4 == 0 )&& (y % 100 != 0)) || y % 400 == 0) {
                System.out.println("yes");
            } else {
                System.out.println("no");
            }
        }
    }
    
    
    
    7-12 输出月份

    分别用if、switch两种方法编写根据0~11的整数转换为十二月份的程序片断,假定数字0对应一月份。

    输入格式:
    每一行输入0~12之间的一个数字

    输出格式:
    输出该数字对应的月份

    输入样例:

    0

    输出样例:

    请输入月份:
    2
    三月份
    请输入月份:
    12
    请重新输入月份

    
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            int n = scanner.nextInt();
            if (n >= 12){
                System.out.println("请重新输入月份");
            }else {
                String[] strings = {"一月份", "二月份", "三月份", "四月份", "五月份", "六月份",
                        "七月份", "八月份", "九月份", "十月份", "十一月份", "十二月份"};
                System.out.println(strings[n]);
            }
        }
        
    }
    
    
    7-13 点是否在圆内?

    编写程序,提示用户输入一个点(x,y),然后检查这个点是否在以原点(0,0)为圆心、半径为10的圆内。

    输入格式:
    输入任意一个点的x轴和y轴坐标值,且两个值之间空格分隔。

    输出格式:
    若点在圆内,输出1,否则输出0。

    输入样例:

    4 5

    输出样例:

    1

    
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            int x = scanner.nextInt();
            int y = scanner.nextInt();
            if( x * x + y * y <= 100) {
                System.out.println("1");
            } else {
                System.out.println("0");
            }
        }
        
    }
    
    
    7-14 给出一个月的总天数

    编写程序,提示用户输入月份和年份,然后显示这个月的天数。

    输入格式:
    输入任意符合范围(1月12月)的月份和(1900年9999年)年份,且两个值之间空格分隔。

    输出格式:
    输出给定年份和月份的天数。

    输入样例:

    2 2000

    输出样例:

    29

    
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            int month = scanner.nextInt();
            int year = scanner.nextInt();
            int day = 0;
        if (month != 2) {
                switch (month) {
                    case 1:
                    case 3:
                    case 5:
                    case 7:
                    case 8:
                    case 10:
                    case 12:
                        day = 31;
                        break;
                    case 4:
                    case 6:
                    case 9:
                    case 11:
                        day = 30;
                }
                }else if (((year % 4 == 0) && (year % 100 != 0)) || year % 400 == 0) {
                    day = 29;
                } else {
                    day = 28;
                }
        System.out.println(day);
    }
    }
       
    
    7-15 程序改错题1

    程序改错题。以下代码目标是实现从键盘输入1个整数x,然后根据x的值做不同的计算,输出结果。(程序有错,请改正后提交)

    import java.util.Scanner;
    public class Main {
    public static void main(String args[]) {
    Scanner in = new Scanner(System.in);
    int x, j = 1;
    x = in.nextInt();
    switch (x) {
    case 1:
    j++;
    case 2:
    j++;
    case 3:
    j = x*j++;
    case 4:
    j= x + j++;
    case 5:
    j = x - j++;
    default:
    j = x;
    }
    System.out.println(j);
    }
    }

    输入格式:
    输入整数x。

    输出格式:
    输出值。

    输入样例:

    5

    输出样例:

    4

    
    import java.util.Scanner;
    
    public class Main {
            public static void main(String args[]) {
            Scanner in = new Scanner(System.in);
            int x, j = 1;
            x = in.nextInt();
            switch (x) {
                case 1:
                    j++;break;
                case 2:
                    j++;break;
                case 3:
                    j = x*j++;break;
                case 4:
                    j= x + j++;break;
                case 5:
                    j = x - j++;break;
                default:
                    j = x;break;
            }
            System.out.println(j);
        }
        
    }
    
    
    7-16 根据和找到最大乘积

    试求和为N,积为最大的两个整数数分别是多少。

    从键盘中输入一个整数,它是另外两个整数的加法运算和,这样的两个整数的组合有很多种,请找出乘积最

    大的一组数据。请注意输出两个整数以空格分割,按由小到大的顺序输出。

    输入格式:
    从键盘中输入一个整数

    输出格式:
    在一行中输出两个整数,以空格分割,按由小到大的顺序输出。

    输入样例:

    33

    输出样例:

    16 17

    输入样例:

    -51

    输出样例:

    -26 -25

    
    import java.util.Scanner;
    
    public class Main {
        public static void main(String args[]) {
            Scanner scanner = new Scanner(System.in);
            int a;
            a = scanner.nextInt();
            if (a == 0){
                System.out.println(-1+" "+1);
            }else {
                if (a % 2 == 0) {
                    System.out.println(a / 2 + " " + a / 2);
                } else {
                    System.out.println((a - 1) / 2 + " " + (a + 1) / 2);
                }
            }
        }
        
    }
    
    
    7-17 编程题:数据的规范化处理问题-hebust

    在进行数据处理时,输入数据未经过滤,存在一些不符合要求的数据 要求编写数据处理程序,小于0的数据一律指定为0,大于100的数据一律指定为100

    输入格式:
    输入:所有元素占一行,元素之间使用空格分开,元素均为整数,范围【-300…300】

    输出格式:
    输出:所有元素占一行,元素之间使用西文逗号分开,最后一个元素末尾保留西文逗号

    输入样例:
    在这里给出一组输入。例如:

    -1 10 105

    输出样例:
    在这里给出相应的输出。例如:

    0,10,100,

    
    import java.util.Scanner;
    
    public class Main {
        public static void main(String args[]) {
            
            Scanner scanner = new Scanner(System.in);
            String s = scanner.nextLine();
            String[] strings = s.split(" ");
            for (int i = 0; i < strings.length; i++) {
                if (Integer.parseInt(strings[i]) < 0){
                    System.out.print(0+",");
                }else if (Integer.parseInt(strings[i]) > 100){
                    System.out.print(100+",");
                }else {
                    System.out.print(strings[i]+",");
                }
            }
        }
        
    }
    
    
    7-18 编程题:复杂情况下的数据统计问题-hebust

    复杂环境下的数据统计问题

    进行数值统计的时候,可能会混入一些非数值的元素,下面请编程完成对输入序列进行求和统计并输出, 如果遇到非数值元素,则自动跳过,并在最终结果输出行之后另起一行,输出attention

    输入格式:
    单行输入,元素之间使用空格分开

    输出格式:
    对元素所对应的整数进行求和并输出

    如果遇到非数值元素,则自动跳过,并在最终结果输出行之后另起一行,输出attention

    输入样例a:
    在这里给出一组输入。例如:

    1 2 3 4 5

    输出样例a:
    在这里给出相应的输出。例如:

    15

    输入样例b:
    在这里给出一组输入。例如:

    1 2 3 4 a 5

    输出样例b:
    在这里给出相应的输出。例如:

    15
    attention

    
    import java.util.Scanner;
    
    public class Main {
        public static void main(String args[]) {
            Scanner scanner = new Scanner(System.in);
            String s = scanner.nextLine();
            String[] strings = s.split(" ");
            int sum = 0;
            boolean f = false;
            for (int i = 0; i < strings.length; i++) {
                if (strings[i].charAt(0)=='-'){
                    sum += Integer.parseInt(strings[i]);
                }else if (strings[i].charAt(0)>='0' && strings[i].charAt(0) <= '9'){
                    try {
                        sum += Integer.parseInt(strings[i]);
                    }catch (Exception a){
                        f = true;
                        continue;
                    }
                }else {
                    f = true;
                }
            }
            System.out.println(sum);
            if (f){
                System.out.println("attention");
            }
        }
    }
    
    
    7-19 二进制的前导的零

    计算机内部用二进制来表达所有的值。一个十进制的数字,比如18,在一个32位的计算机内部被表达为00000000000000000000000000011000。可以看到,从左边数过来,在第一个1之前,有27个0。我们把这些0称作前导的零。

    现在,你的任务是写一个程序,输入一个整数,输出在32位表达下它前导的零的个数。

    输入格式:
    一个整数,在32位的整数可以表达的范围内。

    输出格式:
    一个整数,表达输入被表达为一个32位的二进制数时,在第一个1之前的0的数量。

    输入样例:

    256

    输出样例:

    23

    
    import java.util.Scanner;
    
    public class Main {
        public static void main(String args[]) {
            Scanner scanner = new Scanner(System.in);
            Integer a = scanner.nextInt();
            if (a.equals(0)){
                System.out.println(32);
            }else {
                String s = Integer.toBinaryString(a);
                System.out.println(32 - s.length());
            }
        }
    }
    
    
    7-20 JAVA-水仙花数

    水仙花数是指一个N位正整数(7≥N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=13+53+33。 要求编写程序,计算所有N位水仙花数。

    输入格式:
    输入一个正整数N(3≤N≤7)。

    输出格式:
    按递增顺序输出所有N位水仙花数,每个数字占一行。

    输入样例:
    在这里给出一组输入。例如:

    3

    输出样例:
    在这里给出相应的输出。例如:

    153
    370
    371
    407

    
    import java.util.Scanner;
    
    public class Main {
        public static void main(String args[]) {
            Scanner scanner = new Scanner(System.in);
            int N = scanner.nextInt();
            int i,j,a,b,c;
            for(i =100;i<1000;i++) {
              a=i/100;
              b=i%10;
              c=(i/10)%10;
              if(Math.pow(a,N) + (Math.pow(b,N)) + (Math.pow(c, N))==(i))
                System.out.println(i);
            }
    }
    }
    
    
    7-21 JAVA-求整数序列中出现次数最多的数

    要求统计一个整型序列中出现次数最多的整数及其出现次数。

    输入格式:
    在一行中给出序列中整数个数N(0<N≤1000),依次给出N个整数,每个整数占一行。

    输出格式:
    在一行中输出出现次数最多的整数及其出现次数,数字间以空格分隔。题目保证这样的数字是唯一的。

    输入样例:
    在这里给出一组输入。例如:

    10
    3
    2
    -1
    5
    3
    4
    3
    0
    3
    2

    输出样例:
    在这里给出相应的输出。例如:

    3 4

    
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner scanner = new Scanner (System.in);
            int n = scanner.nextInt();
            int b = 0;
            int t = 0;
            int[] arr = new int[1000];
            for (int i = 0; i < n; i++) {
                arr[i] = scanner.nextInt();
            }
            for(int i = 0;i < n;i ++){
                int c = 0;
                for(int j = 0;j < n;j ++){
                    if(arr[i] == arr[j]){
                        c ++;
                    }
                }
                if(c > b){
                    t = arr[i];
                    b = c;
                }
        }
        System.out.println(t + " " + b);
        }
        
    }
    
    
    7-22 统计正数和负数的个数然后计算这些数的平均值

    编写程序,输入未指定个数的整数,判断读入的正数有多少个,读入的负数有多少个,然后计算这些输入值得总和及平均值(不对0计数)。当输入为0时,表明程序结束。将平均值以double型数据显示。

    输入格式:
    输入在一行中给出一系列整数,其间以空格分隔。当读到0时,表示输入结束,该数字不要处

    输出格式:
    在第一行中输出正整数的个数; 在第二行中输出负整数的个数; 在第三行中输出这些输入值的总和(不对0计数); 在第四行中输出这些输入值的平均值(double型数据)。

    输入样例:

    1 2 -1 3 0

    输出样例:

    3
    1
    5
    1.25

    
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            String s = in.nextLine();
            if (s.equals("0")){
                return;
            }
            String[] s1 = s.split(" ");
            int[] o=new int[s1.length];
            for (int i=0;i<s1.length;i++){
                o[i]=Integer.valueOf(s1[i]);
            }
            double sum=0;
            int num1=0;
            int num2=0;
            for (int i=0;i<o.length;i++){
                if (o[i]>0){
                    num1++;
                }else if (o[i]<0){
                    num2++;
                }
                sum+=o[i];
            }
            System.out.println(num1);
            System.out.println(num2);
            int a=(int)sum;
            System.out.println(a);
            System.out.println(sum/(num1+num2));
        }
    }
    
    
    7-23 分队列

    班级第一次列队,通常老师会让同学按身高排成一列,然后1、2报数,喊到1的同学向前一步,就这样,队伍就变成两列了。假设现在一个班级有n个同学,并且他们已经按身高排成了一列,同学按身高从1到n编号,你能告诉我最后哪些编号的同学站在了第一列么?

    输入格式:
    输入一个正整数n,表示班级的人数。

    输出格式:
    按顺序输出所有在第一列的同学对应的编号,每两个编号之间用一个空格隔开。

    输入样例:

    11

    输出样例:

    1 3 5 7 9 11

    
    import java.util.Scanner;
    
    public class Main {
        public static void main(String args[]) {
            Scanner scanner = new Scanner(System.in);
            int N = scanner.nextInt();
            for (int i = 1; i <= N; i++) {
                if (i == 1){
                    System.out.print(1);
                }else if(i % 2 != 0) {
                    System.out.print(" " + i);
                }
            }
        }
    }
    
    
    7-24 累加器

    请你实现一个累加器。输入n个非负整数,输出他们的和。 1<n<1000,而每个数则<10000。

    输入格式:
    输入包括两行。 第一行:包括一个整数n,表示总共有n个数。 第二行:包含n个整数。

    输出格式:
    输出n个数的和。

    输入样例:

    4
    3 2 1 4

    输出样例:

    10

    
    import java.util.Scanner;
    
    public class Main {
         public static void main(String args[]) {
            Scanner scanner = new Scanner(System.in);
            int N = scanner.nextInt();
            int sum = 0;
            for (int i = 0; i < N; i++) {
                int a = scanner.nextInt();
                sum += a;
            }
            System.out.println(sum);
        }
    }
    
    
    7-25 我是升旗手

    一年一度的升旗手选拔又要到了,学校要求每个班级选出一位同学做升旗手的候选人。因 为升旗手对身高有严格的要求,所以班主任决定选班级里个子最高的同学(如果两位同学 一样高,则选任意一位)。你能很快地给老师答案么?

    输入格式:
    输入包括两行。 第一行:包括一个整数n,表示班级里共有n位同学。 第二行:包含n个三位数,表示每一位同学的身高。

    输出格式:
    输出身高最高的同学的身高。

    输入样例:

    4
    130 125 129 140

    输出样例:

    140

    
    import java.util.Scanner;
    
    public class Main {
        public static void main(String args[]) {
            Scanner scanner = new Scanner(System.in);
            int N = scanner.nextInt();
            int max = 0;
            for (int i = 0; i < N; i++) {
                int a = scanner.nextInt();
                if (a > max){
                    max = a ;
                }
            }
            System.out.println(max);
        }
    }
    
    
    7-26 兔子繁殖问题

    已知有一对兔子,每个月可以生一对兔子,而小兔子一个月后又可以生一对小兔子(比如:2月份出生的小兔子4月份可以生育)。也就是说,兔子的对数为:第一个月1对,第二个月2对,第三个月3对,第四个月5对…假设兔子的生育期为两年,且不死。那么问题来了,你能说出每个月的兔子数么?

    输入格式:
    输入一个数n,表示第n个月,1<=n<=24。

    输出格式:
    输出这个月兔子的数目。

    输入样例:

    4

    输出样例:

    5

    
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            int n = scanner.nextInt();
            System.out.println(fun(n));
            scanner.close();
        }
        
        
        public static int fun(int n) {
            if (n == 0 || n == 1) {
                return 1;
            } else {
                return fun(n - 1) + fun(n - 2);
            }
        }
        
    }
    
    
    7-27 作品评分

    全国中小学生Scratch作品大赛拉开了序幕。每个参赛选手可以通过网络直接上传作品。本次比赛人人可做评委。每个网络评委可以通过网络对每一件作品进行打分。评分系统也是请程序高手设计的,能自动去掉一个最高分和一个最低分,求出平均分。

    输入格式:
    输入数据包括两行: 第一行为n,表示n个评委,n>2。 第二行是n个评委的打分,分数之间有一个空格。打分是可以带有小数部分的。

    输出格式:
    输出平均分,结果保留两位小数。

    输入样例:

    6
    10 9 8 7.9 9 9.5

    输出样例:

    8.88

    
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            String N = scanner.nextLine();
            double max = 0;
            double min =11;
            double sum = 0;
            double sum1 = 0;
            if(N.equals("0")) {
                System.out.println("0");
            }
            String s = scanner.nextLine();
            String[] strings = s.split(" ");
            for(int i = 0; i < strings.length; i++) {
                if (max < Double.parseDouble(strings[i])) {
                    max = Double.parseDouble(strings[i]);
                  } else if (min > Double.parseDouble(strings[i])) {
                                min = Double.parseDouble(strings[i]);
                        }
                        sum += Double.parseDouble(strings[i]);
                    }
            sum1 = (sum - max - min) / (Integer.parseInt(N) - 2);
            System.out.println(String.format("%.2f", sum1));
            }
        }
    
    7-28 369寝室

    369寝室是比较特殊的寝室,因为别的寝室都住了四个人,而369寝室只有三个人。也因为这个原因,寝室里的三位同学感情特别好。但是,毕业在即,三位小伙伴马上要分别。为了在未来的某个日子可以见面,三位小伙伴有了一个约定,假设在未来的某一年,三位小伙伴的年龄的末尾正好出现3、6、9三个数,那么他们会再次相聚。

    现在问题来了,假设今年三位小伙伴的年龄分别是x,y,z,那么,他们三人最早几年后可以相聚呢?

    输入格式:
    输入数据包括三个整数x,y,z,分别表示三位伙伴的年龄。

    输出格式:
    如果小伙伴最早在n年后可以相见(不包括当前这一年),那么请输出这个n;如果100年内都不存在这样的情况,输出:so sad!

    输入样例:

    25 22 28

    输出样例:

    1

    
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            boolean sad;
            boolean situation1 ,situation2 ,situation3 ;
            while (scanner.hasNextInt()) {
                sad = false;
            int x = scanner.nextInt();
            int y = scanner.nextInt();
            int z = scanner.nextInt();
            for(int i = 1; i <= 100; i++) {
                situation1 = false;
                situation2 = false;
                situation3 = false;
                if (i == 100) {
                        sad = true;
                    }
                if ((x + i) % 10  == 3 || (y + i) % 10  == 3 || (z + i) % 10  == 3) {
                        situation1 = true;
                    }
                    if ((x + i) % 10  == 6 || (y + i) % 10  == 6 || (z + i) % 10  == 6) {
                        situation2 = true;
                    }
                    if ((x + i) % 10  == 9 || (y + i) % 10  == 9 || (z + i) % 10  == 9) {
                        situation3 = true;
                    }
                    if (situation1&&situation2&&situation3) {
                        System.out.println(i);
                        break;
                    }
            }
            if(sad) {
                System.out.println("so sad!");
            }
        }
        }
    }
    
    
    7-29 等腰直角三角形

    等腰直角三角形是指一个角是直角,且两条直角边相等的三角形。这里我们输出直角边长为n的等腰直角三角形的格式如下所示: 比如n=1,则输出:

    *  
    

    n=2,输出:

    *
    ** 
    

    n=3,输出:

    *
    ** 
    *** 
    

    那么,你能用程序来实现么?

    输入格式:
    输入一个数n,表示三角形的边长。1<n<1000。

    输出格式:
    输出对应的用*表示的等腰直角三角形。

    输入样例:

    4

    输出样例:

    *
    **
    ***
    ****
    
    
    import java.util.Scanner;
    
    public class Main {
        public static void main(String args[]) {
            Scanner scanner = new Scanner(System.in);
            int N = scanner.nextInt();
            String s = "*";
            for (int i = 1; i <= N; i++) {
                System.out.println(s);
                s+="*";
            }
        }
    }
    
    
    
    
    7-30 画菱形

    菱形是一种特殊的平行四边形,是四条边均相等的平行四边形。题目给出菱形的边长n,用*画出菱形。如n=1,输出:

    *
    

    n=2,输出:

     *
    *** 
     * 
    

    n=3,输出:

      * 
     ***
    *****
     ***
      *
    

    那么,你能用程序来实现么?

    输入格式:
    输入菱形的边长n,1<n<100。

    输出格式:
    输出对应的用*表示的菱形。

    输入样例:

    4

    输出样例:

        *
       ***
      *****
     *******
      *****
       ***
        *
    
    
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            
            Scanner scanner = new Scanner(System.in);
            int n = scanner.nextInt();
            for(int i = 0; i < n; i++) { 
                for(int k = n - i - 1 ; k > 0 ; k--) { 
                    System.out.print(" ");
                }
                for (int j = 0;j <= 2 * i; j++) {  
                    System.out.print("*");
                }
                System.out.println();
            }
            
            n -= 1;
            for (int i = n; i > 0; i--) { 
                for(int k = n - i +1; k > 0; k--) {
                    System.out.print(" ");
                }
    
                for(int j = 0; j <= 2 * i - 2; j++) {
                    System.out.print("*");
                }
                System.out.println();
            }
        }
        
    }
    
    
    7-31 666

    中国人非常喜欢6这个数字,因为大家总爱说66大顺啊。数学狂人李某人喜欢把什么都数字化,于是她把顺利这个词也定义了数量级,6代表1级顺利,66代表2级顺利,666代表3级顺利,以此类推。你看,数学狂人的世界总是让人无法理解。今天,李某人决定将数学进行到底,现在她设前n级顺利的和是sn。

    sn=6+66+666+…+66…66(n个6)。

    假设你已经知道了数字n,那么,你能帮李某人求出sn么?

    输入格式:
    输入一个正整数n,n的范围是[0,10)。

    输出格式:
    输出Sn的值。

    输入样例:

    2

    输出样例:

    72

    
    import java.util.Scanner;
    
    public class Main {
        public static void main(String args[]) {
            Scanner scanner = new Scanner(System.in);
            int N = scanner.nextInt();
            long sn = 0;
            long a = 6;
            for (int i = 0; i < N; i++) {
                sn += a;
                a = a*10 +6;
            }
            System.out.println(sn);
        }
    }
    
    
    7-32 倒顺数字串

    输入正整数n,输出它的倒顺数字串。如n=6时,输出

    1 2 3 4 5 6 5 4 3 2 1

    输入格式:
    输入一个正整数n,n的范围是[1,50]。

    输出格式:
    n的倒顺数字串,每两个数字之间只用一个空格隔开。

    输入样例:

    6

    输出样例:

    1 2 3 4 5 6 5 4 3 2 1

    
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            int N = scanner.nextInt();
            for(int i = 1; i < N; i++) {
                System.out.print(i + " ");
            }
            for(int i = N; i >= 1; i--) {
                if(i == 1) {
                    System.out.print(i);
                }else {
                    System.out.print(i + " ");
                }
            }
        }
    }
    
    
    7-33 空心字母金字塔

    输入一个大写的英文字母,输出空心的字母金字塔。

    输入格式:
    一个大写英文字母。

    输出格式:
    一个空心的大写英文字母金字塔,其中第1层的“A”在第1行的第40列,列从1开始计数。

    输入样例:

    E

    输出样例:

                                           A
                                          B B
                                         C   C
                                        D     D
                                       EEEEEEEEE
    
    
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            String N = scanner.nextLine();
            StringBuilder b = new StringBuilder("                                       "); 
            String c = " ";
            int k = 1;
            for (char i = 'A'; i < N.charAt(0); i++) {
                System.out.print(b);
                if (i == 'A'){
                    System.out.println(i);
                }else {
                    System.out.print(i);
                    System.out.print(c);
                    System.out.println(i);
                    c += "  ";
                }
                b.delete(0,1);
                k++;
            }
            System.out.print(b);
            for (int i = 0; i < 2*k -1; i++) {
                System.out.print(N);
            }
        }
    }
    
    
    7-34 上三角数字三角形

    输入一个正整数n,输出具有n层的上三角数字三角形。

    输入格式:
    只有一个正整数n,1<=n<=100。

    输出格式:
    一个上三角数字三角形,每个数字占四个字符位置。

    输入样例:

    5

    输出样例:

       1   2   3   4   5
       6   7   8   9
      10  11  12
      13  14
      15
    
    
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            int n = scanner.nextInt();
            int k = 1;
            int t = n;
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < t; j++) {
                    System.out.printf("%4d",k);
                    k++;
                }
                t--;
                System.out.println();
            }
        }
    }
    
    
    7-35 又来一个上三角数字三角形

    输入一个正整数n,输出具有n层的上三角数字三角形。

    输入格式:
    只有一个正整数n,1<=n<=100。

    输出格式:
    一个上三角数字三角形,每个数字占四个字符位置。

    输入样例:

    5

    输出样例:

       1   6  10  13  15
       2   7  11  14
       3   8  12
       4   9
       5
    
    import java.util.Scanner;
    
    public class Main {
        public static void main(String args[]) {
            Scanner scanner = new Scanner(System.in);
            int a = scanner.nextInt();
            int k = 1;
            int t = a;
            int[][] map = new int[a][a];
            for (int i = 0; i < a; i++) {
                for (int j = 0; j < t; j++) {
                    map[j][i] = k;
                    k++;
                }
                t--;
            }
            for (int i = 0; i < a; i++) {
                for (int j = 0; j < a; j++) {
                    if (map[i][j] != 0){
                        System.out.printf("%4s",map[i][j]);
                    }
                }
                System.out.println();
            }
        }
    }
    
    7-36 组合找出最大值和最小值

    从键盘输入0~9之内的4个整数,计算由这4个整数组合成的整数的最大值和最小值。若输入的不是整数则输出“number input error”若输入的整数不是0~9范围内则输出“Numerical range error”

    输入格式:
    从键盘输入0~9之内的4个整数,以空格分割

    输出格式:
    对每一组输入,在一行中输出两个整数,最大值和最小值。

    输入样例:

    1 5 9 3

    输出样例:==

    9531 1359

    输入样例:

    1 5 a 9

    输出样例:

    number input error

    输入样例:

    1 5 10 9

    输出样例:

    Numerical range error

    
    import java.util.Arrays;
    import java.util.Scanner;
    
    public class Main {
        public static void main(String args[]) {
            Scanner scanner = new Scanner(System.in);
            String s = scanner.nextLine();
            String[] strings = s.split(" ");
            int[] a = new int[4];
            for (int i = 0; i < strings.length; i++) {
                if (strings[i].charAt(0) < '0' || strings[i].charAt(0) > '9'){
                    System.out.println("number input error");
                    return;
                }else if (strings[i].length() != 1){
                    System.out.println("Numerical range error");
                    return;
                }else {
                    a[i] = Integer.parseInt(strings[i]);
                }
            }
            Arrays.sort(a);
            String s1 = "";
            for (int i = 3; i >= 0 ; i--) {
                s1 += a[i];
            }
            String s2 = "";
            for (int i = 0; i < 4; i++) {
                s2 += a[i];
            }
            System.out.println(Integer.parseInt(s1)+" "+Integer.parseInt(s2));
        }
    }
    
    
    7-37 古埃及探秘-金字塔

    金字塔是继99乘法表决之后的一个经典图形排列题

    题目要求:

    要求用户可以自主控制塔身的层数, 完成如下金字体样式;

    输入格式:
    4

    输出格式:

       *
      ***
     *****
    *******
    

    输入样例:
    在这里给出一组输入。例如:

    5
    8

    输出样例:
    在这里给出相应的输出。例如:

    
        *
       ***
      *****
     *******
    *********
    
    
           *
          ***
         *****
        *******
       *********
      ***********
     *************
    ***************
    
    
    import java.util.Scanner;
    
    public class Main {
        public static void main(String args[]) {
            Scanner scanner = new Scanner(System.in);
            int N = scanner.nextInt();
            String s = "*";
            String b = " ";
            String[] strings = new String[N];
            for (int i = 0; i < N; i++) {
                String s1 = "";
                for (int j = 0; j < N - i -1; j++) {
                    s1 += " ";
                }
                s1 += s;
                strings[i] = s1;
                System.out.println(s1);
                s+="**";
            }
        }
    }
    
    7-38 图片旋转

    二维图片由一个个像素点组成,目前灰度图像使用一个0-255之间的整数表示某个像素点的像素值。编程完成图片旋转控制程序。

    本题目要求读入2个整数m和n(<=20),作为图片的长宽尺寸。输入1个整数r,作为旋转角度(只能输入90 180 -90中的一个,90表示图形向左旋转90度,-90表示图形向右旋转90度)。然后按照行列输入图片像素值,

    输入格式:
    第一行:2个整数m和n(<=20)
    第二行:2个整数r(只能是90 180 -90中的一个,否则提示:angle data error
    第三行以后:输入m行n列的整数数据,必须在0-255之间,否则提示:matrix data error
    以上输入的都是整数,若有非整数的数据输入,统一提示:data type error

    输出格式:
    按要求旋转后的图片矩阵数据

    输入样例:
    在这里给出一组输入。例如:

    3 4
    90
    1 2 3 4
    5 6 7 8
    9 10 11 12

    输出样例:
    在这里给出相应的输出。例如:

    4 8 12
    3 7 11
    2 6 10
    1 5 9

    
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            int m,n;
            m = scanner.nextInt();
            n = scanner.nextInt();
            int op = scanner.nextInt();
            int[][] map = new int[m][n];
            if (op == 90 || op == -90 || op == 180){
                for (int i = 0; i < m; i++) {
                    for (int j = 0; j < n; j++) {
                        if (!scanner.hasNextInt()){
                            System.out.println("data type error");
                            return;
                        }
                        map[i][j] = scanner.nextInt();
                        if (map[i][j] < 0 || map[i][j] > 255){
                            System.out.println("matrix data error");
                            return;
                        }
                    }
    
                }
            }else {
                System.out.println("angle data error");
            }
            if (op == 90){
                for (int i = n-1; i >= 0; i--) {
                    for (int j = 0; j < m; j++) {
                        if (j == m-1){
                            System.out.print(map[j][i]);
                        }else {
                            System.out.print(map[j][i] + " ");
                        }
                    }
                    System.out.println();
                }
            }else if (op == -90){
                for (int i = 0; i < n; i++) {
                    for (int j = m-1; j >= 0; j--) {
                        if (j == 0){
                            System.out.print(map[j][i]);
                        }else {
                            System.out.print(map[j][i] + " ");
                        }
                    }
                    System.out.println();
                }
            }else if (op == 180){
                for (int i = m-1; i >= 0; i--) {
                    for (int j = n-1; j >= 0; j--) {
                        if (j == 0){
                            System.out.print(map[i][j]);
                        }else {
                            System.out.print(map[i][j] + " ");
                        }
                    }
                    System.out.println();
                }
            }
        }
    }
    
    
    7-39 IP地址转换

    一个IP地址是用四个字节(每个字节8个位)的二进制码组成。请将32位二进制码表示的IP地址转换为十进制格式表示的IP地址输出。

    输入格式:
    输入在一行中给出32位二进制字符串。

    输出格式:
    在一行中输出十进制格式的IP地址,其由4个十进制数组成(分别对应4个8位的二进制数),中间用“.”分隔开。

    输入样例:
    在这里给出一组输入。例如:

    11001100100101000001010101110010

    输出样例:
    在这里给出相应的输出。例如:

    204.148.21.114

    
    import java.util.Scanner;
    
    public class Main {
        public static void main(String args[]) {
            Scanner scanner = new Scanner(System.in);
            String s = scanner.nextLine();
            String s1 = s.substring(0,8);
            String s2 = s.substring(8,16);
            String s3 = s.substring(16,24);
            String s4 = s.substring(24,32);
    
            System.out.println(BinToTen(s1)+"."+BinToTen(s2)+"."+BinToTen(s3)+"."+BinToTen(s4));
    
        }
    
        private static int BinToTen(String s) {
            int sum = 0;
            for (int i = 7; i >= 0; i--) {
                if (s.charAt(i) == '1'){
                sum = (int) (sum + Math.pow(2,7-i));
                }
            }
            return sum;
        }
    
    }
    
    
    7-40 计算n位(3≤n≤7)水仙花数

    水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯特朗数(Armstrong number)。 水仙花数是指一个 n 位数(n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身(例如:1^3 + 5^3+ 3^3 = 153;14+64+34+44=1634)。要求编写程序,计算n位(3≤n≤7)水仙花数。

    输入格式:
    输入在一行中给出一个正整数n(3≤n≤7)。

    输出格式:
    按递增顺序输出所有n位水仙花数,每个数字占一行。

    输入样例:
    在这里给出一组输入。例如:

    3

    输出样例:
    在这里给出相应的输出。例如:

    153
    370
    371
    407

    20
    7-41 按正整数的相反数字顺序输出

    本题目要求输入一个正整数,按数字的相反顺序输出。

    输入格式:
    输入一个正整数。

    输出格式:
    按输入正整数的数字相反顺序输出一个数字。

    输入样例:

    5236

    输出样例:

    6325

    
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
    		int number,n=0; 
    //		System.out.println("请输入一个整数:");
    		Scanner scanner = new Scanner(System.in);
    		number = scanner.nextInt();
    //		System.out.println("逆向输出:");
    		while(number != 0){ 
    	    System.out.print(number%10); 
    		number=number/10; 
    		} 
    
    	}
            
    }
    
    
    7-42 求质数

    本题目要求输入一个大于等于2的正整数,求所有不大于该正整数的质数。

    输入格式:
    输入一个不小于2的正整数。

    输出格式:
    对输入的正整数,输出不大于该正整数的质数。

    输入样例:

    30

    输出样例:

    2 3 5 7 11 13 17 19 23 29

    
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            int N = scanner.nextInt();
            int m ;
            for(int n = 2; n <= N; n++)
            {
    	m = 2;
    	while(n % m != 0)
    	m++;
    	if(m == n)
    	System.out.print(n + " ");
            }
    }
    
    }
    
    
    7-43 统计比指定元素大的个数-hebust

    统计比指定元素大的个数

    输入格式:
    输入为2行,第一行为参照的整数元素,第二行为参与统计的整数元素,之间使用空格分割。

    输出格式:
    输出为比指定的参照元素大的元素个数。

    输入样例:
    在这里给出一组输入。例如:

    5
    2 3 6 7 3 4 9 8

    输出样例:
    在这里给出相应的输出。例如:

    4

    
    import java.util.Scanner;
    
    public class Main {
        public static void main(String args[]) {
            Scanner scanner = new Scanner(System.in);
            int max = scanner.nextInt();
            int count = 0 ;
            while (scanner.hasNextInt()){
                if (scanner.nextInt() > max){
                    count++;
                }
            }
            System.out.println(count);
        }
    }
    
    
    7-44 倒顺字母字符串-hebust

    根据输入n的大小(1=<n<=26),输出相对应的倒顺字符串。

    输入格式:
    输入格式:5

    输出格式:
    a b c d e d c b a

    输入样例:
    在这里给出一组输入。例如:

    5

    输出样例:
    在这里给出相应的输出。例如:

    a b c d e d c b a

    
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            int n = scanner.nextInt();
            if (n == 1){
                System.out.println('a');
                return;
            }
            for (int i = 0; i < n; i++) {
                System.out.print((char) ('a' + i) + " ");
            }
            for (int i = n-2; i >= 0; i--) {
                if (i == 0){
                    System.out.print((char) ('a' + i));
                }else {
                    System.out.print((char) ('a' + i) + " ");
                }
            }
        }
    }
    
    
    7-45 jmu-java-m02-循环求和

    输入一组数,将其中的奇数、偶数分别求和并输出

    输入格式:
    输入n,然后输入n个整数

    输出格式:
    奇数和=x, 偶数和=y
    其中x,y分别代表奇数和与偶数和。逗号(,)后面有一个空格。

    输入样例:

    10
    1 2 1 1 1 2 1 2 2 2

    输出样例:

    奇数和=5, 偶数和=10

    
    import java.util.Scanner;
    
    public class Main {
         public static void main(String args[]) {
            Scanner scanner = new Scanner(System.in);
            int n = scanner.nextInt();
            int ou = 0;
            int ji = 0;
            for (int i = 0; i < n; i++) {
                int a = scanner.nextInt();
                if (a % 2 == 0){
                    ou += a;
                }else {
                    ji +=a;
                }
            }
            System.out.println("奇数和="+ji + ", "+"偶数和="+ou);
        }
    }
    
    
    7-46 jmu-java-m02-不定循环拼接符合条件的字符串

    输入一组字符串,直到碰到end为之。将其中字符串长度是3的倍数的字符串使用空格拼接起来,并输出

    输入格式:
    输入一组以空格或者回车换行分隔的字符串,最后一个字符串为end。

    输出格式:
    将输入字符串中长度是3的倍数的字符串使用空格拼接起来。
    注意:行尾有一个空格。

    输入样例:

    a abc 123456 22 45jd 123456789 end

    输出样例:

    abc 123456 123456789

    import java.util.Scanner;
    
    public class Main {
         public static void main(String args[]) {
            Scanner scanner = new Scanner(System.in);
            String t = "";
            while (scanner.hasNext()){
                String s = scanner.next();
                if (s.equals("end")){
                    break;
                }
                if (s.length() % 3 == 0){
                    t+=s;
                    t += " ";
                }
            }
            System.out.println(t);
        }
    }
    
    

    未完待续…

    展开全文
  • 数据库面试

    千次阅读 多人点赞 2019-02-13 09:03:42
    1. SQL语言包括哪些类型? 数据定义DDL:Create Table,Alter Table,Drop Table, Create/Drop Index等 数据操纵DML:Select ,insert,update,delete, 数据控制DCL:grant,revoke 2. 内联接,外联接区别? 内连接是保证...

    数据库常见问题

    1. SQL语言包括哪些类型?
    数据定义DDL:Create Table,Alter Table,Drop Table, Create/Drop Index等
    数据操纵DML:Select ,insert,update,delete,
    数据控制DCL:grant,revoke

    2. 内联接,外联接区别?
    内连接是保证两个表中所有的行都要满足连接条件,而外连接则不然。
    在外连接中,某些不满条件的列也会显示出来,也就是说,只限制其中一个表的行,而不限制另一个表的行。分左连接、右连接、全连接(mysql不支持)三种。

    3. 什么是存储过程?用什么来调用?
    答:存储过程是一组为了完成特定功能的SQL 语句集,经编译创建并保存在数据库中,一次编译后永久有效。通过Call语句指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
    由于存储过程是经过预编译处理的,因此如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。存储过程不允许执行return语句,但是可以通过out参数返回多个值,存储过程一般是作为一个独立的部分来执行,存储过程是一个预编译的SQL语句。

    4.触发器的作用?
    答:触发器是一种特殊的存储过程,主要是通过事件来触发而被执行的。
    它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。触发器无法由用户直接调用,而是由于对表的【增/删/改】操作被动引发的。

    5. 索引的作用?和它的优点缺点是什么?
    答:索引就一种特殊的查询表,可以利用它加速对数据的检索。它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。索引可以是唯一的,创建索引允许指定单个列或者是多个列。
    缺点:它减慢了数据录入和修改的速度,同时索引也会占用一定的存储资源,因此我们在建索引的时候需要斟酌。

    6. 维护数据库的完整性和一致性,你喜欢用触发器还是自写业务逻辑?为什么?
    答:我是这样做的,尽可能使用约束,如主键,外键,非空字段等来约束(Check约束在mysql中可以使用但是对数据验证没有任何作用),这样做效率最高,也最方便。其次是使用触发器,这种方法可以保证,无论什么业务系统访问数据库都可以保证数据的完整新和一致性。触发器是针对每一行的;对增删改非常频繁的表上切记不要使用触发器,因为它会非常消耗资源。 最后考虑的是自写业务逻辑,但这样做麻烦,编程复杂,效率低下。

    7. 什么是事务?什么是锁?事务有哪些类型?

    1. 事务:就是被绑定在一起作为一个逻辑工作单元的SQL语句分组。如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。
    2. 锁:在所以的DBMS中,锁是实现事务的关键,锁可以保证事务的完整性和并发性。与现实生活中锁一样,它可以使某些数据的拥有者,在某段时间内不能使用某些数据或数据结构。当然锁还分级别的。
    • 扁平化事务:在扁平事务中,所有的操作都在同一层次,这也是平时使用最多的事务,主要限制是不能提交或回滚事务的某一部分,要么都成功要么都回滚。
      带保存点的扁平事务:解决了扁平事务的弊端,它允许事务在执行过程中回滚到较早的状态而不是全部回滚,通过在事务中插入保存点,当操作失败后可以选择回滚到最近的保存点处。
      链事务:可看做第二种事务的变种,它在事务提交时,会将必要的上下文隐式传递给下一个事务,当事务失败时,可以回滚到最近的事务,不过链事务只能回滚到最近的保存点,而带保存点的扁平化事务是可以回滚到任意一个保存点。
      嵌套事务:由顶层事务和子事务构成,类似于树的结构,一般顶层事务负责逻辑处理,子事务负责具体的工作,子事务可以提交,但真正的提交要等到顶层事务的提交,如果顶层事务回滚,那么所有的子事务都将回滚。
      分布式事务:在分布式环境中的扁平化事务。
      常用的分布式事务解决方案:
      (1) XA规范,是保证强一致性的刚性事务,实现方式有两段式提交(2PC)和三段式提交(3PC),2PC需要一个事务协调者来保证事务的参与者都完成了第一阶段的准备工作,如果协调者收到了所有的参与者都准备好的消息,就会通知所有的事务执行第二阶段的提交,一般场景下两段式提交已经能很好的解决分布式事务了。然而两阶段在即使只有一个进程发生故障时,也会导致整个系统存在较长时间的阻塞。三段式提交通过增加pre-commit阶段来减少两段式提交提到的系统阻塞时间,三段式提交很少在实际中使用,简单了解就行了。
      (2) TCC:是满足最终一致性的柔性事务方案。TCC采用补偿机制,核心的思想是对每一个操作都要注册对应的确认和补偿操作,分为三个阶段,try阶段主要对业务系统进行检测及资源预留,confirm阶段对业务系统进行确认提交,cancel阶段是对业务执行错误,执行回滚释放预留的资源。
      (3) 消息一致性方案:基本思路是将本地操作和发送消息封装在一个事务中,保证本地的操作和消息发送要么都成功,要么都失败。下游应用订阅消息,收到消息后执行对应的操作。
      (4)GTS:阿里云的全局事务服务,对应的开源版本是Fescar,Fescar基于两段式提交进行改良,剥离了分布式事务方案对数据库在协议支持上的要求,使用Fescar的前提是分支事务中涉及的资源必须支持ACID事务的关系型数据库,分支的提交和回滚都依赖于本地事务来保障。了解即可。

    8. 事务的基本要素?
    原子性Atomicity,指事务由原子的操作序列组成,所有操作要么全部成功,要么全部失败回滚。
    一致性Consistency,指事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处以一致性状态。比如在做多表操作时,多个表要么都是事务后新的值,要么都是事务前的旧值。
    隔离性Isolation,指多个用户并发访问数据库时,数据库为每个用户执行的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。事务的隔离级别在后文中介绍。
    持久性Durability,指一个事务一旦提交并执行成功,那么对数据库中数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

    9. 事务的并发问题?事务的隔离级别有哪些?

            事务的并发问题

      1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据

      2、不可重复读:在一个事务里面读取了两次某个数据,读出来的数据不一致,事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致。

      3、幻读:在一个事务里面的操作中发现了未被操作的数据,系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条新的学生成绩具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

      小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

    事务隔离级别脏读不可重复读幻读
    读未提交(read-uncommitted)
    读已提交(read-committed)
    可重复读(repeatable-read)
    串行化(serializable)

    10. 什么叫视图?游标是什么?
    答:视图是对一些原表选择部分列合并成的一个虚拟表格,具有和物理表相同的功能。可以对视图进行插入、更新、删除操作。对视图的修改会同步到具体数据表中。注意以下几种情况不能对视图进行插入、更新、删除的操作:

    1. 视图列中含有统计函数的情况
    2. 视图使用了GROUP BY /HAVING,DISTINCT,UNION语句的情况
    3. 视图定义时使用了子查询的情况
    4. 对视图的修改涉及到了多个基础表的数据

    游标:是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。

    11. 什么是主键?什么是外键?
    主键是表格里的(一个或多个)字段,只用来定义表格里的行;主键里的值总是唯一的。外键是一个用来建立两个表格之间关系的约束。这种关系一般都涉及一个表格里的主键字段与另外一个表格(尽管可能是同一个表格)里的一系列相连的字段。那么这些相连的字段就是外键。

    12.一个表有过多索引需要有什么样的性能考虑?
    时间和空间。对一个表格的索引越多,数据库引擎用来更新、插入或者删除数据所需要的时间就越多,因为在数据操控发生的时候索引也必须要维护。

    13.你可以用什么来确保表格里的字段只接受特定范围里的值?
    这个问题可以用多种方式来回答,但是只有一个答案是"好"答案。您希望听到的回答是Check限制(MYSQL有,但是没有强制约束,使用了也没用),它在数据库表格里被定义,用来限制输入该列的值。
    触发器也可以被用来限制数据库表格里的字段能够接受的值,但是这种办法要求触发器在表格里被定义,这可能会在某些情况下影响到性能。因此,微软建议使用Check限制而不是其他的方式来限制域的完整性。

    15. 使用索引查询一定能提高查询的性能吗?为什么
    通常,通过索引查询数据比全表扫描要快.但是我们也必须注意到它的代价.
    索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时,索引本身也会被修改. 这意味着每条记录的INSERT,DELETE,UPDATE将为此多付出磁盘I/O. 因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.使用索引查询不一定能提高查询性能,索引范围查询(INDEX RANGE SCAN)适用于两种情况:
        1.基于一个范围的检索,一般查询返回结果集小于表中记录数的30%宜采用;
        2.基于非唯一性索引的检索
    索引就是为了提高查询性能而存在的,如果在查询中索引没有提高性能,只能说是用错了索引,或者讲是场合不同

    16. 列举几种表连接方式,并写出SQL语句? 什么是相关子查询?关联查询和相关子查询的区别?
    内连接、外连接(左、右、全)、自连接(特殊的内连接)、交叉连接
    Or hash join/merge join/nest loop(cluster join)/index join 
    1)内连接:只连接匹配的行
    select A.c1,B.c2 from A join B on A.c3 = B.c3;
    2)左外连接:包含左边表的全部行(不管右边的表中是否存在与它们匹配的行)以及右边表中全部匹配的行,最终结果数大于等于左表行数
    select A.c1,B.c2 from A left join B on A.c3 = B.c3;
    3)右外连接:包含右边表的全部行(不管左边的表中是否存在与它们匹配的行)以及左边表中全部匹配的行,最终结果数大于等于右表结果数
    select A.c1,B.c2 from A right join B on A.c3 = B.c3;
    4)全外连接:包含左、右两个表的全部行,不管在另一边的表中是否存在与它们匹配的行
    select A.c1,B.c2 from A full join B on A.c3 = B.c3;
    5)交叉连接又称隐式的内联查询:生成笛卡尔积——它不使用任何匹配或者选取条件,而是直接将一个数据源中的每个行与另一个数据源的每个行一一匹配
    select A.c1,B.c2 from A,B;
    6)相关子查询是一种包含子查询的特殊类型的查询。查询里包含的子查询会用到外部查询的值。
        SELECT * FROM A WHERE A.id IN(SELECT B.aId FROM B  WHERE B.name=A.name)
     7)表关联可能有多条记录,子查询只有一条记录,如果需要唯一的列,最好走子查询

    交叉连接与内连接,查询的结果是一样的,但是效率不同,内连接查询的效率更高。

    17 如何优化数据库,如何提高数据库的性能?
    主要从:表结构、索引、sql语句考虑
    (1)表结构如:合适的字段类型、适当增加中间表、适当拆分表、增加冗余字段避免关联查询、尽量不要使用null
    (2)索引:不要盲目使用索引、要在数据差别大的列上使用索引、要在查询常用到的列上增加索引、根据具体查询情况选择合适的索引数据结构
    (3)查询时不要select *,注意查询是否使用了索引、减少关联查询、减少in和not in这些查询、针对不同的情况选择in或者exists查询
    (4)适当的使用存储过程

    18. 谈谈数据库设计的三范式
    第一范式的定义:所有的域都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项,则这个表属于第一范式(常记成1NF)。简而言之:"每一字段只存储一个值"。例如:职工号,姓名,电话号码组成一个表(一个人可能有一个办公室电话 和一个家里电话号码)
    第二范式的定义:如果一个表属于1NF,任何属性只依赖于关键字,则这个表属于第二范式(常记成2NF )。简而言之:必须先符合1NF的条件,且每一行都能被唯一的识别。将1NF转换成2NF的方法是添加主键。例如:学号,姓名,课程名,成绩
    第三范式的定义:如果一个表属于2NF,且不包含传递依赖性,则这个表是第三范式(常记成 3NF)。简而言之,第三范式就是属性不依赖于其它非主属性。例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。那么在员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。

    19. 设计数据库应注意那些问题
    首先应尽量满足三范式的要求,在一定程度上打破三范式的要求以提高数据库的性能。例如,我们创建某些表的时候,不仅会插入外键,还会插入相关的属性,这违反了第三范式,但这样做的好处,就是我们在业务查询的时候会减少很多关联查询,从而提高查询效率。

    20. 表与表之间的关联关系
    分为3种:一对一、一对多、多对多。

    21. 主键和外键的区别
    主键在本表中是唯一的、不可为空的,外键可以重复可以唯空;外键和另一张表的主键关联,不能创建对应表中不存在的外键。

    22. 游标的作用?如何知道游标已经到了最后?
    游标用于定位结果集的行,在mysql中用DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; 可以判断是否到了最后,通常此变量不等于0表示出错或到了最后。

    23. 事前触发和事后触发有何区别?语句级触发和行级触发有何区别?
    事前触发器运行于触发事件发生之前,如表的插入、更新、删除之前,而事后触发器运行于触发事件发生之后,如表的插入、更新、删除之后。通常事前触发器可以获取事件之前和新的字段值。语句级触发器可以在语句执行前或后执行,而行级触发在触发器所影响的每一行触发一次。

    24. 数据库设计的必要性及设计步骤
    好的数据库结构有利于:节省数据的存储空间,能够保证数据的完整性,方便进行数据库应用系统的开发
    设计不好的数据库结构将导致:数据冗余、存储空间浪费和内存空间浪费
    不管数据库的大小和复杂程度如何,可以用下列基本步骤来设计数据库:收集信息--标识对象--设计数据模型--标识每个对象--存储的信息类型–标识对象之间的关系

    25. 什么是数据模型?什么是规范化?
    数据模型是一种标识实体类型及其实体间联系的模型。典型的数据模型有网状模型、层次模型和关系模型。
    从关系数据库的表中,除去冗余数据的过程称为规范化。包括:精简数据库的结构,从表中删除冗余的列,标识所有依赖于其它数据的数据

    26. 说出一些数据库优化方面的经验?
    用PreparedStatement 一般来说比Statement性能高:一个sql 发给服务器去执行,涉及步骤:语法检查、语义分析, 编译,缓存
    “inert into user values(1,1,1)”-?二进制
    “inert into user values(2,2,2)”-?二进制
    “inert into user values(?,?,?)”-?二进制

    有外键约束会影响插入和删除性能,如果程序能够保证数据的完整性,那在设计数据库时就去掉外键。(比喻:就好比免检产品,就是为了提高效率,充分相信产品的制造商)
    (对于hibernate来说,就应该有一个变化:empleyee->Deptment对象,现在设计时就成了employee?deptid)

    看mysql帮助文档子查询章节的最后部分,例如,根据扫描的原理,下面的子查询语句要比第二条关联查询的效率高:
    1)select e.name,e.salary where e.managerid=(select id from employee where name='zxx');
    2)select e.name,e.salary,m.name,m.salary from employees e,employees m where
    e.managerid = m.id and m.name='zxx';

    表中允许适当冗余,譬如,主题帖的回复数量和最后回复时间等
    将姓名和密码单独从用户表中独立出来。这可以是非常好的一对一的案例哟!
    sql语句全部大写,特别是列名和表名都大写。特别是sql命令的缓存功能,更加需要统一大小写,sql语句?发给oracle服务器?语法检查和编译成为内部指令?缓存和执行指令。根据缓存的特点,不要拼凑条件,而是用?和PreparedStatment
    还有索引对查询性能的改进也是值得关注的。

    27. union和union all有什么不同?
    Union和Union All的区别之一在于对重复结果的处理。

    UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。
    而UNION ALL只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。
    从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用UNION ALL

    28. 几种索引类型?

    MySQL数据库几个基本的索引类型:普通索引、唯一索引、主键索引、组合索引、全文索引

    • 索引加快数据库的检索速度
    • 索引降低了插入、删除、修改等维护任务的速度
    • 唯一索引可以确保每一行数据的唯一性
    • 通过使用索引,可以在查询的过程中使用优化隐藏器,提高系统的性能
    • 索引需要占物理和数据空间 

    29. 数据库的乐观锁和悲观锁是什么?数据库表锁和行锁又是什么?

    数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性。
    乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段。

    • 悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作
    • 乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。

    在MySQL中 引擎为InnoDB的表支持表锁和行锁,而引擎为MyISAM的表只支持表锁

    • 表锁:开销小,加锁快;不会出现死锁;锁定力度大,发生锁冲突概率高,并发度最低
    • 行锁:开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高

    30. char和vachar区别?

    char是固定长度,处理速度比vachar快,费内存空间,当存储的值没有达到指定的范围时,会用空格替代。
    vachar是不固定长度,节约存储空间,存储的是真实的值。
    如:存储字符串'abc'
    使用char(10),表示存储的字符将占10个字节(包括7个空字符)
    使用varchar(10),则表示只占3个字节,10是最大值,当存储的字符小于10时,按照实际的长度存储。

    31. 什么是E-R图?

    E-R图也称实体-联系图(Entity Relationship Diagram),提供了表示实体类型、属性和联系的方法,用来描述现实世界的概念模型。

    ER图中有如下四个成分:

    矩形框:表示实体,在框中记入实体名。

    菱形框:表示联系,在框中记入联系名。

    椭圆形框:表示实体或联系的属性,将属性名记入框中。对于主属性名,则在其名称下划一下划线。

    连线:实体与属性之间;实体与联系之间;联系与属性之间用直线相连,并在直线上标注联系的类型。(对于一对一联系,要在两个实体连线方向各写1; 对于一对多联系,要在一的一方写1,多的一方写N;对于多对多关系,则要在两个实体连线方向各写N,M。

    E-R图的3个基本要素是实体、属性和联系

    32.MySQL两种引擎InnoDB和MyISAM的区别?

    1. MyISAM不支持事务,而InnoDB支持事务。
    2. MyISAM锁的是表锁(表锁又分读锁和写锁),而InnoDB锁为行级锁。
    3. MyISAM支持全文类型索引,而InnoDB不支持。
    4. MyISAM相对简单,所以在效率上要优于InnoDB,小型应用可以考虑使用MyISAM。
    5. MyISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去不少的麻烦。
    6. InnoDB表比MyISAM表更安全,可以在保证数据不会丢失的情况下,切换非事务表到事务表(alter table tablename type=innodb)。

    33. 如何解决MYSQL数据库中文乱码问题?

    建表和建库的时候指定字符集。

    SQL练习

    1.为管理业务培训信息,建立3个表:
    S(S#,SN,SD,SA)S#,SN,SD,SA分别代表学号,学员姓名,所属单位,学员年龄
    C(C#,CN)C#,CN分别代表课程编号,课程名称
    SC(S#,C#,G) S#,C#,G分别代表学号,所选的课程编号,学习成绩
    1)使用标准SQL嵌套语句查询选修课程名称为’税收基础’的学员学号和姓名?
    答案:select s# ,sn from s where S# in(select S# from c,sc where c.c#=sc.c# and cn=’税收基础’)
    2) 使用标准SQL嵌套语句查询选修课程编号为’C2’的学员姓名和所属单位?
    答:select sn,sd from s,sc where s.s#=sc.s# and sc.c#=’c2’
    3) 使用标准SQL嵌套语句查询不选修课程编号为’C5’的学员姓名和所属单位?
    答:select sn,sd from s where s# not in(select s# from sc where c#=’c5’)
    4)查询选修了课程的学员人数
    答:select 学员人数=count(distinct s#) from sc
    5) 查询选修课程超过5门的学员学号和所属单位?
    答:select sn,sd from s where s# in(select s# from sc group by s# having count(distinct c#)>5)

    2. 查询表A(id,name)中存在id重复三次以上的记录,查询语句请写出来?
    SELECT * FROM A GROUP BY id HAVING COUNT(id)>3

    3. 适用于MySql的分页查询语句?
    --limit函数,从数据库表中的m条记录开始,检索n条记录。
    select * from 表名 limit m,n;

    4. 适用于Oracle的分页查询语句?使用rownum关键字,oracle特有的分析函数和树查询非常有用可以看看。
    --从m条开始,检索n条记录。
    select * from (select rownum r,t1.* from 表名称 t1 where rownum < m + n) b where b.r >= m;

    5. 所有部门之间的比赛组合
    一个叫department的表,里面只有一个字段name,一共有4条纪录,分别是a,b,c,d,对应四个球对,现在四个球对进行比赛,用一条sql语句显示所有可能的比赛组合.

    答:SELECT t1.name AS whiteName,t2.name AS blackName FROM department t1 INNER JOIN department t2 ON t1.name>t2.name

    6.简单说一说drop、delete与truncate的区别

    SQL中的drop、delete、truncate都表示删除,但是三者有一些差别

    • delete和truncate只删除表的数据不删除表的结构
    • 速度,一般来说: drop> truncate >delete 
    • delete语句是dml,这个操作会放到rollback segement中,事务提交之后才生效;
      如果有相应的trigger,执行的时候将被触发. truncate,drop是ddl, 操作立即生效,原数据不放到rollback segment中,不能回滚. 操作不触发trigger. 

     7. 每个月份的发生额都比101科目多的科目
    请用SQL语句实现:从TestDB数据表中查询出所有月份的发生额都比101科目相应月份的发生额高的科目。
    请注意:TestDB中有很多科目,都有1-12月份的发生额。
    表名:TestDB
    字段:AccID:科目代码,Occmonth:发生额月份,DebitOccur:发生额。
    答案:
    SELECT DISTINCT t1.AccID FROM TestDB t1 INNER JOIN TestDB t2 ON t2.Occmonth=t1.OccMonth AND t1.DebitOccur>t2.DebitOccur AND t2.AccID=101

    8. 统计每年每月的信息
    year month amount
    1991 1 1.1
    1991 2 1.2
    1991 3 1.3
    1991 4 1.4
    1992 1 2.1
    1992 2 2.2
    1992 3 2.3
    1992 4 2.4
    查成这样一个结果
    year m1 m2 m3 m4
    1991 1.1 1.2 1.3 1.4
    1992 2.1 2.2 2.3 2.4
    答案一:
    select sales.year ,
    (select t.amount from sales t where t.month='1' and t.year= sales.year) '1',
    (select t.amount from sales t where t.month='1' and t.year= sales.year) '2',
    (select t.amount from sales t where t.month='1' and t.year= sales.year) '3',
    (select t.amount from sales t where t.month='1' and t.year= sales.year) as '4' 
    from sales group by year;
    答案二:

    SELECT sales.`year`,GROUP_CONCAT(CONCAT(sales.`year`,':',sales.amount))
     FROM sales GROUP BY sales.`year`

    9. 显示文章标题,发帖人、最后回复时间
    表:id,title,postuser,postdate,parentid
    准备sql语句:
    drop table if exists articles;
    create table articles(id int auto_increment primary key,title varchar(50), postuser varchar(10), postdate datetime,parentid int references articles(id));
    insert into articles values
    (null,'第一条','张三','1998-10-10 12:32:32',null),
    (null,'第二条','张三','1998-10-10 12:34:32',null),
    (null,'第一条回复1','李四','1998-10-10 12:35:32',1),
    (null,'第二条回复1','李四','1998-10-10 12:36:32',2),
    (null,'第一条回复2','王五','1998-10-10 12:37:32',1),
    (null,'第一条回复3','李四','1998-10-10 12:38:32',1),
    (null,'第二条回复2','李四','1998-10-10 12:39:32',2),
    (null,'第一条回复4','王五','1998-10-10 12:39:40',1);

    答案:
    select a.title,a.postuser,
    (select max(postdate) from articles where parentid=a.id) reply 
    from articles a where a.parentid is null;

    10. 查出比经理薪水还高的员工信息:
    Drop table if not exists employees;
    create table employees(id int primary key auto_increment,name varchar(50)
    ,salary int,managerid int references employees(id));
    insert into employees values (null,' lhm',10000,null), (null,' zxx',15000,1
    ),(null,'flx',9000,1),(null,'tg',10000,2),(null,'wzg',10000,3);

    Wzg大于flx,lhm大于zxx

    解题思路:
    根据sql语句的查询特点,是逐行进行运算,不可能两行同时参与运算。
    涉及了员工薪水和经理薪水,所有,一行记录要同时包含两个薪水,所有想到要把这个表自关联组合一下。
    首先要组合出一个包含有各个员工及该员工的经理信息的长记录,譬如,左半部分是员工,右半部分是经理。而迪卡尔积会组合出很多垃圾信息,先去除这些垃圾信息。

    select e.* from employees e,employees m where e.managerid=m.id and e.sala
    ry>m.salary;

    11. 求出小于45岁的各个老师所带的大于12岁的学生人数
    数据库中有3个表 teacher 表,student表,tea_stu关系表。 
    teacher 表 teaID name age 
    student 表 stuID name age 
    teacher_student表 teaID stuID 
    要求用一条sql查询出这样的结果 
    1)显示的字段要有老师name, age 每个老师所带的学生人数 
    SELECT t1.teaID,COUNT(*) FROM teacher_student t1 LEFT JOIN teacher t2 ON t1.teaID=t2.teaID GROUP BY t1.teaID
    2)只列出老师age为40以下,学生age为12以上的记录
    SELECT t1.teaID,t2.name AS teaName,t1.stuID,t3.name AS stuName FROM teacher_student t1 INNER JOIN teacher t2 ON t1.teaID=t2.teaID AND t2.age<40 INNER JOIN student t3 ON t1.stuID=t3.stuID AND t3.age>12


    12. 求出发帖最多的人:
    select authorid,count(*) total from articles group by authorid ORDER BY total DESC LIMIT 1

    13. 一个用户表中有一个积分字段,假如数据库中有100多万个用户,若要在每年第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决?
    alter table drop column score;
    alter table add colunm score int;
    可能会很快,但是需要试验,试验不能拿真实的环境来操刀,并且要注意,
    这样的操作时无法回滚的,在我的印象中,只有inert update delete等DML语句才能回滚,
    对于create table,drop table ,alter table等DDL语句是不能回滚。

    解决方案一,update user set score=0; 
    解决方案二,假设上面的代码要执行好长时间,超出我们的容忍范围,那我就
    alter table user drop column score;
    alter table user add column score int。

    14. xxx公司的sql面试
    Table EMPLOYEES Structure:
    EMPLOYEE_ID NUMBER Primary Key,
    FIRST_NAME VARCHAR2(25),
    LAST_NAME VARCHAR2(25),
    Salary number(8,2),
    HiredDate DATE,
    Departmentid number(2)
    Table Departments Structure:
    Departmentid number(2) Primary Key,
    DepartmentName VARCHAR2(25).

    1)基于上述EMPLOYEES表写出查询:写出雇用日期在今年的,或者工资在[1000,2000]之间的,或者员工姓名(last_name)以’Obama’打头的所有员工,列出这些员工的全部个人信息。
    select * from employees 
    where Year(hiredDate) = Year(date()) 
    or (salary between 1000 and 200)
    or left(last_name,3)='abc';

    2) 基于上述EMPLOYEES表写出查询:查出部门平均工资大于1800元的部门的所有员工,列出这些员工的全部个人信息。
    mysql> select id,name,salary,deptid did from employee1 where (select avg(salary)
    from employee1 where deptid = did) > 1800;

    3) 基于上述EMPLOYEES表写出查询:查出个人工资高于其所在部门平均工资的员工,列出这些员工的全部个人信息及该员工工资高出部门平均工资百分比。
    select employee1.*,(employee1.salary-t.avgSalary)*100/employee1.salary 
    from employee1,
    (select deptid,avg(salary) avgSalary from employee1 group by deptid) as t
    where employee1.deptid = t.deptid and employee1.salary>t.avgSalary;

    二、数据库选择题:
    1. 下面叙述正确的是___C___。 
    A、算法的执行效率与数据的存储结构无关 
    B、算法的空间复杂度是指算法程序中指令(或语句)的条数 
    C、算法的有穷性是指算法必须能在执行有限个步骤之后终止D、以上三种描述都不对

    2. 以下数据结构中不属于线性数据结构的是__C____。
    A、队列 B、线性表 C、二叉树 D、栈

    3. 在一棵二叉树上第5层的结点数最多是__B____。
    A、8 B、16 C、32 D、15

    4. 在结构化方法中,用数据流程图(DFD)作为描述工具的软件开发阶段是__B__。 
    A、可行性分析 B、需求分析 C、详细设计 D、程序编码

    5. 在软件开发中,下面任务不属于设计阶段的是___D___。 
    A、数据结构设计 B、给出系统模块结构 C、定义模块算法 D、定义需求并建立系统模型

    6. 数据库系统的核心是___B___。 
    A、数据模型 B、数据库管理系统 C、软件工具 D、数据库

    7. 下列叙述中正确的是___C___。 
    A、数据库是一个独立的系统,不需要操作系统的支持 
    B、数据库设计是指设计数据库管理系统 
    C、数据库技术的根本目标是要解决数据共享的问题 
    D、数据库系统中,数据的物理结构必须与逻辑结构一致

    8. SQL语句中修改表结构的命令是__C____。 
    A、MODIFY TABLE B、MODIFY STRUCTURE C、ALTER TABLE D、ALTER STRUCTURE

    9. 如果要创建一个数据组分组报表,第一个分组表达式是"部门",第二个分组表达式是"性别",第三个分组表达式是"基本工资",当前索引的索引表达式应当是___B___。 
    A、部门+性别+基本工资 B、部门+性别+STR(基本工资) 
    C、STR(基本工资)+性别+部门 D、性别+部门+STR(基本工资) 

    10. 数据库DB、数据库系统DBS、数据库管理系统DBMS三者之间的关系是___A___。 
    A、DBS包括DB和DBMS B、DBMS包括DB和DBS 
    C、DB包括DBS和DBMS D、DBS就是DB,也就是DBMS

    11. 要控制两个表中数据的完整性和一致性可以设置"参照完整性",要求这两个表__A___。 
    A、是同一个数据库中的两个表 B、不同数据库中的两个表 
    C、两个自由表 D、一个是数据库表另一个是自由表

    12. 在关系模型中,实现"关系中不允许出现相同的元组"的约束是通过___B___。 
    A、候选键 B、主键 C、外键 D、超键

    13. 只有满足联接条件的记录才包含在查询结果中,这种联接为___C___。 
    A、左联接 B、右联接 C、内部联接 D、完全联接

    14. 索引字段值不唯一,应该选择的索引类型为___B___。 
    A、主索引 B、普通索引 C、候选索引 D、唯一索引

    15. 从数据库中删除表的命令是__A____。 
    A、DROP TABLE B、ALTER TABLE C、DELETE TABLE D、USE

    16. DELETE FROM S WHERE 年龄>60语句的功能是__B____。 
    A、从S表中彻底删除年龄大于60岁的记录 B、S表中年龄大于60岁的记录被加上删除标记 
    C、删除S表 D、删除S表的年龄列

    17. SELECT-SQL语句是__B____。 
    A、选择工作区语句 B、数据查询语句 C、选择标准语句 D、数据修改语句

    18. SQL语言是___C___语言。
    A、层次数据库 B、网络数据库 C、关系数据库 D、非数据库

    19. 在SQL中,删除视图用___C___。 
    A、DROP SCHEMA命令 B、CREATE TABLE命令 C、DROP VIEW命令 D、DROP INDEX命令

    20. 在命令窗口执行SQL命令时,若命令要占用多行,续行符是__D____。 
    A、冒号(:) B、分号(;) C、逗号(,) D、连字符(-)

    21. 设有图书管理数据库: 
    图书(总编号C(6),分类号C(8),书名C(16),作者C(6),出版单位C(20),单价N(6,2)) 
    读者(借书证号C(4),单位C(8),姓名C(6),性别C(2),职称C(6),地址C(20)) 
    借阅(借书证号C(4),总编号C(6),借书日期D(8)) 
    对于图书管理数据库,查询0001号借书证的读者姓名和所借图书的书名。 
    SQL语句正确的是___A___。 
    SELECT 姓名,书名 FROM 借阅,图书,读者 WHERE; 
    借阅.借书证号="0001" AND; 
    ______ 
    ______ 
    A、图书.总编号=借阅.总编号 AND; 
    读者.借书证号=借阅.借书证号 
    B、图书.分类号=借阅.分类号 AND; 
    读者.借书证号=借阅.借书证号 
    C、读者.总编号=借阅.总编号 AND; 
    读者.借书证号=借阅.借书证号 
    D、图书.总编号=借阅.总编号 AND; 
    读者.书名=借阅.书名

    22. 设有图书管理数据库: 
    图书(总编号C(6),分类号C(8),书名C(16),作者C(6),出版单位C(20),单价N(6,2)) 
    读者(借书证号C(4),单位C(8),姓名C(6),性别C(2),职称C(6),地址C(20)) 
    借阅(借书证号C(4),总编号C(6),借书日期D(8)) 
    对于图书管理数据库,分别求出各个单位当前借阅图书的读者人次。下面的SQL语句正确的是___A___。 
    SELECT 单位,______ FROM 借阅,读者 WHERE; 
    借阅.借书证号=读者.借书证号 ______ 
    A、COUNT(借阅.借书证号) GROUP BY 单位 B、SUM(借阅.借书证号) GROUP BY 单位 
    C、COUNT(借阅.借书证号) ORDER BY 单位 D、COUNT(借阅.借书证号) HAVING 单位

    23. 设有图书管理数据库: 
    图书(总编号C(6),分类号C(8),书名C(16),作者C(6),出版单位C(20),单价N(6,2)) 
    读者(借书证号C(4),单位C(8),姓名C(6),性别C(2),职称C(6),地址C(20)) 
    借阅(借书证号C(4),总编号C(6),借书日期D(8)) 
    对于图书管理数据库,检索借阅了《现代网络技术基础》一书的借书证号。下面SQL语句正确的是___B___。 
    SELECT 借书证号 FROM 借阅 WHERE 总编号=; 
    ______ 
    A、(SELECT 借书证号 FROM 图书 WHERE 书名="现代网络技术基础") 
    B、(SELECT 总编号 FROM 图书 WHERE 书名="现代网络技术基础") 
    C、(SELECT 借书证号 FROM 借阅 WHERE 书名="现代网络技术基础") 
    D、(SELECT 总编号 FROM 借阅 WHERE 书名="现代网络技术基础")


    三、Oracle面试题
    1. 解释冷备份和热备份的不同点以及各自的优点 
    解答:热备份针对归档模式的数据库,在数据库仍旧处于工作状态时进行备份。而冷备份指在数据库关闭后,进行备份,适用于所有模式的数据库。热备份的优点在于当备份时,数据库仍旧可以被使用并且可以将数据库恢复到任意一个时间点。冷备份的优点在于它的备份和恢复操作相当简单,并且由于冷备份的数据库可以工作在非归档模式下,数据库性能会比归档模式稍好。(因为不必将archive log写入硬盘)
    2. 你必须利用备份恢复数据库,但是你没有控制文件,该如何解决问题呢?
    解答:重建控制文件,用带backup control file 子句的recover 命令恢复数据库。
    3. 如何转换init.ora到spfile?
    解答:使用create spfile from pfile 命令.
    4. 解释data block , extent 和 segment的区别(这里建议用英文术语)
    解答:data block是数据库中最小的逻辑存储单元。当数据库的对象需要更多的物理存储空间时,连续的data block就组成了extent . 一个数据库对象
    拥有的所有extents被称为该对象的segment.
    5. 给出两个检查表结构的方法
    解答:
    1)DESCRIBE命令
    2)DBMS_METADATA.GET_DDL 包
    6. 怎样查看数据库引擎的报错
    解答:alert log.

    7. 比较truncate和delete 命令
    解答:两者都可以用来删除表中所有的记录。区别在于:truncate是DDL操作,它移动HWK,不需要 rollback segment .而Delete是DML操作, 需要rollback segment 且花费较长时间.

    8. 使用索引的理由
    解答:快速访问表中的data block

    9. 给出在STAR SCHEMA中的两种表及它们分别含有的数据
    解答:Fact tables 和dimension tables. fact table 包含大量的主要的信息而 dimension tables 存放对fact table 某些属性描述的信息

    10. FACT Table上需要建立何种索引?
    解答:位图索引 (bitmap index)

    11. 给出两种相关约束?
    解答:主键和外键

    12. 如何在不影响子表的前提下,重建一个母表
    解答:子表的外键强制实效,重建母表,激活外键

    13. 解释归档和非归档模式之间的不同和它们各自的优缺点
    解答:归档模式是指你可以备份所有的数据库 transactions并恢复到任意一个时间点。非归档模式则相反,不能恢复到任意一个时间点。但是非归档模式可以带来数据库性能上的少许提高.

    14. 如何建立一个备份控制文件?
    解答:Alter database backup control file to trace.

    15. 给出数据库正常启动所经历的几种状态 ?
    解答:
      STARTUP NOMOUNT – 数据库实例启动
      STARTUP MOUNT - 数据库装载
      STARTUP OPEN – 数据库打开

    16. 哪个column可以用来区别V$视图和GV$视图?
    解答: INST_ID 指明集群环境中具体的 某个instance 。

    17. 如何生成explain plan?
    解答:运行utlxplan.sql. 建立plan 表
    针对特定SQL语句,使用 explain plan set statement_id = 'tst1' into plan_table
    运行utlxplp.sql 或 utlxpls.sql察看explain plan

    18. 如何增加buffer cache的命中率?
    解答:在数据库较繁忙时,适用buffer cache advisory 工具,查询v$db_cache_advice . 如果有必要更改,可以使用 alter system set db_cache_size 命令

    19. ORA-01555的应对方法?
    解答:具体的出错信息是snapshot too old within rollback seg , 通常可以通过
    增大rollback seg来解决问题。当然也需要察看一下具体造成错误的SQL文本

    20. 解释$ORACLE_HOME和$ORACLE_BASE的区别?
    解答:ORACLE_BASE是oracle的根目录,ORACLE_HOME是oracle产品的目录。

    21. 如何判断数据库的时区?
    解答:SELECT DBTIMEZONE FROM DUAL;

    22. 解释GLOBAL_NAMES设为TRUE的用途
    解答:GLOBAL_NAMES指明联接数据库的方式。如果这个参数设置为TRUE,在建立数据库链接时就必须用相同的名字连结远程数据库

    23。如何加密PL/SQL程序?
    解答:WRAP

    24. 解释FUNCTION,PROCEDURE和PACKAGE区别
    解答:function 和procedure是PL/SQL代码的集合,通常为了完成一个任务。procedure 不需要返回任何值而function将返回一个值在另一
    方面,Package是为了完成一个商业功能的一组function和proceudre的集合

    25. 解释TABLE Function的用途
    解答:TABLE Function是通过PL/SQL逻辑返回一组纪录,用于普通的表/视图。他们也用于pipeline和ETL过程。

    26. 举出3种可以收集three advisory statistics
    解答:Buffer Cache Advice, Segment Level Statistics, Timed Statistics

    27. Audit trace 存放在哪个oracle目录结构中?
    解答:unix $ORACLE_HOME/rdbms/audit Windows the event viewer

    28. 解释materialized views的作用
    解答:Materialized views 用于减少那些汇总,集合和分组的信息的集合数量。它们通常适合于数据仓库和DSS系统。

    29. 当用户进程出错,哪个后台进程负责清理它
    解答: PMON

    30. 哪个后台进程刷新materialized views?
    解答:The Job Queue Processes.

    31. 如何判断哪个session正在连结以及它们等待的资源?
    解答:V$SESSION / V$SESSION_WAIT

    32. 描述什么是 redo logs
    解答:Redo Logs 是用于存放数据库数据改动状况的物理和逻辑结构。可以用来修复数据库.

    33. 如何进行强制LOG SWITCH?
    解答:ALTER SYSTEM SWITCH LOGFILE;

    34. 举出两个判断DDL改动的方法?
    解答:你可以使用 Logminer 或 Streams

    35. Coalescing做了什么?
    解答:Coalescing针对于字典管理的tablespace进行碎片整理,将临近的小extents合并成单个的大extent.

    36. TEMPORARY tablespace和PERMANENT tablespace 的区别是?
    解答:A temporary tablespace 用于临时对象例如排序结构而 permanent tablespaces用来存储那些'真实'的对象(例如表,回滚段等)

    37. 创建数据库时自动建立的tablespace名称?
    解答:SYSTEM tablespace.

    38. 创建用户时,需要赋予新用户什么权限才能使它联上数据库。
    解答:CONNECT

    39. 如何在tablespace里增加数据文件?
    解答:ALTER TABLESPACE ADD DATAFILE SIZE

    40. 如何变动数据文件的大小?
    解答:ALTER DATABASE DATAFILE RESIZE ;

    41. 哪个VIEW用来检查数据文件的大小?
    解答: DBA_DATA_FILES

    42. 哪个VIEW用来判断tablespace的剩余空间
    解答:DBA_FREE_SPACE

    43. 如何判断谁往表里增加了一条纪录?
    解答:auditing

    44. 如何重构索引?
    解答: ALTER INDEX REBUILD;

    45. 解释什么是Partitioning(分区)以及它的优点。
    解答:Partition将大表和索引分割成更小,易于管理的分区。

    46. 你刚刚编译了一个PL/SQL Package但是有错误报道,如何显示出错信息?
    解答:SHOW ERRORS

    47. 如何搜集表的各种状态数据?
    解答: ANALYZE
    The ANALYZE command.

    48. 如何启动SESSION级别的TRACE
    解答: DBMS_SESSION.SET_SQL_TRACE
    ALTER SESSION SET SQL_TRACE = TRUE;

    49. IMPORT和SQL*LOADER 这2个工具的不同点
    解答:这两个ORACLE工具都是用来将数据导入数据库的。
    区别是:IMPORT工具只能处理由另一个ORACLE工具EXPORT生成
    的数据。而SQL*LOADER可以导入不同的ASCII格式的数据源

    50。用于网络连接的2个文件?
    解答: TNSNAMES.ORA and SQLNET.ORA

    展开全文
  • 测试开发笔记

    万次阅读 多人点赞 2019-11-14 17:11:58
    测试开发笔记 第一章 测试基础 7 什么是软件测试: 7 ★软件测试的目的、意义:(怎么做好软件测试) 7 ...4.测试过程(干什么,怎么干) 12 5.各阶段输入、输出标准以及入口、出口准则:(测试阶段过程要素) 1...

    测试开发笔记

    第一章 测试基础
    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、判定表
    流程分析

    展开全文
  • 2020年12月程序员工资统计,平均14222元

    万次阅读 多人点赞 2020-12-06 22:28:25
    2020年12月全国程序员平均工资14327元,工资中位数12500元,其中96%的人的工资介于3000元85000元。 从图上看,工资是真的降了,吓得我瑟瑟发抖。希望明年涨回来。 城市 排名 city 平均工资 最低工资 中位数 ...

    2020年12月全国招收程序员394699人。2020年12月全国程序员平均工资14222元,工资中位数12500元,其中96%的人的工资介于3250元到62500元。

    在这里插入图片描述
    从图上看,工资是真的降了,吓得我瑟瑟发抖。希望明年涨回来。

    城市

    排名city平均工资最低工资中位数最高工资招聘人数百分比
    1北京1781850001550045000324759.14%
    2上海16932525015500416666411318.04%
    3深圳16694525015000450005571415.68%
    4杭州1554552501400040000189765.34%
    5广州13634500012500375003783910.65%
    6南京1362352501250033333193665.45%
    7苏州1288250001250030000115903.26%
    8东莞127945000125003000044161.24%
    9成都1220637501150035000189745.34%
    10厦门121605000115002750022580.64%
    11合肥120365000110003000079512.24%
    12武汉1203545001150030000209465.89%
    13大连118504500105003500064721.82%
    14长沙118495000115003000071342.01%
    15西安1179540001150030000108893.06%
    16宁波116184750105002858839201.10%
    17天津110614197105002958024680.69%
    18福州110244285104163000038561.08%
    19重庆107903750100003000053831.51%
    20青岛9783450090002750043431.22%
    21济南9777500090002500035340.99%
    22长春915737508000273808240.23%
    23昆明8654375085002106625950.73%
    24郑州8648375085002500052251.47%
    25沈阳8418375075002650028610.80%
    26哈尔滨7070375052502807012860.36%

    北京,上海,杭州,深圳的工资收入,仍然领先于其他地方。广州的工资收入,已经稳稳的落到了南京后面,看来广州的一线城市地位被杭州取代已经指日可待了。

    职能

    职能中位数最低工资最高工资
    软件工程师11500475037500
    高级软件工程师15000600037500
    Web前端开发12500500030000
    算法工程师17500600045000
    系统分析员11500375031050
    嵌入式软件开发12500525030000
    系统架构设计师22500700060000
    移动开发工程师12500375045000
    游戏开发工程师13750433540000
    大数据开发工程师14500500040000
    机器视觉工程师12500525033333
    Java开发工程师12500525030000
    脚本开发工程师9000375041666
    Android开发工程师13500550030000
    PHP开发工程师11500500027500
    HTML5开发工程师12500375029166
    iOS开发工程师12500563532500
    .NET开发工程师11500475023500
    C开发工程师15000525035000
    数据分析经理主管11500495435000
    网站架构设计师8500375040650
    Python开发工程师12500500030000
    爬虫开发工程师12500525028650
    数据分析师9000375027500
    Cocos2d-x开发工程师15000525030250
    数据建模工程师12500450040000
    图像处理工程师17500426040000
    Go开发工程师17500672041119
    ETL开发工程师12500521027767
    图像识别工程师14583375045800
    小程序开发工程师10000375035000
    Unity3d开发工程师14583525040000
    图像算法工程师17500525045000
    机器学习工程师15000375058333
    数据治理工程师12500500036600
    数据7000317837500
    BI工程师12500455536950
    游戏服务端开发工程师17500525042900
    数据采集工程师7000350029616
    Hadoop工程师17500700040000
    数据仓库工程师12750435035750
    自然语言处理(NLP)20000504560000
    语音识别工程师17500438046200
    Ruby开发工程师12500471024833
    游戏客户端开发工程师16000525045000
    人工智能12500375063666
    深度学习工程师20000525062500
    前端开发11500375033890
    搜索算法工程师22500455057000
    区块链开发17500364540000
    推荐算法工程师22500525058000

    敏捷教练,才是最赚钱的。最差的敏捷教练,他的收入也远远高于别人的中位数。什么python,java,都是扯淡。

    编程语言

    rankpl_平均工资工资中位数最低工资(2.5%)最高工资(97.5%)招聘人数百分比
    1haskell2516722500200003300030.0%
    2rust19788185005250450006650.1%
    3julia1885320416900040000340.0%
    4scala187401750065004300634190.6%
    5go1739515000525045000340616.3%
    6lua170481600049004154939420.7%
    7python1702415000500045000435398.0%
    8perl167301550051103756726840.5%
    9matlab167211500052494154879961.5%
    10swift165831500059594028830850.6%
    11kotlin161721500049363854718720.3%
    12ruby157361250052503947712300.2%
    13r150371350045004000053061.0%
    14cpp149051250052504000014414226.5%
    15typescript143171250052503700542180.8%
    16java141021250052503750015156027.9%
    17php1362112500500040000156202.9%
    18objective_c13478125005212300001510.0%
    19javascript12591125005000300007256213.3%
    20c_sharp1242311500500035000460508.5%
    21visual_basic1236111900525022500450.0%
    22delphi10939100004713262538740.2%
    23vba1019690003750323427870.1%

    别再整天java了,java不赚钱。

    展开全文
  • C#基础教程-c#实例教程,适合初学者

    万次阅读 多人点赞 2016-08-22 11:13:24
    Console.WriteLine("姓名:{0},年龄:{1}",name,age)的意义是将第二个参数变量name变为字符串填{0}位置,将第三个参数变量age变为字符串填{1}位置,将第一个参数表示的字符串在显示器上输出。 大家注意,这里我们...
  • 压力测试工具

    万次阅读 多人点赞 2018-12-20 16:06:28
    目录 1 性能测试... 2 2 压力测试(Stress Test)... 2 2.1 网站测试... 2 2.2 系统测试要求... 3 3 测试工具... 3 3.1 Webbench. 4 3.1.1 Ubuntu 下载安装... 5 3.1.2 ...
  • 2021年1月程序员工资统计,平均14915元

    万次阅读 多人点赞 2021-01-03 22:30:44
    2021年1月全国程序员平均工资14580元,工资中位数12500元,其中96%的人的工资介于3500元85000元。 一年工资变化: 可见,工资一直再涨,看到这个,我就放心了。今年我也涨了50%,多亏了我经常在CSDN发文章,跳槽...
  • linux命令大全

    千次阅读 2015-12-24 08:44:14
    Linux命令大全完整版 ...1. linux系统管理命令... 1 adduser1 chfn(change finger information)1 chsh(change shell)1 date. 2 exit3 finger4 free. 5 fwhois5 gitps(gnu interactive tools proce
  • 2020年9程序员工资统计,平均14469元

    万次阅读 多人点赞 2020-09-09 23:53:57
    2020年9全国程序员平均工资14469元,工资中位数12500元,其中95%的人的工资介于5250元35000元。 主要城市工资 排名 city 平均工资 最低工资 中位数 最高工资 招聘人数 百分比 1 北京 19346 7000 17500 ...
  • 2020年5程序员工资统计,平均14542元

    万次阅读 多人点赞 2020-05-01 13:09:32
    2020年5全国程序员平均工资14542元,工资中位数12500 元,其中95%的人的工资介于5250元35000元。 一线城市工资 2020年5北京招收软件工程师24478人。2019年5北京软件工程师平均工资19273元,工资中位数...
  • 前段时间,有几个HR朋友问我: 算法工程师的日常工作...1、 软件工程师、算法工程师、大数据工程师区别 2、 一个算法工程师的日常 3、 算法工程师有哪些类别、涉及的技术、作用领域 4、 算法工程师的段位怎么分...
  • Matlab时间序列分析

    万次阅读 多人点赞 2018-11-13 18:53:46
    % 累加从t=1到n-h for t = 1:n-h omega = omega+time_vector(t)*time_vector(t+h); end unbiased_autocorr(h+1) = omega/(n-h); biased_autocorr(h+1) = omega/n; end % 自相关函数转换为自相关系数 unbiased_...
  • 2021年6程序员工资统计,平均15052元

    万次阅读 多人点赞 2021-06-03 23:21:08
    2021年6全国程序员平均工资15052元,工资中位数13000元,其中96%的人的工资介于1750元150000元。 这两年虽然平均工资涨了不少,但是工资中位数没怎么变。这说明什么呢? 主要城市 排名 city 平均工资 最低...
  • 2021年7全国程序员平均工资15302元,工资中位数14000元,其中96%的人的工资介于1750元150000元。 主要城市 排名 city 平均工资 最低工资 中位数 最高工资 招聘人数 百分比 1 北京 18681.9 6000 17500 ...
  • 数据分析面试题

    万次阅读 多人点赞 2018-12-14 12:46:24
    1.一家超市的顾客数据,将数据可视化并分析销售额和年龄、收入的关系并给出营销建议 年龄 收入 销售额 34 350 123 40 450 114 37 169 135 30 189 139 44 183 117 36 80 121 32 166 133 26 120...
  • 2021年4全国程序员平均工资14596元,工资中位数12500元,其中96%的人的工资介于2500元65000元。 城市 排名 city 平均工资 最低工资 中位数 最高工资 招聘人数 百分比 1 北京 18166 5250 16000 45000 ...
  • 2021年2程序员工资统计,平均15144元

    万次阅读 多人点赞 2021-02-06 19:35:42
    2021年2程序员平均工资15144元,工资中位数12500元,其中95%的人的工资介于5250元37500元。 一年工资变化: 这里出现了神奇的一幕,去年也是这个时候工资大涨。这是不是有什么规律呢?这个数据应该怎么解读?请...
  • 2021年5全国程序员平均工资14926元,工资中位数13000元,其中96%的人的工资介于1750元75000元。 城市 排名 city 平均工资 最低工资 中位数 最高工资 招聘人数 百分比 1 北京 18094.3 5250 16500 45000 ...
  • 'logout' 'dd','2020-04-28 21:15:00','login' 二、统计vpn每个小时的在线人数 先查出每个用户的每次的登录、退出时间并放在一条数据上 select name, case when stat='logout' then logout_ts else login_ts end as ...
  • 2019年12月中国编程语言排行榜

    万次阅读 多人点赞 2019-12-07 19:22:04
    2019年12月4日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.60% 2 c/c++ 16.58% 3 c# 12.59% 4...
  • 2021年3程序员工资统计,平均15189元,又涨了

    万次阅读 多人点赞 2021-03-02 08:24:40
    2021年3全国程序员平均工资15189元,工资中位数12500元,其中95%的人的工资介于5250元37500元。 工资K线图: 这个涨了一点点,一点点也是涨呀。 程序员的工资虽然不高,但是涨幅还是超过了大盘的。 分布: ...
  • 2020年11程序员工资统计,平均14327元

    万次阅读 多人点赞 2020-11-07 12:33:37
    2020年11全国程序员平均工资14327元,工资中位数12500元,其中96%的人的工资介于3000元85000元。 工资好像又降低了,吓得我瑟瑟发抖。《权力的游戏》里面的一句话又回荡在我的耳边:winter is coming. 城市 ...
  • 2019年全国一二线城市程序员工资大调查

    万次阅读 多人点赞 2019-04-20 20:44:33
    我在4月13日之间,抓取了某招聘网站的软件和互联网类招聘数据40万条,其中通过程序判断为程序员的14万条。地域方面,我选择了24个主要城市。 这里的程序员包括普通程序员,架构师和算法工程师。美工等不计算在内...
  • 50道MYSQL练习题及答案

    千次阅读 2019-10-15 00:57:10
    50道MYSQL练习题目前题目好像有好几个题目版本,本版本前的前18题相较于后半部分难度明显会有提升,部分答案并非最优选择,仅供参考。同时部分答案涉及GROUP BY若提示sql_mode=only_full_group_by的错误,...1.学...
  • 2020年3全国程序员工资统计,平均工资13820元

    万次阅读 多人点赞 2020-03-03 23:24:18
    2020年3,中国大陆程序员平均工资13820元,比上个增加。具体趋势如图: 各主要程序员城市工资变化 工资排名 city 平均工资 最低工资 中位数 最高工资 招聘人数 1 北京 18543 3750 15500 45000 18386 ...
  • C语言程序设计精髓习题总汇(上)

    万次阅读 多人点赞 2019-12-19 10:10:32
    目录 认识变量和常量 1.1 hello world! 1.2 在屏幕上输出多行信息 1.3 计算半圆弧长以及半圆的面积 1.4 计算长方形体积 计算 2.1 输出逆序数 2.2 计算总分和平均分 ...3.3 计算...
  • 对于中国互联网行业而言,2018是复杂也充实的一年。一方面,“五环外人民”...(美通社,2019年1月17日北京) 消息来源:APUS 编辑:小星、佳佳 来源:美通社  www.prnasia.com / www.prnewswire.com
  • +------+-----+-------+ 111 rows in set (19.70 sec) 思路 需要计算各部门的平均小时工资,就必须计算各部门的总工作时长和总工资。工作时长按照个人/项目/时长的样式存储在works_on表中,工资以个人/部门编号/...
  • 统一回复,我8月1日爬的数据,当然是8的程序员工资了。总不能说是7的吧。 平均工资 ...2020年8全国程序员平均工资14357元,工资中位数12500元,其中95%的人的工资介于5250元35000元。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,167
精华内容 8,066
关键字:

如何计算1到12月平均人数