본문 바로가기
까망 동네/TDD

[예시] TDD 방식으로 개발 해보기

by 까망 하르방 2022. 4. 10.
반응형

해당 포스팅에서는 TDD 개발 방식으로

[소수 찾기] 알고리즘을 검증해 볼 것이다.

📌 TDD (Test Driven Development) 란?

 

TDD (Test Driven Development)란?

「테스트 주도 개발」로 "테스트가 개발을 이끌어 나간다" ① [Red] 실패하는 테스트 코드 먼저 작성 ② [Green]테스트 코드를 성공시키기 위한 프로덕션 코드 작성 ③ [Black] 중복 코드 제거, 일

zoosso.tistory.com

 

 

개발환경으로 Google Test (gTest) 활용하였으며

<Google Test (gTest) 실행해보기>에서는 동작 함수와 테스트 함수를

다른 파일로 분리하였지만

해당 포스팅에서는 하나의 파일에서 작업

 

Google Test (gTest) 실행해보기

💻 Google Test란 무엇일까? Google에서 만든 C++ Test Framework • Windows / Linux 등 다양한 플랫폼 사용 가능 • xUnit 아키텍처 기반 📌 TDD (Test Driven Development) 란? TDD (Test Driven Development..

zoosso.tistory.com

 


TDD 개발 순서

1) 확인 가능한 테스트 코드 부터 작성 (쉽고, Fail 되어도 된다.)

2) 기능 구현하여 테스트 코드와 기본 동작 확인  

3) 추가 테스트 진행 전 리펙토링 과정을 가진다.

4) 예외 처리 확인을 위한 테스트 코드 작성

5) 예외 상황 기능 구현/테스트

6) 과정을 반복하면서 테스트 코드를 추가하고 리팩토링 추가

→ 해당 과정을 통해 입/출력, 인자 개수, 리턴 타입, 예외 처리 등이 결정된다.

→ 미리 예측해서 불필요한 (테스트) 코드를 만들 필요 없다.

→ 기능 구현 코드가 처음부터 유연할 필요가 없다.

 


소수(Prime Number) 판정

소수(Prime Number)란?

1과 자기 자신만을 약수로 가지는 자연수 (> 1)

ex) [6 = 2×3] 으로 합성수에 해당 된다.

 

 

소수 판정 알고리즘

간단하면서 직관적으로 구현해보면 숫자 N이 주어질 때,

1과 N 사이에서 나누어 떨어지는 숫자가 있는지 확인하는 것이다.

여기서 우리는 함수명, 인자 개수/타입, 리턴 타입을 결정한다.

bool isPrime(int N) {
    for (int i = 2; i < N; ++i) {
        if (N % i == 0) return false;
    }
    return true;
}

 

테스트 항목

• 양수 확인

• 경계값 확인  1

• 음수 확인

* 주어지는 요구사항에 따라 테스트 항목 차이가 있음

 


양수 테스트

#include "pch.h"

bool isPrime(int N) {
    for (int i = 2; i < N; ++i) {
        if (N % i == 0) return false;
    }
    return true;
}

TEST(primeTest, PlusTest) {
    EXPECT_FALSE(isPrime(4));
    EXPECT_TRUE(isPrime(5));
    EXPECT_FALSE(isPrime(6));
}

테스트 결과

 

 

여기서 음수와 경계값 테스트 코드를 추가해보자.

#include "pch.h"

bool isPrime(int N) {
    for (int i = 2; i < N; ++i) {
        if (N % i == 0) return false;
    }
    return true;
}

TEST(primeTest, MinusTest) {
    EXPECT_FALSE(isPrime(-1));
    EXPECT_FALSE(isPrime(-10));
}

TEST(primeTest, BoundaryTest){
    EXPECT_FALSE(isPrime(0));
    EXPECT_FALSE(isPrime(1));
}

TEST(primeTest, PlusTest) {
    EXPECT_FALSE(isPrime(4));
    EXPECT_TRUE(isPrime(5));
    EXPECT_FALSE(isPrime(6));
}

테스트 결과

 

 

음수와 경계값을 처리할 수 있는 코드를 추가해보자.

#include "pch.h"

bool isPrime(int N) {
    if (1 >= N) return false;

    for (int i = 2; i < N; ++i) {
        if (N % i == 0) return false;
    }
    return true;
}

TEST(primeTest, MinusTest) {
    EXPECT_FALSE(isPrime(-1));
    EXPECT_FALSE(isPrime(-10));
}


TEST(primeTest, BoundaryTest){
    EXPECT_FALSE(isPrime(0));
    EXPECT_FALSE(isPrime(1));
}

TEST(primeTest, PlusTest) {
    EXPECT_FALSE(isPrime(4));
    EXPECT_TRUE(isPrime(5));
    EXPECT_FALSE(isPrime(6));
}

테스트 결과

 

소수 판정할 수 있는 기본적인 기능과

테스트가 완성되었다.

여기서 TestCase를 좀 더 늘릴 수도 있고,

소수 판정하는 알고리즘 성능을 개선해 볼 수도 있다.

📌 제곱근을 이용한 방식

📌 에라토스테네스의 체 활용

 


제곱근을 이용한 방식

#include "pch.h"

bool isPrime(int N) {
    if (1 >= N) return false;
    for (int i = 2; i*i <= N; ++i)
    {
        if (N % i == 0) return false;
    }
    return true;
}

TEST(primeTest, MinusTest) {
    EXPECT_FALSE(isPrime(-1));
    EXPECT_FALSE(isPrime(-10));
}

TEST(primeTest, BoundaryTest){
    EXPECT_FALSE(isPrime(0));
    EXPECT_FALSE(isPrime(1));
}

TEST(primeTest, PlusTest) {
    EXPECT_FALSE(isPrime(4));
    EXPECT_TRUE(isPrime(5));
    EXPECT_FALSE(isPrime(6));
}

테스트 결과

 

기존 Test를 활용해서 코드 구조 변경 검증이나

성능 테스트를 용이하게 할 수 있다.

그리고 테스트 자체가 기능 명세 역할도 할 수 있다.

 

테스트 코드 작성이 초기에는 생산성을 저하시킬 수 있지만

복잡한 프로그램을 유지보수할 때,

생산성을 높여줄 수 있다.

반응형

'까망 동네 > TDD' 카테고리의 다른 글

[googletest] 테스트 픽스처(Test Fixture)란?  (0) 2022.04.12
Google Test (gTest) 실행해보기  (0) 2022.04.02

댓글