前面我给出了整体的软件测试分类,那么接下来,我会将每个分类进行细讲。
第一个我们要说到的就是按照开发阶段划分。
我们都知道软件测试方法分类中,如果按照开发阶段划分,可以分为:
1,单元测试 (Unit Testing)
2,集成测试 (Integration Testing)
3,系统测试 (System Testing)
4,验收测试 (Acceptance Testing)
为什么把他放在第一个呢?有以下几方面的原因:
1,软件测试和软件开发是一个相互的过程,离开了开发,单独谈软件测试是没有任何意义的。
2,在面试的时候,很多面试官认为软件测试分类,说到这个层次就可以了。
3,早期的开发流程其实就是按照瀑布或者V模型去进行的,由此也就默认流程是这样一个流程。
首先,软件在开发的开始,先是一个个小单元模块的开发,也就是一个个方法的开发,比如说我要开发一个微信的功能。
第一步,肯定是先要完成注册功能的开发,对应的我就要写相关注册的方法。
/*注册功能
* 键盘输入用户名与密码,如果用户存在则要求重新输入。
* 如果用户不存在,在数组中插入注册的账号密码。
* 此时可能会有数组长度不够的情况,所以需要增加数组的长度。
*/
public static void register() {
boolean isNewUser; //判断是否是新用户
String usernames;
do {
System.out.print("请输入注册用户名:");
usernames = scanner.next();
isNewUser = true;
/*两种表达方式:
* ①for(String uname:USERNAMES)
* {
* System.out.println(uname);
* }
* ②for(int i=0;i<USERNAMES.length;i++)
* {
* System.out.println(USERNAMES[i]);
* }
*/
for (int i = 0; i < USERNAMES.length; i++)
{
if (USERNAMES[i] != null && usernames.equals(USERNAMES[i]))
{
System.out.println("用户名已存在,请重新输入!");
isNewUser = false;
break;
}
}
} while (!isNewUser); //新用户会跳出循环,不再要求重新输入
System.out.print("请输入密码:");
String passwords = scanner.next();
boolean isFull = true; //判断当前数组是否装满
for (int i = 0; i < USERNAMES.length; i++)
{
if (USERNAMES[i] == null)
{
isFull = false;
break;
}
}
if(isFull)
{
String[] newUSERNAMES=new String[USERNAMES.length+10];
String[] newPASSWORDS=new String[PASSWORDS.length+10];
//arraycopy可以实现一个数组的指定个数元素负责到另一个数组中
//将USERNAMES数组里从索引为0的元素开始,复制到newUSERNAMES数组里索引为0的位置,复制USERNAMES.length个元素
System.arraycopy(USERNAMES,0,newUSERNAMES,0,USERNAMES.length);
System.arraycopy(PASSWORDS,0,newPASSWORDS,0,PASSWORDS.length);
USERNAMES=newUSERNAMES;
PASSWORDS=newPASSWORDS;
}
for(int i=0;i<USERNAMES.length;i++)
{
if(USERNAMES[i]==null)
{
USERNAMES[i]=usernames;
PASSWORDS[i]=passwords;
System.out.println("注册成功!");
break;
}
}
}
开发完成之后,我们就可以单独对这样一个注册的小单元进行单元测试。
第二步,写完注册,并且测试没问题之后,开发这个时候进行登录的开发。
/*登录功能:* 键盘输入用户名与密码
* 使用for循环+if语句验证输入的用户名和密码是否正确
*/
public static void login(){ //登录
for(int retry=1;retry<=3;retry++)
{
System.out.print("请输入注册用户名:");
String usernames = scanner.next();
System.out.print("请输入密码:");
String passwords = scanner.next();
for(int i=0;i<USERNAMES.length;i++)
{
if(passwords!=null)
{
if(usernames.equals(USERNAMES[i])&&passwords.equals(PASSWORDS[i]))
{
System.out.println("登录成功!");
return;
}
}
}
System.out.println("登录失败 "+retry+" 次,请重新输入!");
}
System.out.println("登录失败超过三次,退出登录功能!");
}
开发完成之后,我们就可以单独对这样一个登录的小单元进行单元测试。
第三步,注册和登录开发并且测试没有问题之后,开发这个时候,可以菜单显示等具体功能的编写。代码如下:
public static void menu(){
//菜单 System.out.println("------------XXX系统------------");
System.out.println("1.登录功能(login)");
System.out.println("2.注册功能(register)");
System.out.println("3.查看(show)");
System.out.println("0.退出(exit)");
System.out.println("------------XXX系统------------");
}
第四步,菜单显示开发并且经过测试之后也没有问题,我们就可以进行查看功能的代码
public static void show(){
System.out.println("系统当前存在的用户为:");
for (int i=0;i<USERNAMES.length;i++)
{
if(USERNAMES[i]!=null)
{
System.out.println("用户名:"+USERNAMES[i]+",密码:"+PASSWORDS[i]);
}
}
}
第五步,查看这样一个单元的代码没问题之后,我们下来可以进行主功能入口的编写,代码样例如下:
//使用static修饰属性,则称该属性为静态属性(或全局属性)
static Scanner scanner =new Scanner(System.in);
// 存储用户名和密码
public static String[] USERNAMES = new String[3];
public static String[] PASSWORDS = new String[3];
public static void main(String[] args){
USERNAMES[0]="JAVA";
PASSWORDS[0]="java";
while(true){
menu(); //调用menu()方法
System.out.print("请选择功能:");
int choice = scanner.nextInt();
switch (choice){
case 1:login(); break; //输入1,调用login()方法
case 2:register(); break; //输入2,调用register()方法
case 3:show(); break; //输入3,调用show()方法
default:
System.out.println("系统退出!");
System.exit(0); //输入0,退出程序执行
}
}
}
以上每一步都是我们对单独的模块或者说是单元进行的单元测试。
这就是我们测试的第一步,也就是单元测试。
就像是在盖房子的时候,第一步,我们单独对每块砖头的质量进行测试一样,如果某一块砖头有问题,那就代表着到时候盖出来的房子是有问题的。
同理,上述的某个方法出现问题的时候,也就代表着整个软件的功能也是肯定会存在问题。
单元测试完毕之后,下来就要进行的是集成测试。
集成测试的概念可以参考我上篇文章写的,其实就是把之前单元测试没有问题的代码方法,串联起来进行测试。
比如:上面的注册和登录都没有问题之后,我们要把这两个功能联合集成在一起,从注册一个账号,再用这个注册的账号进行登录,整个流程都没有问题,在测试下登录成功之后能不能进行菜单的显示。
这就好比我们盖房子一样,单元测试的每一个砖头都没有问题,之后,我们下来要进行的就是将这些砖头拼接成墙面,地面,天花板,然后测试这些墙面,地面,天花板都没有问题。
集成测试都没有问题之后,下来我们就是对整个系统进行整体的测试,就叫做系统测试,
将软件系统看成是一个系统的测试。包括对功能、性能以及软件所运行的软硬件环境进行测试。时间大部分在系统测试执行阶段,包括回归测试和冒烟测试。
我们不仅要测试注册,登录,显示功能,还要将软件结合实际的电脑手机等硬件设备进行检测,甚至还要尝试多个人共同使用有没有问题,所以要对功能、性能以及软件所运行的软硬件环境进行测试。这就跟盖房子一样,前面集成测试已经将砖头垒成了墙面,地面,天花板等等,现在就相当于把这些都合成一个房子。我们不仅要对功能(能不能住人,放置物品),性能(抗不抗风吹,日晒,雨淋,抗不抗地震),所运行的软硬件环境(房子盖在海边,沙漠,山上,平原)等一系列整体因素的测试。
因为很多时候,单元测试和集成测试都是开发内部组织内测,所以作为测试人员,我们大部分的时间还是在这个阶段为主。
系统测试完成之后,下来就需要把软件交给对应的人员进行验收测试,比如产品经理当初提出的软件设计,他就会按照对应的文档检查软件开发完成之后,是否能满足他当时的设计文档。比如可以交给对应的用户进行使用,检测软件是否满足他们的诉求。这也就跟盖房子测试完了之后,最终还是要由房子的设计人员对照对应的图纸进行验证或者交给用户使用一样。
所以按照开发阶段划分整个测试过程,分为单元测试,集成测试,系统测试和验收测试。