TDD가 아닌 BDD: 결과 지향 테스팅

12715 단어 bddtestingtdd

TDD가 클릭되지 않습니다. 해결 방법을 알려주세요.



이전에 TDD(Test Driven Development)와 앱의 로직 대신 프레임워크를 테스트하는 방법에 대해 이야기한 적이 있습니다.

이전 항목을 읽지 않은 경우 여기에서 찾을 수 있습니다.

구조에 대한 BDD(행동 주도 개발)



이번에는 무슨 일이 있어도 테스트를 하기로 결정했기 때문에 모의, 페이크, 인터페이스, 종속성 주입에 중점을 두지 않는 접근 방식을 선택했지만 결과를 확인하는 것이 전부이며 BDD의 목적은 다음과 같습니다. 행동.

내가 해봤어?



예, 저는 이 게시물을 작성하는 것을 허락하지 않았습니다.
)이 기숙사 관리 시스템(학생은 방 검색/예약, 매니저는 예약 승인/거부 및 기숙사 관리)를 완료했습니다.



다음은 전체 프로젝트입니다. "features"폴더에는 테스트가 포함되어 있습니다. https://github.com/coretabs/dorm-portal
자유롭게 홍보하거나 문제를 만드세요.

재미있는 사실



나는 약간 복잡한 필터링 엔진(multiCheckbox/singleCheckbox/integer 필터링 기준이 있는 곳)에서 작업했고, BDD로 약 1주일 만에 완료했습니다... 모든 테스트가 녹색, 우후!

전체 프로젝트가 약 2달만에 끝났고... 올그린 😉

어떻게 BDD를 할 수 있습니까?



정말 간단합니다.

1. 합격 기준 작성(시나리오)



일반적인 방법은 작은 오이(Gherkin) 언어를 사용하는 것입니다. 정말 직관적이므로 두려워하지 마세요. 이 샘플을 살펴보세요(자체 설명이 필요함).

Feature: Reservation

    Scenario: As a student
              I want to make reservations
              So that I get a room to stay in

        Given we have 2 dormitories (and 1 room each available to reserve)
        Given two students who reserved nothing

        When create a reservation
        Then quota of the room should decrease


2. 단계 구현



선택한 언어/프레임워크에 따라 다를 수 있습니다. 저는 django(물론 파이썬과 함께)를 사용하고 있으며, behavior-django 패키지를 사용하는 좋은 방법이 있습니다.

위에서 언급한 수락 기준은 다음과 같습니다.

from behave import given, when, then
from api.engine.models import RoomCharacteristics
from features.steps.factory import (create_alfam_dovec_with_4_rooms,
                                    create_student,
                                    create_reservation)


@given('we have 2 dormitories (and 1 room each available to reserve)')
def arrange(context):
    create_alfam_dovec_with_4_rooms(context)


@given('two students who reserved nothing')
def arrange(context):
    context.user1 = create_student(context, 'Owen')
    context.user2 = create_student(context, 'Tia')


@when('create a reservation')
def act(context):
    context.previous_quota = context.room1.allowed_quota
    context.reservation1 = create_reservation(context.room1, context.user1)


@then('quota of the room should decrease')
def test(context):
    context.room1 = RoomCharacteristics.objects.get(pk=context.room1.id)
    assert context.room1.allowed_quota == context.previous_quota - 1


3. 녹색으로 만들기



이제 실제 코드를 작성하는 부분이 오고 목표는 해당 할당량 테스트를 통과하는 것입니다.

from django.db import (models as django_models, transaction)
from .exceptions import NoEnoughQuotaException


class Dormitory(django_models.Model):
    name = django_models.CharField(max_length=60)


class RoomCharacteristics(django_models.Model):
    allowed_quota = django_models.PositiveIntegerField(default=0)

    dormitory = django_models.ForeignKey(
        Dormitory, related_name='room_characteristics', on_delete=django_models.CASCADE)

    def decrease_quota(self):
        if self.allowed_quota == 0:
            raise NoEnoughQuotaException()

        self.allowed_quota -= 1


class Reservation(django_models.Model):
    user = django_models.ForeignKey(
        User, related_name='reservations', on_delete=django_models.CASCADE)

    room_characteristics = django_models.ForeignKey(
        RoomCharacteristics, related_name='reservations', on_delete=django_models.CASCADE)

    @classmethod
    def create(cls, *args, **kwargs):
        room_characteristics = kwargs['room_characteristics']
        result = cls(*args, **kwargs)

        with transaction.atomic():
            room_characteristics.decrease_quota()
            result.save()
            room_characteristics.save()

        return result


진지하게?! 지루하게 들린다!



아니! 기능을 추가하거나 간단한 것 하나를 변경하면 프로젝트의 다른 많은 부분이 손상될 수 있는 다른 프로젝트에서 일했기 때문에 저를 믿으세요. 문자 그대로 다음과 같이 됩니다.


이미지 출처: 지피

X 기능을 추가하고 고객이 "등록이 작동하지 않습니다"라고 외치면 알게 될 것입니다.

언제 BDD와 TDD를 해야 합니까?





참조


  • 작은 오이 언어: https://docs.cucumber.io/gherkin/reference/
  • Pluralsight의 BDD 과정: https://www.pluralsight.com/courses/pragmatic-bdd-dotnet
  • 다양한 유형의 테스트 설명:
  • 좋은 웹페이지 즐겨찾기