功能测试之单元测试

功能测试之单元测试

单元测试(理论)

简介
1、单元测试的基本概念
2、单元测试的策略
3、单元测试的步骤
4、Junit测试简单Java程序

1.单元测试概念

什么是单元测试?
单元测试是一种验证行为,是指对软件中的最小可测试单元进行检查和验证,在于发现模块内部可能存在的错误,主要基于白盒测试;
最小可测单元:
结构化程序:函数或者过程;
面向对象:类或类的方法;
也可能是多个程序文件中的一组函数

2.单元测试的目的

单元测试的目的:检查单元模块内部的错误,为软件的评审验收提供依据。
做单元测试需考虑以下内容:
单元测试是以程序设计说明书和之前所作的测试数据(正常的和错误的)为指导,测试模块内重要的路径,以检查出错误;
检验信息能否正确地流入和流出单元;
在单元测试工作过程中,其内部数据能否保持其完整性,包括内部数据的形式、内容及相互关系不发生错误,也包括全局变量在单元中的处理和影响。
在为限制数据加工而设置的边界处,能否正确工作。
单元的运行能否做到满足特定的逻辑覆盖。
单元中发生了错误,其中的出错处理措施是否有效。

3.单元测试内容

单元测试通过编写测试代码,用来检测特定的、明确的、细颗粒的功能。单元测试方法包括以下几种:
独立路径:通常是指完成模块功能的主要路径,一般是控制结构。保证每一条代码,每个分支都经过测试;
边界条件:包括循环边界,最大最小值、控制流中等于、大于、小于的比较值等;
出错处理:检查“错误处理程序”本身的错误,保证每一个异常都经过测试
模块接口:用来保证接口功能的正确性。I/O 参数值的个数、类型、次序、格式是否正确,I/O文件属性、操作是否正确等
局部数据结构:
变量没有赋值(即为NULL)
变量是数值(或字符)
主要边界:最小值,最大值,无穷大
溢出边界:(期望异常或拒绝服务)
:最小值-1,最大值+1
临近边界:最小值+1,最大值-1
变量是字符串
引用“字符变量”的边界
空字符串
对字符串长度应用“数值变量”的边界
变量是集合
空集合
对集合的大小应用“数值变量”的边界
调整次序:升序、降序
变量有规律
比如对于Math.sqrt,给出n^2-1,
和n^2+1的边界

4.单元测试的环境
在这里插入图片描述
5.什么是驱动模块

驱动模块在大多数场合称为“主程序”。
驱动模块模拟主程序或者调用模块的功能,它模拟主程序接收测试数据并将这些数据传递到被测试模块,被测试模块被调用后,“主程序”打印“进入-退出”消息。
驱动模块处于被测试模块的上层,驱动模块较容易实现。

6.什么是桩模块

桩模块用于模拟那些由被测模块所调用的下属模块的功能,由于下属模块往往不只一个,也不只一层,由于模块接口的复杂性,桩模块很难模拟各下层模块之间的调用关系,同时为了模拟下层模块的不同功能,需要编写多个桩模块,而这些桩模块所模拟的功能是否正确,也很难进行验证。

7.单元测试策略

单元测试方法
单元测试原则
单元测试过程
常用工具

8.单元测试方法

单元测试有三种常用的设计方法:
自顶向下测试策略:
自底向上
独立

9.自顶向下的单元测试策略

方法:
先对最顶层的单元进行测试,把顶层所调用的单元做成桩模块。其次对第二层进行测试,使用上面已测试的单元做驱动模块。如此类推直到测试完所有模块。
特点:
单元测试策略在执行上同详细设计一致;
单元测试被桩模块控制,越往后,测试过程越复杂;
并行性不好,低层单元测试要等到上层单元测试完毕才可进行

9.自顶向上的单元测试策略

  方法:
    先对模块调用层次图上最低层的模块进行单元测试,
    模拟调用该模块的模块做驱动模块。然后再对上面一层做单元测试,用下面已被测试过的模块做桩
    模块。以此类推,直到测试完所有模块。
      特点
      测试用例从功能设计中取得,不需要桩模块;
      并行性好;
      顶层单元测试要等到低层单元测试完毕才可进行;

10.独立测试

 方法:
 不考虑每个模块与其他模块之间的关系,为每个模块设计桩模块和驱动模块。每个模块进行独立的单元测试。
  特点:
  简单易操作。
  可并行进行、达到高的结构覆盖率。

11.单元测试原则

测试用例根据详细设计文档设计:
为系统运行设计用例;(用最简单的方法执行被测单元)
为正向测试设计用例;(验证设计说明书所对应的功能项或性能指标是否达到)
为逆向测试设计用例; (验证被测单元有没有做它不应该做的事情)
为满足特殊需求设计用例;(从系统的性能、安全、保密性的角度设计测试用例)
为代码覆盖设计用例;(保证较高的代码测试覆盖率)
为覆盖率指标完成设计用例;(对复杂的判断条件、循环以及分支语句,在执行测试过程中,覆盖率指标没有达到,分析原因可能有:不可能的路径或分支、不可能或冗余的代码、不充分的测试用例。)

