QA

효과적인 BDD 적용을 위한 도구 소개 (Behave, CSpec)

yoongrammer 2024. 11. 13. 16:42
728x90

소프트웨어 개발에서 행동 주도 개발(Behavior-Driven Development, BDD)은 팀원 간의 협업을 촉진하고 소프트웨어 품질을 높이는 중요한 방법입니다.
효과적으로 BDD를 적용하기 위해서는 적절한 도구의 사용이 필수적입니다.
이번 글에서는 BDD를 지원하는 주요 도구인 BehaveCSpec을 살펴보고, 그 특징과 사용 방법에 대해 알아보겠습니다.

1. Behave


Behave는 Python 환경에서 BDD를 구현하기 위한 대표적인 프레임워크입니다.
이 도구는 Gherkin이라는 자연어 기반의 문법을 사용하여 비기술적인 요구사항을 테스트 시나리오로 표현할 수 있어, 개발자와 비개발자 간의 원활한 소통을 돕습니다.

1.1. Behave의 주요 특징

  • Python 기반: Python으로 작성된 다양한 프로젝트에서 최적화되어 있으며, Django와 같은 웹 프레임워크와도 잘 호환됩니다.
  • Gherkin 문법 지원: “Given, When, Then” 구조의 자연어 표현을 사용하여, 비개발자도 이해할 수 있는 시나리오 작성이 가능합니다.
  • 확장성: 다양한 플러그인을 통해 다른 테스트 도구와 쉽게 통합할 수 있습니다.

1.2. 설치 및 사용 예시

설치

pip install behave

디렉토리 구조

Behave를 사용할 프로젝트의 기본 디렉토리 구조는 아래와 같습니다. features 폴더에 시나리오와 단계별(step) 파일을 구성합니다.

project/
├── features/
│   ├── calculator.feature
│   └── steps/
│       └── calculator_steps.py
└── calculator.py

Feature 파일 작성 예시 (calculator.feature)

BDD 시나리오를 작성하는 Feature 파일입니다. 예시로 간단한 계산기 기능을 테스트하는 시나리오를 작성해 보겠습니다.

Feature: 계산기 기능

  Scenario: 두 수를 더한다
    Given 계산기에 2와 3을 입력하고
    When 더하기를 수행하면
    Then 결과는 5가 되어야 한다

  Scenario: 두 수를 뺀다
    Given 계산기에 5와 3을 입력하고
    When 빼기를 수행하면
    Then 결과는 2가 되어야 한다

기능 코드 예시 (calculator.py)

간단한 더하기와 빼기 기능을 가진 코드입니다.

def add(a, b):
    return a + b

def substract(a, b):
    return a - b

테스트 코드 예시 (calculator_steps.py)

각 시나리오 단계에 맞는 테스트 코드를 작성합니다.

from behave import given, when, then
from calculator import add, substract

@given('계산기에 {a:d}와 {b:d}을 입력하고')
def step_given_input_numbers(context, a, b):
    context.a = a
    context.b = b

@when('더하기를 수행하면')
def step_when_add(context):
    context.result = add(context.a, context.b)

@when('빼기를 수행하면')
def step_when_subtract(context):
    context.result = substract(context.a, context.b) + 10 # 의도적으로 실패를 유도

@then('결과는 {expected:d}가 되어야 한다')
def step_then_check_result(context, expected):
    assert context.result == expected, f"Expected {expected}, but got {context.result}"
728x90

테스트 실행 및 결과

테스트를 실행하여 결과를 확인합니다.

$ behave

Feature: 계산기 기능 # features/calculator.feature:1

  Scenario: 두 수를 더한다      # features/calculator.feature:3
    Given 계산기에 2와 3을 입력하고 # features/steps/calculator_steps.py:5 0.000s
    When 더하기를 수행하면        # features/steps/calculator_steps.py:11 0.000s
    Then 결과는 5가 되어야 한다    # features/steps/calculator_steps.py:21 0.000s

  Scenario: 두 수를 뺀다       # features/calculator.feature:8
    Given 계산기에 5와 3을 입력하고 # features/steps/calculator_steps.py:5 0.000s
    When 빼기를 수행하면         # features/steps/calculator_steps.py:16 0.000s
    Then 결과는 2가 되어야 한다    # features/steps/calculator_steps.py:21 0.000s
      Assertion Failed: Expected 2, but got 12

두 번째 시나리오에서 예상 결과와 실제 결과가 일치하지 않음을 알 수 있습니다.

2. CSpec


CSpec은 C 언어로 BDD 스타일의 테스트를 작성할 수 있도록 지원하는 프레임워크입니다.
특히 C 언어로 작성된 애플리케이션이나 임베디드 시스템에서 BDD를 적용하기에 적합하며, 테스트를 구조화하고 가독성을 높이는 데 도움이 됩니다.

2.1. CSpec의 주요 특징

  • C 언어 친화적: C 언어로 작성된 프로젝트에서 BDD 적용이 가능합니다.
  • 간단한 DSL 사용: describe, it 구문을 통해 테스트 시나리오를 명확하게 작성할 수 있습니다.

2.2. 설치 및 사용 예시

설치

git clone https://github.com/mumuki/cspec.git
cd cspec
sudo make install

디렉토리 구조

project/
├── src/
│   ├── calculator.c
│   └── calculator.h
└── test/
    └── test_calculator.c

기능 코드 예시 (calculator.c, calculator.h)

간단한 더하기와 빼기 기능을 가진 코드입니다.

// src/calculator.h
int add(int a, int b);
int subtract(int a, int b);
// src/calculator.c
#include "calculator.h"

int add(int a, int b) {
    return a + b;
}

int subtract(int a, int b) {
    return a - b;
}

테스트 코드 예시 (test_calculator.c)

아래 코드는 describe, it 구문을 사용하여 테스트를 구조화한 예시입니다.

#include <cspecs/cspec.h>
#include "calculator.h"

context (complete_example) {
    describe("계산기 기능") {

        it("두 수를 더한다") {
            int a = 2;
            int b = 3;
            int result = add(a, b);
            should_int(result) be equal to(5);
        } end

        it("두 수를 뺀다") {
            int a = 5;
            int b = 3;
            int result = subtract(a, b) + 10; // 실패를 위해 10을 더함
            should_int(result) be equal to(2);
        } end

    } end
}

컴파일 및 테스트 실행

gcc -o test_calculator test/test_calculator.c src/calculator.c -lcspecs -Isrc
./test_calculator 

실행 결과

  계산기 기능
    ✔ 두 수를 더한다
    ✖ 두 수를 뺀다

===========
SPEC REPORT
===========
  Summary

    1 success
    1 failure

  Failure details:

    1) 계산기 기능 - 두 수를 뺀다
      - Expected <2> but was <12> [test/test_calculator.c:28]

3. 결론


Behave와 CSpec을 통해 Python과 C 언어 프로젝트에 효과적으로 BDD를 적용할 수 있습니다.
Behave는 Gherkin 문법을 활용해 개발자와 비개발자 간 소통을 원활하게 하고, CSpec은 C 프로젝트에서 BDD 스타일의 테스트를 가능하게 합니다.

728x90