我建议进行一点思想实验。考虑这段代码:
public void promoteUser(User user)
{
int newRank = computeNew(user);
user.setRank(newRank);
}
private int computeNewRank(User user)
{
return user.getRank() + 1;
}
人们可能会觉得computeNewRank
应该进行测试(真正的实现可能会做更多的事情)。但是让我们暂时忘记这一点,并通过内联的魔力做到这一点:
public void promoteUser(User user)
{
int newRank = user.getRank() + 1;
user.setRank(newRank);
}
这个实验的美妙之处在于它适用于任何规模的私有方法。您总是可以想象自己内联私人成员并问自己“我真正想在这里测试什么?” . 是私有方法本身还是伪装成私有方法的具有全新功能的新类/组件?关键是,您应该很少(如果有的话!)需要测试私有(甚至包/内部)成员。对于外部世界,对于您的合同消费者来说,这些都是无关紧要的细节。
现在,我们当然可以用系统测试代替一切。但是,您的常规工作流程会是什么样子?如果为了测试排名促销代码,您必须登录用户,注册会话,等待 3 分钟,输入促销代码,接收短信,确认......你明白我的意思了。
记住单元测试是为你准备的,而不是相反。您可以弯曲它们、调整它们、使它们合身,这样您就可以交付质量更好的软件。他们的目的不是帮助您实现100% 覆盖率的神奇目标,而是为您提供有关您正在做什么的即时反馈,以便您可以更快地对遇到的错误和故障做出反应。或者换句话说,提高你的生产力。