如何对遗留代码进行单元测试
作者:网络转载 发布时间:[ 2012/12/10 10:23:14 ] 推荐标签:
上去听了Scrumgathering的试讲活动,感觉此类活动还是挺有意思的,一群scrum实践者或者爱好敏捷的同学在一起讨论如何做好敏捷项目,这次主要听了一场关于如何对遗留代码做单元测试的演讲,因此向记录一下一些很好的观点,来用于我们对单元测试的理解,以及如何提高代码可测性。
所谓的遗留代码(legacy code),简单是指没有任何测试的代码。那么我们如何来对这些遗留代码进行测试,或者是通过修改使这些遗留代码能够变的更加testability。
案例一
public class Car{
private Engine engine;
public Car(){
engine = new Engine(10);
}
public boolean isMove(){
return engine.speed()>0? true:false;
}
}
针对这个class的test case应该是这样的:
public class TestCase{
private Car car;
public void testMove(){
car = new Car();
Assert.assertEquals(true,car.isMove());
}
}
对于这个测试用列,我们并没有真正的达到测试Car的isMove方法的正确性,因为Car在这里对Engine类的一个依赖,在这个测试用列中我们没法达到测试isMove方法中的逻辑。因此我们需要对Car这段遗留代码进行解依赖。
对Car这个类的构造函数进行修改
public class Car{
private Engine engine;
public Car(Engine engine){
this.engine = engine;
}
public boolean isMove(){
return engine.speed()>0?true:false;
}
}
测试代码如下:
public class TestCase{
public Car car;
public void testIsMove(){
Engine engine = new MockEngine(10);
car = new Car(engine);
Assert.assertEquals(true,car.isMove());
}
}
可以看到这时的测试代码已经完完全全的在测试isMove方法了,我们不需要关心Engine,我们可以随便mock一个engine对象。这样完成了对Engine的解依赖,使代码具有可测性。
案例二
提高方法的可见性,如果实际工作中我们需要对一个private的方法进行测试的话,我们可能会无从下手,对于这类测试,我们可以说是该方法无法在测试工具中导入,那么这个时候,我们需要提升一下方法的权限,比如我们可以将private方法改为protected,那么我们可以通过子类继承被测类,子类中对protected方法是可见的,那么我们可以将子类导入到测试用具中完成测试工作。
相关推荐
更新发布
功能测试和接口测试的区别
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