12.测试过程
在这里插入图片描述
13.单元测试常用工具

目前的最流行的单元测试工具是xUnit系列框架,常用的根据语言不同分为:
JUnit(java)
 Nunit(.net)
 CppUnit(C++)
 Dunit (Delphi )
 PhpUnit(Php )
等等

14.用junit测试简单的Java程序

Junit ,是xUnit单元测试框架体系的一个实例(用于java语言),是一个开放源代码的Java测试框架,用于编写和运行可重复的测试。
主要用于白盒测试,回归测试。

15.Test Case

TestCase是Test接口的抽象实现,(不能被实例化,只能被继承),也是Junit工具的核心部分。
其构造函数TestCase(string name)根据输入的测试名称name创建一个测试实例。
由于每一个TestCase在创建时都要有一个名称,若某测试失败了,便可识别出是哪个测试失败

16.Test Case的方法

一个TestCase主要包括以下几个方法:
• setUp()方法,在测试方法前调用,一般用来做测试准备工作。
• tearDown()方法,在测试方法后调用,一般作测试的清理工作。
• setUpBeforeClass()方法,在整个类初始化之前调用,一般用来做测试准备工作
• tearDownAfterClass()方法,在整个类结束之前调用,一般作测试的清理工作

17.Test Case的生命周期
在这里插入图片描述
18.Test Case编写注意事项
在这里插入图片描述

JUnit按照在测试用例中的顺序执行。
测试方法可以和被测试的方法一 一对应,测试方法也可以包含多个被测试的方法。
测试方法中,使用断言(assertXXX和fail) 来进行测试结果判断,也可以辅以文字打印说明,如果测试程序抛出异常,则显示为错误,如果断言失败,则显示故障。
测试用例必须覆盖被测试类、方法的所有功能,包括正常情况、异常情况和发生错误的情况都必须覆盖,才能保证测试的完整性。

19.JUNIT常用断言

断言:判断期望值与实际值是否相同
assertEquals: 验证给定对象是否符合期望值。
assertTrue / assertFalse : 该断言用来验证给定的布尔型值(boolean)是否为真/假,如果结果为假/真,则验证失败。
assertNull: 该断言用来验证给定的对象是否为空( null ),如果不为null,则验证失败。
Fail : 用于抛出错误,终止测试。该断言会使测试立即失败。

19.Eclipse+junit

最为流行的 IDE,它全面集成了 JUnit,并从版本3.2 开始支持 JUnit 4。不用安装就可以在你的项目中开始测试相关的类,并且可以调试你的测试用例和被测试类。
Junit测试步骤:
– 安装eclipse,创建被测对象。
– 将Junit4的jar包添加到项目的library中

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

实例

怎么导junit包呢?点击Build Path 然后有个Configure Build Path 如下图 点击进去
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
把上图那个加载进去就行了(有几个版本的 像3.4.5可以选择版本)

在这里插入图片描述

然后上图这个就是建测试类 咱们今天用到的就是上面那个

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
上面这一个图一定要记得有圈出来的这是一定要的哈!!!

我们在上面那张图必须是要写了代码的哈
DBHelper

package com.zking;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;




public class DBHelper {
    
    
	
	//两个字符串
	private static final String cname="com.microsoft.sqlserver.jdbc.SQLServerDriver";
	private static final String url="jdbc:sqlserver://localhost:1433;DatabaseName=db_T243";
	//加载驱动		
	static {
    
    
		try {
    
    
			Class.forName(cname);
		} catch (Exception e) {
    
    
			e.printStackTrace();
		}						
	}
			//6、创建连接
		public static Connection  getCon() {
    
    
			Connection con =null;
			try {
    
    
				con=DriverManager.getConnection(url,"sa","123");
			} catch (Exception e) {
    
    
				e.printStackTrace();
			}
			
			return con;
		}	 
				
//		关闭连接
		public static  void getClose(Connection con,PreparedStatement ps,ResultSet rs) {
    
    
				try {
    
    
					if(con!=null&&!con.isClosed()) {
    
    
						con.close();
					}
					if(ps!=null) {
    
    
						ps.close();
					}
					if(rs!=null) {
    
    
						rs.close();
					}
				} catch (Exception e) {
    
    
					e.printStackTrace();
				}
		}
			
			
}

Stu

package com.zking;

public class Stu {
    
    

