软件测试实验:静态测试

news2024/10/5 9:31:05

目录

前言

一、实验目的

二、实验内容

三、实验步骤

四、实验过程

1、学生宿舍管理系统代码

2、汇总表

3、C语言编码规范

总结


 

前言

软件测试是软件开发过程中不可或缺的一个环节,它可以保证软件的质量和功能,提高用户的满意度和信任度。软件测试分为静态测试和动态测试,本文将介绍静态测试的概念和方法。

静态测试是指在不运行软件的情况下,对软件的需求、设计、代码等进行分析、检查、评审的过程,目的是发现软件开发过程中的缺陷和错误,从而提高软件的可靠性和可维护性。静态测试可以在软件开发的任何阶段进行,越早进行越能节省成本和时间。

静态测试的主要方法有:

- 代码检查:对软件源代码进行逐行或逐段的分析,检查是否符合编码规范,是否存在语法错误,是否有逻辑错误,是否有冗余或无用的代码等。
- 代码走查:由开发人员或同事对软件源代码进行阅读和理解,检查是否有遗漏或不一致的地方,是否有潜在的缺陷或风险等。
- 代码审查:由专业的审查人员或团队对软件源代码进行系统的评估,检查是否满足需求和设计,是否符合质量标准,是否有改进或优化的空间等。
- 文档检查:对软件相关的文档(如需求文档、设计文档、用户手册等)进行分析,检查是否完整、清晰、一致、准确等。
- 文档审查:由专业的审查人员或团队对软件相关的文档进行系统的评估,检查是否满足目标和规范,是否有遗漏或错误的地方,是否有改进或优化的空间等。

静态测试是一种有效的软件质量保证手段,它可以在不运行软件的情况下发现大部分的缺陷和错误,从而减少动态测试的工作量和风险。静态测试也可以提高开发人员和审查人员之间的沟通和协作,促进知识共享和经验传承。因此,在软件开发过程中,应该重视并实施静态测试,以提高软件产品的质量和价值。

一、实验目的

掌握单元测试中的静态测试技术

二、实验内容

对学生宿舍管理系统完成静态测试中的代码测试

三、实验步骤

(1)学习C语言编码规范。

(2)对于代码审查的结果,填写汇总表,记录发现的缺陷。

函数名

行数

缺陷编号

(3)认真撰写实验心得。

四、实验过程

1、学生宿舍管理系统代码

#include "stdio.h"
#include "stdlib.h"

#define SIZE 1000

char grade;

typedef struct StuNode{
  char num[11];
  char name[20];
  char sex[2];
  char birth[11];
  char hometn[13];
  char dorNum[7];
  char dorTel[8];
  struct StuNode *next;
}StuNode,*StuList;

int readToList(StuList sl,FILE *fp){
  StuList p;
  int i=0;
  while(1){
    p=(StuList)malloc(sizeof(StuNode));
    if(fread(p,sizeof(StuNode),1,fp)!=1) break;
    p->next=sl->next;
    sl->next=p;
    i++;
  }
  fclose(fp);
  return i;
}

void addNode(){
  FILE *fp;
  StuList sl,p,q;
  if((fp=fopen("stu_list","rb"))==NULL){ /*the file doesn't exist*/
    p=(StuList)malloc(sizeof(StuNode));
    printf("Please enter the student's information:\n");
    scanf("%s%s%s%s%s%s%s",&p->num,&p->name,&p->sex,&p->birth,&p->hometn,&p->dorNum,&p->dorTel);
    getchar();
    p->next=NULL;
    if((fp=fopen("stu_list","wb"))==NULL){
      printf("cannot open file\n");
      return;
    }
    else{
      if(fwrite(p,sizeof(StuNode),1,fp)!=1){
    printf("file write error\n");
    return;
      }
    }
    fclose(fp);
  }
  else{
    sl=(StuList)malloc(sizeof(StuNode));
    sl->next=NULL;
    readToList(sl,fp);
    p=(StuList)malloc(sizeof(StuNode));
    printf("Please enter the student's information:\n");
    scanf("%s%s%s%s%s%s%s",&p->num,&p->name,&p->sex,&p->birth,&p->hometn,&p->dorNum,&p->dorTel);
    getchar();
    q=sl->next;
    while(q){
      if(strcmp(q->num,p->num)==0){
    printf("This student %s existed!  Press Enter to continue....",p->num);
    getchar();
    clrscr();
    return;
      }
      else q=q->next;
    }
    p->next=sl->next;
    sl->next=p;
    p=sl->next;
    if((fp=fopen("stu_list","wb"))==NULL){
      printf("cannot open file\n");
      return;
    }
    else{
      while(p){
    if(fwrite(p,sizeof(StuNode),1,fp)!=1){
      printf("file write error\n");
      return;
    }
    p=p->next;
      }
    }
    fclose(fp);
  }
  printf("\nSuccess!   Press Enter to continue....");
  getchar();
  clrscr();
}

