테스트 주도 개발, TDD

이정연·2022년 9월 20일
0

Django

목록 보기
3/12
  • 테스트 주도 개발이란 무언가를 개발할 때 바로 개발부터 하는 것이 아닌 개발하려는 항목에 대한 점검 사항을 테스트 코드로 만들고 그 테스트를 통과시키는 방식으로 개발을 진행하는 방법이다.

테스트 주도 개발 과정

1. 테스트 코드 작성

  • 만들고 싶은 기능을 점검할 코드 작성
  • 아직 기능을 구현하지 않았으므로 테스트 결과는 당연히 실패

2. 기능 구현

  • 테스트 코드를 만족시킬 수 있게 기능을 구현
  • 테스트 통과를 최우선으로 생각하고 작업

3. 리팩토링

  • 기능의 성능을 향상시키거나, 재사용성이 좋거나, 가독성이 좋은 코드로 개선
  • 테스트 코드로 다시 기능을 점검

테스트 주도 개발 하는 방법

python manage.py test

테스트 코드 실행 시킴 👉🏻 성공/실패로 출력

샘플 테스트 코드

from django.test import TestCase

# Create your tests here.
class TestView(TestCase):
    def test_post_list(self):
        self.assertEqual(2,3)
  • MTV 중 View를 테스트해보기 위하여 TestView라고 클래스명을 명명
  • TestCase를 상속받음
  • 클래스 안에 test라고 시작되는 함수를 정의함
  • 샘플 코드는 "2=3?"을 테스트 하는 것임

출력 결과

테스트 코드를 실행시킨 결과 아래와 같이 2와 3이 다르다고 출력됨

테스트 코드 수정

from django.test import TestCase

# Create your tests here.
class TestView(TestCase):
    def test_post_list(self):
        self.assertEqual(2,2)

2=2로 수정후 OK 결과가 나옴

테스트 코드 설계법

tests.py에 테스트할 내용 나열

from django.test import TestCase,Client

# Create your tests here.
class TestView(TestCase):
    def setUp(self):
        self.client = Client()
        
    def test_post_list(self):
        #1.1 포스트 목록 페이지를 가져온다.
        #1.2 정상적으로 페이지가 로드된다.
        #1.3 페이지 타이틀은 'Blog'이다.
        #1.4 내비게이션 바가 있다.
        #1.5 Blog, About Me라는 문구가 내비게이션 바에 있다.
        
        #2.1 메인 영역에 게시물이 하나도 없다면
        #2.2 '아직 게시물이 없습니다.'라는 문구가 보인다.
        
        #3.1 게시물이 2개 있다면
        #3.2 포스트 목록 페이지를 새로고침했을 때
        #3.3 메인 영역에 포스트 2개의 타이틀이 존재한다.
        #3.4 '아직 게시물이 없습니다.'라는 문구는 더 이상 보이지 않는다.

주석 👉🏻 실제 코드

  • 테스트를 진행할 때 실제 데이터베이스를 쓰지 않고 가상 데이터베이스를 사용해야 함
  • 그 이유는 실제 DB의 레코드를 괜히 건드렸다가 큰일날 수 있기 때문
from django.test import TestCase,Client
from bs4 import BeautifulSoup
from .models import Post

# Create your tests here.
class TestView(TestCase):
    def setUp(self):
        self.client = Client()

    def test_post_list(self):
        #1.1 포스트 목록 페이지를 가져온다.
        response = self.client.get('/blog/')
        #1.2 정상적으로 페이지가 로드된다.
        self.assertEqual(response.status_code,200)
        #1.3 페이지 타이틀은 'Blog'이다.
        soup = BeautifulSoup(response.content,'html.parser')
        self.assertEqual(soup.title.text,'Blog')
        #1.4 내비게이션 바가 있다.
        navbar = soup.nav
        #1.5 Blog, About Me라는 문구가 내비게이션 바에 있다.
        self.assertIn('Blog',navbar.text)
        self.assertIn('About Me', navbar.text)
        #2.1 메인 영역에 게시물이 하나도 없다면
        self.assertEqual(Post.objects.count(),0)
        #2.2 '아직 게시물이 없습니다.'라는 문구가 보인다.
        main_area = soup.find('div', id='main-area')
        self.assertIn('아직 게시물이 없습니다',main_area.text)

        #3.1 게시물이 2개 있다면
        post_001 = Post.objects.create(
            title = '첫 번째 포스트입니다.',
            content = 'Hello World. We are the world.'
        )
        post_002 = Post.objects.create(
            title = '두 번째 포스트입니다.',
            content = '1등이 전부는 아니잖아요?'
        )
        self.assertEqual(Post.objects.count(),2)
        #3.2 포스트 목록 페이지를 새로고침했을 때
        response = self.client.get('/blog/')
        soup = BeautifulSoup(response.content,'html.parser')
        self.assertEqual(response.status_code, 200)
        #3.3 메인 영역에 포스트 2개의 타이틀이 존재한다.
        main_area = soup.find('div', id='main-area')
        self.assertIn(post_001.title,main_area.text)
        self.assertIn(post_002.title,main_area.text)
        #3.4 '아직 게시물이 없습니다.'라는 문구는 더 이상 보이지 않는다.
        self.assertNotIn('아직 게시물이 없습니다',main_area.text)
  • 장고 테스트에서 client는 가상의 사용자
  • 웹 개발 분야에서 서버에서 요청한 페이지를 찾을 수 없을때 404 성공이면 200
  • beautifulsoup로 HTML은 파싱한다.

테스트 반복 / 수정

  • 테스트 케이스 2.2번 게시물이 없을 경우 처리하는 메시지가 없다.

  • post_list.html에 main-area라는 id가 없다.

  • 따라서 이를 만들어준다.

성공!!! ✅

profile
0x68656C6C6F21

0개의 댓글