如何正确命名测试方法

时间:2017-09-21 14:20:23

标签: unit-testing methods phpunit

我对如何命名测试方法有一个疑问,因为我最后对一个大项目进行了单元测试,根据我的经验我觉得我设置名称测试方法不好或者更差,这是一个关于我的代码的例子。

public function notificationApproved(Request $request, User $user) {
    $user              = $user->getId();
    $request           = $request->getRequest();
    $this->notification = $this->em->getRepository('AppBundle:Notification')->find(Notification::APPROVED);
    $this->notificationCategory    = NotificationCategory::APPROVED;
    $this->notificationStatus      = $this->em->getRepository('AppBundle:NotificationStatus')->find(1);
    $this->reason                  = $reason;
    //notification approvers project
    foreach ($projectHasUserUnits as $keyData => $valueData) {
        $projectUserUnitResponsability = $valueData->getProjectUserUnitResponsability()->last();                                
        $responsability                = $projectUserUnitResponsability->getResponsabilityProject();
        if (is_null($projectUserUnitResponsability->getEndAt()) && ($responsability->getId() == Responsability::TYPE_RESPONSIBLE || $responsability->getId() == Responsability::TYPE_ACCOUNT_MANAGER || $responsability->getId() == Responsability::TYPE_PROJECT_MANAGER)) {
            $user = $valueData->getUserHasUnit()->getUser();
            if( !in_array($user,$this->users)){
                $this->users[] = $user;
                $description_label = 'notification_description_project_50';
                $short_description = 'notification_content_project_50';
                $notification = $this->generateNotification($Project, $user, $description_label,$short_description);
                if ($notification) {
                    $this->notificationTrigger
                                        ->sendProjectNotification($user, $notification, $Project
                                            , $notification->getDescription(), date('l m-d-y H:i a'));
                }
            }
        }
    }
}

这是一个很重要的方法,我知道,但不要担心它的逻辑,只要看条件,并考虑如何命名这样的方法测试,在这种情况下,当它本身进入所有条件。 ..也许:

test_notificationApprovedWhenAllConditionsAreTrue
test_notificationApprovedWhenProjectHasUserUnitsIsBiggerThanZeroAndProjectUserUnitResponsabilityGetEndAtIsNotNullAndResponsabilityGetIdIsEqualToResponsabilityTYPERESPONSABILITYorResponsabilityGetIdIsEqualToResponsabilityTYPE_PROJECT_MANAGERanduserInArrayIsTrueAndNotificationIsTrue...

你只能想象阅读!

然而,当它出现时只有一个条件比以上更容易!当然!,像这样:

test_notificationApprovedWhenProjectHasUserUnitsIsBiggerThanZeroAndProjectUserUnitResponsabilityGetEndAtIsNotNullAndResponsabilityGetIdIsEqualToResponsabilityTYPERESPONSABILITYorResponsabilityGetIdIsEqualToResponsabilityTYPE_PROJECT_MANAGER

我已尝试在测试中添加注释,但如果测试失败,那么这个想法将指导其名称(以快速修复错误)

那么,你有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我对given<one-or-more-conditions>_action_result命名测试方法有很好的经验。只是一个简单的例子:

test_givenUserUnitGreaterThanZeroAndProjectIdEqualToOne_whenApproveNotification_thenNotificationIsSent()

为了便于阅读,我简化了一些事情,但你明白了。这种命名法取自行为驱动的测试框架。在不需要test_的语言中,您可以保存它。

测试确实是代码质量的良好指标。一般来说,如果编写单元测试很容易,那就是因为要测试的代码具有“好”的质量。您可以遵循一些简单的指导原则:

  • 完全按照用例
  • 列出每个前提条件
  • 正好一个动作。如果没有进行多次测试。
  • 正好一个结果。如果没有提取方法并单独测试它们。
  • 如果方法名称由于许多先决条件而变得太长,那么可能是时候提取一个新类了,因为这个类有太多的责任

答案 1 :(得分:1)

一些建议:如果您添加测试注释,则不需要使用test为方法名称加前缀。

/**
* @test
*/
function givenThis_producesThat () {