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_notification
和cleanup
编写了测试。由于我将_process_task
定义为“私有”函数,因此我不会为此做任何测试。
我应该如何为这些功能编写测试:
task_completed
和task_canceled
这两个函数都在调用_process_task
函数,后者又调用了我已经测试过的函数send_notification
和cleanup
。
我应该只是测试这两个“公共”函数是否被调用,还是应该再次测试这两个函数实际上在做什么?
答案 0 :(得分:1)
您的函数task_completed
,task_canceled
以及_process_task
不包含计算,仅包含交互。因此,如果这些函数中存在任何错误,将是交互错误:您是否以正确的顺序从正确的组件调用正确的函数,以正确的顺序调用正确的参数值,并按预期提供了结果? (返回值/异常)?
因此,对于这些功能的测试,单元测试没有太大的价值:单元测试是要查找可以在隔离组件中找到的错误。因此,应该在集成测试中测试您的功能:在这里可以实际发现上述错误。因此,您不应重复测试send_notification
和cleanup
在做什么,而应(以正确的方式)对其进行调用。
一个有趣的方面是有关在这些集成测试中如何处理_process_task
的:如果在这些测试中采取黑匣子的方式,则必须对send_notification
和{{1} }(从cleanup
和task_completed
被正确调用)。如果您从玻璃盒子的角度来看,则只需测试一次。这是否有意义取决于许多方面,因此在这里我将不再讨论。
答案 1 :(得分:0)
我将编写一个“黑匣子”测试,仅测试task_canceled和task_completed的行为,而不必担心内部行为。