	private  int sid;
	private String sname;
	private String sex;
	private int age;
	private String sadderess;
	public int getSid() {
    
    
		return sid;
	}
	public void setSid(int sid) {
    
    
		this.sid = sid;
	}
	public String getSname() {
    
    
		return sname;
	}
	public void setSname(String sname) {
    
    
		this.sname = sname;
	}
	public String getSex() {
    
    
		return sex;
	}
	public void setSex(String sex) {
    
    
		this.sex = sex;
	}
	public int getAge() {
    
    
		return age;
	}
	public void setAge(int age) {
    
    
		this.age = age;
	}
	public String getSadderess() {
    
    
		return sadderess;
	}
	public void setSadderess(String sadderess) {
    
    
		this.sadderess = sadderess;
	}
	
	public Stu() {
    
    }
	public Stu(int sid, String sname, String sex, int age, String saddress) {
    
    
		
		this.sid = sid;
		this.sname = sname;
		this.sex = sex;
		this.age = age;
		this.sadderess = saddress;
	}
	
	@Override
	public String toString() {
    
    
		// TODO Auto-generated method stub
		return "学号:"+this.sid+"姓名:"+this.sname+"性别:"+this.sex+"年龄:"+this.age+"地址:"+this.sadderess;
	}
	
	
}

StuDao

package com.zking;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class StuDao {
    
    

	Connection con = null;
	PreparedStatement ps = null;
	ResultSet rs = null;

	public int add(Stu stu) {
    
    
		int n = 0;
		try {
    
    
			con = DBHelper.getCon();
			String sql = "insert into tb_stu(sid,sname,sex,age,sadderess) values(?,?,?,?,?)";
			ps = con.prepareStatement(sql);
			ps.setInt(1,stu.getSid());
			ps.setString(2,stu.getSname());
			ps.setString(3,stu.getSex());
			ps.setInt(4, stu.getAge());
			ps.setString(5,stu.getSadderess());
			n = ps.executeUpdate();
		} catch (Exception e) {
    
    
			e.printStackTrace();
		}
		
		return n;
	}
	
	public int del(int sid) {
    
    
		int n = 0;
		try {
    
    
			con =DBHelper.getCon();
			String sql = "delete from tb_stu where sid=?";
			ps=con.prepareStatement(sql);
			ps.setInt(1,sid);
			n = ps.executeUpdate();
		} catch (Exception e) {
    
    
			e.printStackTrace();
		}
		
		return n;
	}
	
	public int update(int sid,Stu stu) {
    
    
		int n = 0;
		try {
    
    
			con = DBHelper.getCon();
			String sql = "update tb_stu set sname=?,sex=?,sage=?,sadderess=?  where sid=?";
			ps = con.prepareStatement(sql);		
			ps.setString(1,stu.getSname());
			ps.setString(2, stu.getSex());
			ps.setInt(3,stu.getAge());
			ps.setString(4,stu.getSadderess());
			ps.setInt(5,sid);
			n = ps.executeUpdate();
			System.out.println(n);
		} catch (Exception e) {
    
    
			e.printStackTrace();
		}
		
		return n;
	}
	public List<Stu> getall(){
    
    
		List<Stu> li=new ArrayList<>();
		try {
    
    
			con=DBHelper.getCon();
			String sql="select * from tb_stu";
			ps=con.prepareStatement(sql);
			rs=ps.executeQuery();
			while(rs.next()) {
    
    
				Stu st=new Stu();
				st.setSid(rs.getInt(1));
				st.setSname(rs.getString(2));
				st.setSex(rs.getString(3));
				st.setAge(rs.getInt(4));
				st.setSadderess(rs.getString(5));
				li.add(st);
			}
		} catch (Exception e) {
    
    
			// TODO: handle exception
		}
		return li;
	}
	
}

写完这些之后就写上面图里面说的那个
StuDaoTest

package com.zking;

import static org.junit.Assert.*;

import org.junit.Test;

public class StuDaoTest extends StuDao {
    
    

	 
	
	
			
	@Test
	public void testAdd() {
    
    
		Stu s=new Stu(100, "易烊千玺", "男", 20, "中国");
		StuDao sd=new StuDao();
		sd.add(s);
		
	}

	@Test
	public void testDel() {
    
    
	int sid=33;
	StuDao sd=new StuDao();
	sd.del(sid);
	}

	@Test
	public void testUpdate() {
    
    
		Stu s=new Stu(22, "王一博", "男", 22, "中国");
		int sid=2;
		StuDao sd=new StuDao();
		sd.update(sid, s);
	}
	@Test
	public void testgetall() {
    
    
	   StuDao sd=new StuDao();
	   List<Stu> ga = sd.getall();
	   for (Stu stu : ga) {
    
    
		System.out.println(stu);
	}
	   
	   
	}

}

建议写一个运行一次哈 这样才能及时发现错误
大概就是这个样子的

猜你喜欢

转载自blog.csdn.net/m0_47906344/article/details/112393202