我应该如何测试调用其他功能的功能?

时间:2019-07-16 12:12:40

标签: python unit-testing testing

def task_completed(task: Task) -> None:
  _update_status(task, TaskStatus.COMPLETED)
  _process_task(task)


def task_canceled(task: Task) -> None:
  _update_status(task, TaskStatus.CANCELED)
  _process_task(task)

# ...

def _process_task(task: Task) -> None:
  send_notification(task)  # already tested
  cleanup(task)  # already tested

我已经为“公共”功能send_notificationcleanup编写了测试。由于我将_process_task定义为“私有”函数,因此我不会为此做任何测试。

我应该如何为这些功能编写测试: task_completedtask_canceled

这两个函数都在调用_process_task函数,后者又调用了我已经测试过的函数send_notificationcleanup

我应该只是测试这两个“公共”函数是否被调用,还是应该再次测试这两个函数实际上在做什么?

2 个答案:

答案 0 :(得分:1)

您的函数task_completedtask_canceled以及_process_task不包含计算,仅包含交互。因此,如果这些函数中存在任何错误,将是交互错误:您是否以正确的顺序从正确的组件调用正确的函数,以正确的顺序调用正确的参数值,并按预期提供了结果? (返回值/异常)?

因此,对于这些功能的测试,单元测试没有太大的价值:单元测试是要查找可以在隔离组件中找到的错误。因此,应该在集成测试中测试您的功能:在这里可以实际发现上述错误。因此,您不应重复测试send_notificationcleanup在做什么,而应(以正确的方式)对其进行调用。

一个有趣的方面是有关在这些集成测试中如何处理_process_task的:如果在这些测试中采取黑匣子的方式,则必须对send_notification和{{1} }(从cleanuptask_completed被正确调用)。如果您从玻璃盒子的角度来看,则只需测试一次。这是否有意义取决于许多方面,因此在这里我将不再讨论。

答案 1 :(得分:0)

我将编写一个“黑匣子”测试,仅测试task_canceled和task_completed的行为,而不必担心内部行为。