효과적인 BDD 적용을 위한 도구 소개 (Behave, CSpec)
소프트웨어 개발에서 행동 주도 개발(Behavior-Driven Development, BDD)은 팀원 간의 협업을 촉진하고 소프트웨어 품질을 높이는 중요한 방법입니다.
효과적으로 BDD를 적용하기 위해서는 적절한 도구의 사용이 필수적입니다.
이번 글에서는 BDD를 지원하는 주요 도구인 Behave와 CSpec을 살펴보고, 그 특징과 사용 방법에 대해 알아보겠습니다.
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}"
테스트 실행 및 결과
테스트를 실행하여 결과를 확인합니다.
$ 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 스타일의 테스트를 가능하게 합니다.