CS

TDD란???

jmboy 2024. 4. 23. 22:47

TDD

Test Driven Development

  • 매우 짧은 개발 사이클의 반복에 의존하는 개발 프로세스이다.
  • 개발자는 우선 요구되는 기능에 대한 테스트 케이스를 작성하고, 그에 맞는 코드를 작성해 테스트를 통과한 후에 상황에 맞게 리팩토링 하는 테스트 주도 개발 방식을 의미한다!
  • 개발자는 테스트를 작성하기 위해 해당 기능의 요구사항을 확실히 이해해야 한다! 그렇기 때문에 요구사항에 집중할 수 있지만, 테스트를 위한 진입장벽과 코드의 증가가 단점이다!

1. 테스트 케이스 작성

만들고 싶은 기능을 점검할 테스트 코드를 작성한다. 이때, 아직 기능 코드를 구현하지 않았으므로 테스트 결과는 실패로 반환된다. 실패하는 테스트를 가장 빠르게 구현하는 방법은 아무 값이나 반환하도록 하는 것이다.

2. 테스트 케이스를 통과하는 코드 작성

테스트 코드를 만족시킬 수 있는 기능을 구현한다. 테스트 통과를 최우선으로 생각하며 작업한다. 즉 단위 테스트를 통과할 수 있을 정도의 최소한의 코드만 작성한다.

3. 작성한 코드 리팩토링

기능의 성능이 향상되며, 재사용성이 좋고, 가독성이 좋은 코드로 기능 코드를 개선한다. 테스트 코드를 통해 다시 기능 코드를 점검한다. → 기능 테스트가 완전해질 때까지 2, 3의 과정을 반복한다.

예시

  • 테스트 코드를 작성한다. 여기서는 factorial(5)를 돌렸을 때 120이 결과값으로 나와야 한다.
    import unittest
    class TDDTest(unittest.TestCase):
    def test_factorial(self):
    self.assertEqual(120, factorial(5))
    
    if name == 'main':
    unittest.main()

 

* 이후 코드를 작성한다. 



import unittest

def factorial(i):
    if i > 1:
        return i * factorial(i-1)
    else:
        return i

class TDDTest(unittest.TestCase):
    def test_factorial(self):
        self.assertEqual(120, factorial(5))

if __name__ == '__main__':
    unittest.main()

이런 식으로 테스트-> 코드 작성-> 리팩토링 의 형식으로 코드 개발을 해나간다.

 

 

좋은 TDD의 특징 (FIRST 규칙)

Fast 
# 테스트는 빠르게 동작하여 자주 돌릴 수 있어야 한다.
Independent 
# 각각의 테스트는 독립적이며 서로 의존해서는 안 된다.
Repeatable
# 어느 환경에서도 반복할 수 있어야 한다.
Self-Validating 
# 테스트는 성공 또는 실패로 bool 값으로 결과를 내어 자체적으로 검증되어야 한다.
Timely
# 테스트는 적시에 즉, 테스트하려는 실제 코드를 구현하기 직전에 구현해야 한다.

 

 

참고 사이트

https://www.incodom.kr/%ED%85%8C%EC%8A%A4%ED%8A%B8_%EC%A3%BC%EB%8F%84_%EA%B0%9C%EB%B0%9C#h_264da74d75511b90240b38dbf17d6b37

 

다음에는 Agile 방법론에 대해서 살펴보겠습니다!!!