void delNode(){
  FILE *fp;
  StuList sl,p,q;
  char num[11];
  int flag=1;
  printf("Please enter the student's num:");
  scanf("%s",&num);
  getchar();
  sl=(StuList)malloc(sizeof(StuNode));
  sl->next=NULL;
  if((fp=fopen("stu_list","rb"))==NULL){
    printf("cannot open file\n");
    return;
  }
  readToList(sl,fp);
  p=sl;
  while(p){
    q=p->next;
    if(strcmp(q->num,num)==0){
      p->next=q->next;
      free(q);
      flag=0;
    }
    else p=p->next;
  }
  if(flag==1){
    printf("Not exist this student--%s!  Press Enter to continue....",num);
    getchar();
    clrscr();
    return;
  }
  else if((fp=fopen("stu_list","wb"))==NULL){
      printf("cannot open file\n");
      return;
    }
  else{
    p=sl->next;
    while(p){
      if(fwrite(p,sizeof(StuNode),1,fp)!=1){
    printf("file write error\n");
    return;
      }
      p=p->next;
    }
    fclose(fp);
  }
  printf("\nSuccess!   Press Enter to continue....");
  getchar();
  clrscr();
}

void editNode(){
  FILE *fp;
  StuList sl,p;
  char num[11];
  int flag=1;
  printf("Please enter the student's num:");
  scanf("%s",&num);
  getchar();
  sl=(StuList)malloc(sizeof(StuNode));
  sl->next=NULL;
  if((fp=fopen("stu_list","rb"))==NULL){
    printf("cannot open file\n");
    return;
  }
  readToList(sl,fp);
  p=sl->next;
  while(p){
    if(strcmp(num,p->num)==0){
      printf("\nThe student's old information is:\n%s %s %s %s %s %s %s\nPlease enter the student's new information:\n",
      p->num,p->name,p->sex,p->birth,p->hometn,p->dorNum,p->dorTel);
      scanf("%s%s%s%s%s%s%s",&p->num,&p->name,&p->sex,&p->birth,&p->hometn,&p->dorNum,&p->dorTel);
      getchar();
      flag=0;
      break;
    }
    else p=p->next;
  }
  if(flag){
    printf("Not exist this student--%s!  Press Enter to continue....",num);
    getchar();
    clrscr();
    return;
  }
  else if((fp=fopen("stu_list","wb"))==NULL){
      printf("cannot open file\n");
      return;
    }
  else{
    p=sl->next;
    while(p){
      if(fwrite(p,sizeof(StuNode),1,fp)!=1){
    printf("file write error\n");
    return;
      }
      p=p->next;
    }
    fclose(fp);
  }
  printf("\nSuccess!   Press Enter to continue....");
  getchar();
  clrscr();
}

void sort(StuList sl[],int n,char key[]){
  int i,j,k;
  if(strcmp(key,"num")==0){
    for(i=1;i<n;i++){
      k=i;
      for(j=i+1;j<=n;j++)
    if(strcmp(sl[j]->num,sl[k]->num)<0) k=j;
      if(k!=i){
    sl[0]=sl[i];
    sl[i]=sl[k];
    sl[k]=sl[0];
      }
    }
  }
  if(strcmp(key,"name")==0){
    for(i=1;i<n;i++){
      k=i;
      for(j=i+1;j<=n;j++)
    if(strcmp(strlwr(sl[j]->name),strlwr(sl[k]->name))<0) k=j;
      if(k!=i){
    sl[0]=sl[i];
    sl[i]=sl[k];
    sl[k]=sl[0];
      }
    }
  }
  if(strcmp(key,"dorNum")==0){
    for(i=1;i<n;i++){
      k=i;
      for(j=i+1;j<=n;j++)
    if(strcmp(sl[j]->dorNum,sl[k]->dorNum)<0) k=j;
      if(k!=i){
    sl[0]=sl[i];
    sl[i]=sl[k];
    sl[k]=sl[0];
      }
    }
  }
}

