【发布时间】:2011-05-06 15:26:14
【问题描述】:
最近我一直在阅读 Roy Osherove 的《单元测试的艺术》一书,我在想如何处理这种情况:
假设我有一个大方法,通过完成不同的任务,根据传递的参数完成一个业务流程:
public void MonsterMehtod(Parameters p)
{
// Some processes to accomplish TASK_A
// ....
// Some processes to accomplish TASK_B
// ....
// Some processes to accomplish TASK_C
// ....
}
我想在这个方法上写测试。
所以,如果我把这个大方法排除在像这样的小方法之外:
public void MonsterMethod(Parameters p)
{
Task_A(p);
Task_B(p); //Can behave different depending on Task_A(p) results
Task_C(p); //Can behave different depending on Task_A(p) and Task_B(p) results
}
我为每个任务编写单元测试,如下所示:
[Test]
public void Task_A_AllPossibleConditionsWithParameterP_ExpectedBehaviours() {}
[Test]
public void Task_B_AllPossibleConditions_ExpectedBehaviours()
{
// Tests all possible expected behaviours based on injected parameters
// Tests all possible expected behaviours based on method Task_A(Prameters p) results
}
[Test]
public void Task_C_AllPossibleConditions_ExpectedBehaviours()
{
// Tests all possible expected behaviours based on injected parameters
// Tests all possible expected behaviours based on method Task_A(Prameters p) results
// Tests all possible expected behaviours based on method Task_B(Prameters p) results
// Tests all possible expected behaviours based on method Task_C(Prameters p) results
}
那么,毕竟为 MonsterMethod(Parameters p) 写另一个测试有意义吗:
[Test]
public void MonsterMehtod_AllPossibleParameterConditions_ExpectedBehaviours {}
也许我至少可以编写一个测试来检查是否调用了所有 Task_A()、Task_B()、Task_C() 方法但是虽然我对每个子任务都有所有单元测试,但值得拥有吗?包含所有这些子任务的 MonsterMethod(Parameters p) 的另一个测试(也许应该称为集成测试而不是单元测试)?
【问题讨论】:
标签: c# .net unit-testing integration-testing