本文最初出现在 dhananjay kumar 的 基础设施博客 上
在我们展示如何使用 ms 测试对私有方法进行单元测试之前,让我们讨论一下测试私有方法是否是个好主意。我经常看到有两种思想流派:
1.私有方法要测试。
2. 不应该测试私有方法。
为了正确看待这些事情,让我们考虑一个被测系统 (sut) 工资等级,如下面的清单所示。
namespace calculator
{
public class salary
{
public int calculatesal(int bs, int nwd)
{
int ts ;
if(isvalidnwd(nwd))
{
ts= bs*nwd;
}
else
{
ts = 1000;
}
return ts;
}
private bool isvalidnwd(int nwd)
{
if (nwd > 8)
{
return true;
}
else
{
return false;
}
}
}
}
测试工资等级下的系统有两个功能:
1.calculatesal方法是一个public方法,需要两个参数来计算工资。
2. isvalidwd 方法是一个私有方法,它有一个参数。如果工作日数大于 8,则此函数返回 true,否则返回 false。
3. calculatesal 方法首先使用私有方法isvalidwd 检查工作日数是否有效。
4. 如果工作天数有效,则工资按基本工资乘以工作天数计算,否则固定为$1000。
现在我们有一个具有两个功能的被测系统工资类。
一种观点认为私有方法不应单独进行单元测试。这是因为私有方法在公共方法内部使用,当我们测试公共方法的行为时,私有方法的行为也会被测试。
另一种观点是,私有方法必须与其他公共或私有方法隔离地对其自身行为进行单元测试。在继续查看如何测试私有方法之前,让我们考虑一下是否有另一种可能的方法来解决这个问题。
违反单一责任原则
目前,被测系统salary类违反了单一职责原则,因为它有两个职责:
-
计算工资(公共方法)。
-
验证工作日数(私有方法)。
除非我们测试该类的 验证工作日 行为,否则我们无法确定 sut salary 类的代码覆盖率是否良好,并且在设计上是私有的。一个不错的选择可能是这样的:在创建工资类时,我们可以将职责分散到两个单独的类中,使用公共方法来计算工资和验证工作日。然后我们可以为两个类的公共方法编写单元测试。让我们看看如何做到这一点:
为私有方法编写单元测试
如果您认为应该测试 sut 类中的私有方法,那么您有两个选择:
1. 使用重构——但这有点复杂。
2.使用vsts privateobject 类——这个很简单!
让我们看看如何使用私有对象类对私有方法进行单元测试。要使用私有对象类,您需要:
1.在测试项目中添加对 microsoft.visualstudio.qualitytools.unittestframework 的引用。如果您通过选择单元测试项目模板创建了项目,那么该引用将默认添加到项目中。
2. 添加命名空间 microsoft.visualstudio.testtools.unittesting。
privateobjectclass 的构造函数以类型为参数,所以这里需要传递 sut salary 类的类型 ,然后在privateobjectclass 的对象上调用 invoke 方法来调用private 方法。
我们可以测试私有方法 isvalidnwd, 如下面的清单所示:
namespace calculator
{
public class salary
{
public int calculatesal(int bs, int nwd)
{
int ts ;
if(isvalidnwd(nwd))
{
ts= bs*nwd;
}
else
{
ts = 1000;
}
return ts;
}
private bool isvalidnwd(int nwd)
{
if (nwd > 8)
{
return true;
}
else
{
return false;
}
}
}
}
本质上,我们正在执行以下任务:
-
创建私有对象类的对象。
-
在构造函数中将一种薪水等级作为输入参数传递。
-
使用 invoke 方法执行 sut salary 类的私有方法。
-
在 invoke 方法中传递两个参数:第一个参数是私有方法的名称,第二个参数是执行时将传递给私有方法的参数。
这就是我们如何对私有方法进行单元测试!
结论
在这篇文章中,我们了解到:
-
是否测试私有方法。
-
如何使用 privateobject 类测试私有方法。
我希望这篇文章对你有用 - 感谢阅读。快乐编码!