void scan(char key[]){
  FILE *fp;
  StuList sortary[SIZE],sl,p;
  int i,n;
  sl=(StuList)malloc(sizeof(StuNode));
  sl->next=NULL;
  if((fp=fopen("stu_list","rb"))==NULL){
    printf("cannot open file\n");
    return;
  }
  n=readToList(sl,fp);
  p=sl->next;
  for(i=1;i<=n;i++){
    sortary[i]=p;
    p=p->next;
  }
  sort(sortary,n,key);
  printf("\n   num         name           sex    birth     hometown      dorNum  dorTel\n");
  printf("-----------------------------------------------------------------------------\n");
  for(i=1;i<=n;i++){
    printf("%-11s %-19s%-2s  %-11s %-13s %-7s %-8s\n",
    sortary[i]->num,sortary[i]->name,sortary[i]->sex,sortary[i]->birth,sortary[i]->hometn,sortary[i]->dorNum,sortary[i]->dorTel);
  }
  printf("-----------------------------------------------------------------------------\n");
  printf("Press Enter to continue...");
  getchar();
}

void search(char key[],char value[]){
  FILE *fp;
  StuList sortary[SIZE],sl,p;
  int i,n,low,high,mid,flag=1;
  sl=(StuList)malloc(sizeof(StuNode));
  sl->next=NULL;
  if((fp=fopen("stu_list","rb"))==NULL){
    printf("cannot open file\n");
    return;
  }
  n=readToList(sl,fp);
  p=sl->next;
  for(i=1;i<=n;i++){
    sortary[i]=p;
    p=p->next;
  }
  sort(sortary,n,key);
  low=1;high=n;
  while(low<=high){
    mid=(low+high)/2;
    if(strcmp(value,sortary[mid]->num)==0){
      printf("The student's information is:\n");
      printf("%-11s%-19s%-2s%-11s%-13s%-7s%-8s\n",
    sortary[mid]->num,sortary[mid]->name,sortary[mid]->sex,sortary[mid]->birth,sortary[mid]->hometn,sortary[mid]->dorNum,sortary[mid]->dorTel);
      flag=0;
      break;
    }
    else if(strcmp(strlwr(value),strlwr(sortary[mid]->name))==0){
      printf("Result set:\n");
      printf("%-11s%-19s%-2s%-11s%-13s%-7s%-8s\n",
      sortary[mid]->num,sortary[mid]->name,sortary[mid]->sex,sortary[mid]->birth,sortary[mid]->hometn,sortary[mid]->dorNum,sortary[mid]->dorTel);
      for(i=mid+1;strcmp(strlwr(value),strlwr(sortary[i]->name))==0;i++)
    printf("%-11s%-19s%-2s%-11s%-13s%-7s%-8s\n",
    sortary[mid]->num,sortary[mid]->name,sortary[mid]->sex,sortary[mid]->birth,sortary[mid]->hometn,sortary[mid]->dorNum,sortary[mid]->dorTel);
      for(i=mid-1;strcmp(strlwr(value),strlwr(sortary[i]->name))==0;i--)
        printf("%-11s%-19s%-2s%-11s%-13s%-7s%-8s\n",
    sortary[mid]->num,sortary[mid]->name,sortary[mid]->sex,sortary[mid]->birth,sortary[mid]->hometn,sortary[mid]->dorNum,sortary[mid]->dorTel);
    flag=0;
    break;
    }
    else if(strcmp(value,sortary[mid]->dorNum)==0){
      printf("Result set:\n");
      printf("%-11s%-19s%-2s%-11s%-13s%-7s%-8s\n",
      sortary[mid]->num,sortary[mid]->name,sortary[mid]->sex,sortary[mid]->birth,sortary[mid]->hometn,sortary[mid]->dorNum,sortary[mid]->dorTel);
      for(i=mid+1;strcmp(value,sortary[i]->dorNum)==0;i++)
    printf("%-11s%-19s%-2s%-11s%-13s%-7s%-8s\n",
    sortary[i]->num,sortary[i]->name,sortary[i]->sex,sortary[i]->birth,sortary[i]->hometn,sortary[i]->dorNum,sortary[i]->dorTel);
      for(i=mid-1;strcmp(value,sortary[i]->dorNum)==0;i--)
        printf("%-11s%-19s%-2s%-11s%-13s%-7s%-8s\n",
    sortary[i]->num,sortary[i]->name,sortary[i]->sex,sortary[i]->birth,sortary[i]->hometn,sortary[i]->dorNum,sortary[i]->dorTel);
    flag=0;
    break;
    }
    else if((strcmp(key,"num")==0)&&(strcmp(value,sortary[mid]->num)<0)) high=mid-1;
    else if((strcmp(key,"name")==0)&&(strcmp(strlwr(value),strlwr(sortary[mid]->name))<0)) high=mid-1;
    else if((strcmp(key,"dorNum")==0)&&(strcmp(value,sortary[mid]->dorNum)<0)) high=mid-1;
    else low=mid+1;
  }
  if(flag) printf("No result!\n");
  printf("Press Enter to continue...");
  getchar();
  clrscr();
}

