python - 编写仅测试函数是否被调用的单元测试有意义吗?

标签 python unit-testing testing

我有以下代码:

def task_completed(task):
    _update_status(task, TaskStatus.COMPLETED)
    successful_task(task)


def task_pending(task):
    _update_status(task, TaskStatus.PENDING)
    successful_task(task)


def task_canceled(task):
    _update_status(task, TaskStatus.CANCELED)
    process_task(task)


def successful_task(task):
    process_task(task)
    send_notification(task)


def process_task(task):
    assign_user(task)
    notify_user(task)
    cleanup(task)


def _update_status(task, status):
    task.status = status
    task.save(update_fields=['status'])

我编写了以下测试:

def test_task_completed(mocker, task):
    mock_successful_task = mocker.patch('services.successful_task')
    task_completed(task)

    assert task.status == TaskStatus.COMPLETED
    mock_successful_task.called_once_with(task)


def test_task_pending(mocker, task):
    mock_successful_task = mocker.patch('services.successful_task')
    task_pending(task)

    assert task.status == TaskStatus.PENDING
    mock_successful_task.called_once_with(task)


def test_task_canceled(mocker, task):
    mock_process_task = mocker.patch('services.process_task')
    task_pending(task)

    assert task.status == TaskStatus.CANCELED
    mock_process_task.called_once_with(task)


def test_successful_task(mocker, task):
    mock_process_task = mocker.patch('services.process_task')
    mock_send_notification = mocker.patch('notifications.send_notification')

    mock_process_task.called_once_with(task)
    mock_send_notification.called_once_with(task)


def test_process_task(mocker, task):
    mock_assign_user = mocker.patch('users.assign_user')
    mock_notify_user = mocker.patch('notifications.notify_user')
    mock_cleanup = mocker.patch('utils.cleanup')

    mock_assign_user.called_once_with(task)
    mock_notify_user.called_once_with(task)
    mock_cleanup.called_once_with(task)

如您所见,test_successful_tasktest_process_task 等测试只是测试特定函数是否被调用。

但是为此编写测试是否有意义,还是我理解有误,我的单元测试很糟糕?我不知道应该如何测试这些功能的另一种解决方案。

最佳答案

根据我的经验,此类测试非常脆弱,因为它们取决于实现细节。单元测试应该只关注被测试方法的结果。理想情况下,这意味着对返回值进行断言。如果有副作用,您可以断言这些副作用。但是你可能应该看看这些副作用并找到不需要它们的不同解决方案。

关于python - 编写仅测试函数是否被调用的单元测试有意义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57062417/

相关文章:

testing - 在编写单元测试时,我应该如何处理函数中的外部依赖?

ruby-on-rails - rails 测试无法识别路径

python - python中if多个条件的简化

python - Pandas有没有相当于Stata fillin的函数?

python - 最大限度地分散所有护士的调度

javascript - 如何 Jest 从覆盖报告生成中删除快照的考虑

android - 带有 Espresso 和 JUnit4 的 AWS 设备场

javascript - Ajax 驱动的 JavaScript 运行时断言框架

testing - 如何从 selenium webdriver 中的 div 类标签中获取文本?

python `os` 返回 `os` 认为不存在的文件