【问题标题】:Is it worth writing a test for a method which has calls to other methods that are 100% covered by individual unit-tests?是否值得为调用其他方法的方法编写测试,这些方法100%被单个单元测试覆盖?
【发布时间】: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


    【解决方案1】:

    我会说这是值得的。如果你最终删除了一些内部任务,那么你的 Monster 方法仍然会被测试。

    【讨论】:

    • 但这是否意味着我应该为更大的测试重复一些测试?你有什么策略吗?
    【解决方案2】:

    如果您编写一种方法,那么它可能会与您已有的任何其他方法有所不同。然后测试它是否正确地执行了其他操作(是否正确组合其他函数的结果)很有用。

    【讨论】:

      【解决方案3】:

      您应该使用您期望它处理子任务的方式来测试 Monster 方法。但是,这并不意味着您需要执行子任务。

      我建议删除子方法,并单独测试 Monster 方法。

      这可以通过将每个 Task 方法虚拟化并使用模拟框架来存根子方法来轻松完成,或者只是自己手动完成。

      【讨论】:

      • Joseph,例如:我将为 Tes_A() 创建一个存根,以创建在 Monster 方法中测试 Test_B() 方法的可能条件。但也许我会使用接口而不是使用虚拟方法。无论如何,谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多