void printMenu(){
  printf("              *********************< MENU >*********************\n");
  printf("                     1.Add one student's record.\n");
  printf("                     2.Delete one student's record.\n");
  printf("                     3.Edit one student's record.\n");
  printf("                     4.Scan all records ordered by num.\n");
  printf("                     5.Scan all records ordered by name.\n");
  printf("                     6.Scan all records ordered by dorNum.\n");
  printf("                     7.Search one student's record.\n");
  printf("                     8.Exit.\n");
  printf("              **************************************************\n");
  printf("Please enter your choice(1~8):");
  grade=getchar();
  getchar();
}


void main(){
  char key[7],value[20];
  while(1){
    printMenu();
    switch(grade){
      case'1':addNode();break;
      case'2':delNode();break;
      case'3':editNode();break;
      case'4':clrscr();scan("num");break;
      case'5':clrscr();scan("name");break;
      case'6':clrscr();scan("dorNum");break;
      case'7':clrscr();
          printf("Please enter the key and value(eg:num 0606054230/name ZhangSan/dorNum 030615):\n");
          scanf("%s%s",&key,&value);
          while((strcmp(key,"num")!=0)&&(strcmp(key,"name")!=0)&&(strcmp(key,"dorNum")!=0)){
        printf("Wrong key! It must be num/name/dorNum:\n");
        scanf("%s%s",&key,&value);
        getchar();
          }
          getchar();
          clrscr();
          search(key,value);
          break;
      case'8':exit(0);
      default:clrscr();
          printf("\n Have no this choice--%c!  Press Enter to continue...",grade);
          getchar();
          clrscr();
    }
  }
}

2、汇总表

函数名

行数

缺陷编号

addNode

64

1

addNode

67

2

addNode

92

3

delNode

1

4

delNode

113

5

delNode

123

6

delNode

143

7

editNode

1

8

editNode

163

9

editNode

176

10

editNode

196

11

sort(StuList sl[],int n,char key[])

1

12

sort(StuList sl[],int n,char key[])

201

13

sort(StuList sl[],int n,char key[])

213

14

sort(StuList sl[],int n,char key[])

217

15

sort(StuList sl[],int n,char key[])

225

16

search(char key[],char value[])

1

17

search(char key[],char value[])

287

18

search(char key[],char value[])

294

19

search(char key[],char value[])

328

20

Main

1

21

Main

348

22

mian

1

23

main

356

24

main

356

25

main

357

26

main

358

27

main

362

28

addNode

1

29

3、C语言编码规范

A.1 排版

1-1:程序块要采用缩进风格编写,缩进使用TAB键

1-2:相对独立的程序块之间、变量说明之后必须加空行。

