单元测试之破除依赖
作者:网络转载 发布时间:[ 2015/12/17 11:48:54 ] 推荐标签:软件测试 单元测试
前言:单元测试的时候经常出现一个对象依耐另一个你无法控制的对象,所以这个时候你必须去替代成一个你自己可以控制的对象来摆脱依耐。
1:为什么要破除依赖
1.1:运行速度慢
比喻我们要通过用户Id判断用户是否存在,那么我们这个方法会依赖数据库。这样成了集成测试,如果大量的测试会出现速度慢。
1.2:需要配置
由于依赖数据库,会配置和数据库相关的文件。
1.3:一次性测试很多内容,无法定位错误信息
比喻这个方法错误可能是由于传入的用户Id为空,也可能传入的用户Id不存在,还可能是数据库连接断开等,这样我们起不到我们单元测试的目的。
2:存根
一个外部依赖项:指的是系统中的一个对象,被测试的代码与这个对象发生交互,但是你不能控制这个对象。比喻前端工程师和后台工程师合作,前端工程师要等待后台返回的数据来处理,那么后台是他的一个外部依赖项。因为他无法控制后台的代码
定义:一个存根(stub)是对系统中存在的一个依赖项(或协作者)的可控制的替代物(是你找一个对象来替换你无法控制的对象)。通过使用存根,你在测试代码时无需直接处理这个依赖项。(说白了是一个你自己定义来对象来取代你无法控制的对象)
3:重构代码设计来提高代码的可测试性
3.1:抽取接口使底层可替换
其实底层我们应该使用接口,这样上层代码依赖的是接口而不是具体的对象,使项目具有更好的扩展性,当然这里做事为了更好的测试。
从底层方法中抽出一个接口
public interface IUser
{
/// <summary>
/// 检验用户是否存在
/// </summary>
/// <param name="userId">用户名</param>
/// <returns></returns>
bool IsExist(string userId);
}
底层访问数据库的类
public class User:IUser
{
public bool IsExist(string userId)
{
//从数据库查询
//如果有返回true
}
}
待测试的工作单元
public bool IsExistUser(string userId)
{
var user = new User();
return user.IsExist(userId);
}
一个可控制的存根
public class FackUser:IUser
{
public bool WillBevalid = false;
public bool IsExist(string userId)
{
return WillBevalid;
}
}
下面开始注入存根了。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11