1-3:较长的语句(>80字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。

1-4:循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分,长表达式要在低优先级操作符处划分新行,操作符放在新行之首。

1-5:若函数或过程中的参数较长,则要进行适当的划分。

1-6:不允许把多个短语句写在一行中,即一行只写一条语句。

1-7:if、while、for、default、do等语句自占一行。

1-8:对齐只使用TAB键,不使用空格键。

1-9:函数或过程的开始、结构的定义及循环、判断等语句中的代码都要采用缩进风格,case语句下的情况处理语句也要遵从语句缩进要求。

1-10:程序块的分界符(如C/C++语言的大括号'{'和'}')应各独占一行并且位于同一列,同时与引用它们的语句左对齐。在函数体的开始、类的定义、结构的定义、枚举的定义以及if、for、do、while()、switch、case语句中的程序都要采用如上的缩进方式。

1-11:在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后要加空格;进行非对等操作时,如果是关系密切的立即操作符(如->),后不应加空格。

1-12: 程序结构清晰,简单易懂,单个函数的程序行数不得超过100行。

A.2 注释

2-1:一般情况下,源程序有效注释量必须在20%以上。

2-2:说明性文件(如头文件.h文件、.inc文件、.def文件、编译说明文件.cfg等)头部应进行注释,注释必须列出:版权说明、版本号、生成日期、作者、内容、功能、与其它文件的关系、修改日志等,头文件的注释中还应有函数功能简要说明。

2-3:源文件头部应进行注释,列出:版权说明、版本号、生成日期、作者、模块目的/功能、主要函数及其功能、修改日志等。

2-4:函数头部应进行注释,列出:函数的目的/功能、输入参数、输出参数、返回值、调用关系(函数、表)等。

2-5:边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删除。

2-6:注释的内容要清楚、明了,含义准确,防止注释二义性。

2-7:避免在注释中使用缩写,特别是非常用缩写。

2-8:注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。

2-9:对于所有有物理含义的变量、常量,如果其命名不是充分自注释的,在声明时都必须加以注释,说明其物理含义。变量、常量、宏的注释应放在其上方相邻位置或右方。

2-10:数据结构声明(包括数组、结构、类、枚举等),如果其命名不是充分自注释的,必须加以注释。对数据结构的注释应放在其上方相邻位置,不可放在下面;对结构中的每个域的注释放在此域的右方。

2-11:全局变量要有较详细的注释,包括对其功能、取值范围、哪些函数或过程存取它以及存取时注意事项等的说明。

2-12:注释与所描述内容进行同样的缩排。

2-13:将注释与其上面的代码用空行隔开。

2-14:对变量的定义和分支语句(条件分支、循环语句等)必须编写注释。

2-15:对于switch语句下的case语句,如果因为特殊情况需要处理完一个case后进入下一个case处理,必须在该case语句处理完、下一个case语句前加上明确的注释。

A.3 标识符命名

3-1:标识符的命名要清晰、明了,有明确含义,同时使用完整的单词或大家基本可以理解的缩写,避免使人产生误解。

3-2:命名中若使用特殊约定或缩写,则要有注释说明。

3-3:自己特有的命名风格,要自始至终保持一致,不可来回变化。

3-4:对于变量命名,禁止取单个字符(如i、j、k...),建议除了要有具体含义外,还能表明其变量类型、数据类型等,但i、j、k作局部循环变量是允许的。

3-5:命名规范必须与所使用的系统风格保持一致,并在同一项目中统一,比如采用UNIX的全小写加下划线的风格或大小写混排的方式,不要使用大小写与下划线混排的方式。

A.4 可读性

4-1:注意运算符的优先级,并用括号明确表达式的操作顺序,避免使用默认优先级。

4-2:避免使用不易理解的数字,用有意义的标识来替代。涉及物理状态或者含有物理意义的常量,不应直接使用数字,必须用有意义的枚举或宏来代替。

A.5 变量

5-1:去掉没必要的公共变量。

5-2:仔细定义并明确公共变量的含义、作用、取值范围及公共变量间的关系。

5-3:明确公共变量与操作此公共变量的函数或过程的关系,如访问、修改及创建等。

5-4:当向公共变量传递数据时,要十分小心,防止赋予不合理的值或越界等现象发生。

5-5:防止局部变量与公共变量同名。

5-6:严禁使用未经初始化的变量作为右值。

A.6 函数、过程

6-1:对所调用函数的错误返回码要仔细、全面地处理。

6-2:明确函数功能,精确(而不是近似)地实现函数设计。

6-3:编写可重入函数时,应注意局部变量的使用(如编写C/C++语言的可重入函数时,应使用auto即缺省态局部变量或寄存器变量)。

6-4:编写可重入函数时,若使用全局变量,则应通过关中断、信号量(即P、V操作)等手段对其加以保护。

A.7 可测性

7-1:在同一项目组或产品组内,要有一套统一的为集成测试与系统联调准备的调测开关及相应打印函数,并且要有详细的说明。

7-2:在同一项目组或产品组内,调测打印出的信息串的格式要有统一的形式。信息串中至少要有所在模块名(或源文件名)及行号。

7-3:编程的同时要为单元测试选择恰当的测试点,并仔细构造测试代码、测试用例,同时给出明确的注释说明。测试代码部分应作为(模块中的)一个子模块,以方便测试代码在模块中的安装与拆卸(通过调测开关)。

7-4:在进行集成测试/系统联调之前,要构造好测试环境、测试项目及测试用例,同时仔细分析并优化测试用例,以提高测试效率。

7-5:使用断言来发现软件问题,提高代码可测性。

7-6:用断言来检查程序正常运行时不应发生但在调测时有可能发生的非法情况。

7-7:不能用断言来检查最终产品肯定会出现且必须处理的错误情况。

7-8:对较复杂的断言加上明确的注释。

7-9:用断言确认函数的参数。

7-10:用断言保证没有定义的特性或功能不被使用。

7-11:用断言对程序开发环境(OS/Compiler/Hardware)的假设进行检查。

7-12:正式软件产品中应把断言及其它调测代码去掉(即把有关的调测开关关掉)。

7-13:在软件系统中设置与取消有关测试手段,不能对软件实现的功能等产生影响。

7-14:用调测开关来切换软件的DEBUG版和正式版,而不要同时存在正式版本和DEBUG版本的不同源文件,以减少维护的难度。

7-15:软件的DEBUG版本和发行版本应该统一维护,不允许分家,并且要时刻注意保证两个版本在实现功能上的一致性。

A.8 程序效率

8-1:编程时要经常注意代码的效率。

8-2:在保证软件系统的正确性、稳定性、可读性及可测性的前提下,提高代码效率。

8-3:局部效率应为全局效率服务,不能因为提高局部效率而对全局效率造成影响。

8-4:通过对系统数据结构的划分与组织的改进,以及对程序算法的优化来提高空间效率。

8-5:循环体内工作量最小化。

A.9 质量保证

9-1:在软件设计过程中构筑软件质量。

9-2:代码质量保证优先原则

9-3:只引用属于自己的存贮空间。

9-4:防止引用已经释放的内存空间。

9-5:过程/函数中分配的内存,在过程/函数退出之前要释放。

9-6:过程/函数中申请的(为打开文件而使用的)文件句柄,在过程/函数退出之前要关闭。

9-7:防止内存操作越界。

9-8:认真处理程序所能遇到的各种出错情况。

9-9:系统运行之初,要初始化有关变量及运行环境,防止未经初始化的变量被引用。

9-10:系统运行之初,要对加载到系统中的数据进行一致性检查。

9-11:严禁随意更改其它模块或系统的有关设置和配置。

9-12:不能随意改变与其它模块的接口。

9-13:充分了解系统的接口之后,再使用系统提供的功能。

9-14:编程时,要防止差1错误。

9-15:要时刻注意易混淆的操作符。当编完程序后,应从头至尾检查一遍这些操作符,以防止拼写错误。

9-16:有可能的话,if语句尽量加上else分支,对没有else分支的语句要小心对待;switch语句必须有default分支。

9-17: 禁止GOTO语句。

9-18:单元测试也是编程的一部份,提交联调测试的程序必须通过单元测试。

A.10 代码编辑、编译、审查

10-1:打开编译器的所有告警开关对程序进行编译。

10-2:在产品软件(项目组)中,要统一编译开关选项。

10-3:通过代码走读及审查方式对代码进行检查。

A.11 代码测试、维护

11-1:单元测试要求至少达到语句覆盖。

11-2:单元测试开始要跟踪每一条语句,并观察数据流及变量的变化。

11-3:清理、整理或优化后的代码要经过审查及测试。

11-4:代码版本升级要经过严格测试。

11-5:使用工具软件对代码版本进行维护。

11-6:正式版本上软件的任何修改都应有详细的文档记录。

A.12

12-1:用宏定义表达式时,要使用完备的括号。

12-2: 将宏所定义的多条表达式放在大括号中。

12-3: 使用宏时,不允许参数发生变化


总结

这篇文章讲了软件测试的概念和方法,其中静态测试是指在不运行软件的情况下,对软件的需求、设计、代码等进行分析、检查、评审的过程,目的是发现软件开发过程中的缺陷和错误,从而提高软件的可靠性和可维护性。静态测试可以在软件开发的任何阶段进行,越早进行越能节省成本和时间。静态测试的主要方法有:代码检查、代码走查、代码审查、文档检查和文档审查。静态测试是一种有效的软件质量保证手段,它可以在不运行软件的情况下发现大部分的缺陷和错误,从而减少动态测试的工作量和风险。静态测试也可以提高开发人员和审查人员之间的沟通和协作,促进知识共享和经验传承。因此,在软件开发过程中,应该重视并实施静态测试,以提高软件产品的质量和价值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/421545.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通信工程有哪些SCI期刊推荐? - 易智编译EaseEditing

以下是通信工程领域的一些SCI期刊推荐&#xff1a; IEEE Transactions on Communications&#xff1a; 该期刊由IEEE出版&#xff0c;是通信工程领域的顶级期刊&#xff0c;涵盖了通信系统、信号处理、无线通信、光通信、网络通信、通信安全等方面的研究。 IEEE Journal on S…

如何使用公网远程访问jupyter notebook【cpolar内网穿透】

文章目录前言视频教程1. Python环境安装2. Jupyter 安装3. 启动Jupyter Notebook4. 远程访问4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口5. 固定公网地址转载自远控源码文章&#xff1a;公网远程访问jupyter notebook【cpolar内网穿透】 前言 Jupyter Notebook&#…

【Redis】多级缓存

【Redis】多级缓存 文章目录【Redis】多级缓存1. 传统缓存的问题2. 多级缓存方案2.1 JVM进程缓存2.1.1 本地进程缓存2.1.2 Caffeine2.2 Nginx缓存2.2.1 准备工作2.2.21. 传统缓存的问题 传统的缓存策略一般是请求到达 tomcat 后&#xff0c;先查询redis&#xff0c;如果未命中…

微服务高级篇【3】之分布式缓存Redis集群

文章目录前言一 单机Redis存在的问题二 Redis的安装三 Redis持久化3.1 RDB持久化3.1.1 触发条件3.1.2 RDB原理3.1.3 小结3.2 AOF持久化3.2.1 AOF原理3.2.2 AOF配置3.2.3 AOF文件重写3.3 RDB与AOF对比四 Redis主从集群4.1 搭建主从架构4.2 搭建主从集群4.2.1 集群结构4.2.2 准备…

【FFmpeg】自定义编码器适配

目录1 编码流程1.1 整体流程1.2 内部流程2 适配接口2.1 init、close2.2 option2.3 receive2.4 encode2.5 零拷贝的设计1 编码流程 FFmpeg是一个开源的多媒体框架&#xff0c;底层可对接实现多种编解码器&#xff0c;下面参考文件doc/examples/encode_video.c分析编码一帧的流程…

Adobe Illustrator2023(AI2023)图文安装教程

Adobe Illustrator2023(AI2023)简称AI&#xff0c;是一种应用于出版、多媒体和在线图像的工业标准矢量插画的软件。该软件主要应用于印刷出版、海报书籍排版、专业插画、多媒体图像处理和互联网页面的制作等&#xff0c;也可以为线稿提供较高的精度和控制&#xff0c;适合生产任…

【Camunda】 -- Docker 安裝及使用

【Camunda】 -- Docker 安裝及使用1. Docker install Camunda platform1.1 Web2. Big Data -- Postgres1.1 Big Data -- Postgres3.Awakening1.1 Big Data -- PostgresCamunda platform 是一個任務監控的平台。 Camunda Modeler是建模工具。 1. Docker install Camunda platfor…

【超详细教程】解决libxxx.so: cannot open shared object file: No file or directory

一、参考资料 error while loading shared libraries的解决方案 libascend_hal.so: cannot open shared object file:No such…解决办法-云社区-华为云 (huaweicloud.com) 二、相关介绍 1. -lxxx.so命名 lxxx means lib lib-name .solc means libc.so, lltdl means lib…

C++学习从基础到高阶(基于黑马程序员教程)

视频链接&#xff1a;黑马程序员匠心之作|C教程从0到1入门编程,学习编程不再难&#xff08;52个小时&#xff09; C语言中文网&#xff1a;http://c.biancheng.net/cplus/ Visual Studio 2022 下载地址&#xff1a;https://visualstudio.microsoft.com/zh-hans/downloads/ Visu…

软件设计模式 | 动态代理模式

文章目录一、动态代理概述1.1 代理的概述和作用1.2 动态代理的优点1.3 代理对象的创建1.4 代理对象调用方法的执行流程二、动态代理举例2.1 歌手经纪人2.2 业务功能的性能统计2.3 动态代理在 Spring 框架中的应用三、基于子类的动态代理一、动态代理概述 1.1 代理的概述和作用…

英语语法——动词

文章目录分类时态一般时态三单过去式进行时态现在分词完成时态过去分词完成进行时态情态语态否定强调非谓语动词分类 时态 时态用于表示动作发生的时间和状态&#xff0c;它通过谓语动词的形式变化来体现&#xff0c;时态是每个动词必须要有的。在英语中有以下十六种时态&…

MySQL怎么卸载干净

卸载干净MySQL的步骤&#xff1a;首先关闭MySQL服务&#xff1b;然后卸载MySQL软件&#xff1b;接着删除MySQL在电脑中的残存文件&#xff1b;最后删除MySQL注册表信息即可。 很多人都遇到过一个问题&#xff0c;那就是在安装MySQL的时候操作错误&#xff0c;最后结果不是自己想…

C++【深入理解继承】

文章目录一、继承概念与定义二、基类和派生类对象赋值转换三、派生类的默认成员函数&#xff08;1&#xff09;构造函数&#xff08;2&#xff09;拷贝构造函数&#xff08;3&#xff09;赋值重载&#xff08;4&#xff09;析构函数四、复杂的菱形继承及菱形虚拟继承&#xff0…

python 不指定参数个数---args基础用法

前言&#xff1a; 在有些时候&#xff0c;设计函数的时候&#xff0c;可能不知道要传入的参数类型或者参数个数&#xff0c;此时args可以很好地解决。 一、*args的基本用法 1。传入不指定个数的参数&#xff0c; 2。参数的类型也不指定&#xff0c;可以是任意类型数据&…

k8s学习(三十五)飞腾2000+麒麟V10离线部署metrics-server

文章目录1、下载metrics-server配置文件2、下载推送metrics-server镜像3、修改metrics-server配置4、启动metrics-server1、下载metrics-server配置文件 在有网机器上从网站https://github.com/kubernetes-incubator/metrics-server下载 拷贝其到离线机器K8S的master节点。 2…

九龙证券|又3个涨停,退市风险急升!

*ST新海退市危险急剧上升&#xff01; 到4月14日&#xff0c;*ST新海收盘价接连14个买卖日低于1元/股。按照退市新规&#xff0c;若*ST新海在接下来6个买卖日收盘价继续低于1元/股&#xff0c;将触及买卖类强制退市景象而终止上市&#xff0c;公司股票将不进入退市整理期。 面…

Android Audio音量设置原理流程分析

Android Audio音量设置原理流程分析 简介 本篇文章主要介绍Android音量设置从App应用层到framework层执行流程&#xff0c;以及相关的细节和原理分析&#xff0c;建议在阅读此文章前去看博主的混音理论篇的声音的音量属性和声音相关公式的推导章节&#xff0c;这对阅读时理解音…

2023年泰迪杯数据挖掘挑战赛B题完整数据分析与预测(5.针对完整数据的组合预测-机器学习+深度学习)

背景 2023年泰迪杯完整数据最新出炉&#xff0c;博主根据最新完整数据对原来的预测方案进行了调整&#xff0c;采用机器学习深度学习的组合预测来实现最终预测 全部数据已经出炉&#xff0c;可以看出训练样本和预测样本都增加了十倍&#xff0c;这对于数据的处理复杂程度也有…

linux驱动开发 - 04_Linux 设备树学习 - DTS语法

文章目录Linux 设备树学习 - DTS语法1 什么是设备树&#xff1f;2 DTS、DTB和DTC3 DTS 语法3.1 dtsi 头文件3.2 设备节点3.3 标准属性1、compatible 属性2、model 属性3、status 属性4、#address-cells 和#size-cells 属性5、reg 属性6、ranges 属性7、name 属性8、device_type…

FreeRTOS 任务切换

文章目录一、PendSV 异常二、FreeRTOS 任务切换场合1. 执行系统调用 taskYIELD()2. 系统滴答定时器(SysTick)中断 SysTick_Handler三、PendSV 中断服务函数 PendSV_Handler()四、查找下一个要运行的任务 vTaskSwitchContext()五、FreeRTOS 时间片调度六、时间片调度实验RTOS 系…