https://docs.djangoproject.com/en/3.2/topics/testing/overview/
테스트 실행 방법
python mange.py test
django 각각의 앱들을 순회하면서 모든 test.py 를 가져와서 클래스들을 불러오게 됨
class 내부에 test_
로 시작하는 함수들을 실행하고 그 결과를 반환하게 됨
setUp
함수는 단위테스트를 실행하기 전에 공통적으로 수행할 어떤 작업의 내용을 넣어줌.
여기에 쓴 코드는 test_
가 붙은 함수들에 decorator처럼 붙어서 테스트 실행시 setUp
먼저 실행되고 test_
함수가 실행된다고 보면 됨
from django.test import TestCase
from django.test import Client
from .models import Article
from django.contrib.auth import get_user_model
class ArticleTest(TestCase) :
def setUp(self) :
User = get_user_model()
user = User.objects.create_user(username='test', password='123') # 새 계정만듬 - 회원가입
Article.objects.create(title='hello', user=user) # 회원가입한 계정으로 게시글 생성
def test_article_title(self) :
article=Article.objects.get(pk=1)
self.assertEqual(article.title, 'hello')
def test_article_create(self) : # 게시물을 저장하기 위해 이 요청을 보냈을 때 재대로 저장이 되는지 평가
c = Client() # 우리가 브라우저로 켜는 것 대신 얘가 요청을 보내고 처리를 대신 해줌
# 0. 로그인 확인
res = c.get('articles/create') # 'articles/create' 주소로 get 요청을 보내고, res에 그 응답내용을 저장
self.assertEqual(res.status_code, 302) # res.status_code와 302가 같은지 비교, 같지 않다면 에러가 발생함.
# 1. /articles/create/ 로 GET 요청
c.login(username='test', passwrod='123') # 로그인
res = c.get('articles/create/') # article/create 로 이동 후 res 저장
self.assertEqual(res.status_code, 200)
self.assertTemplateUsed(res, 'articles/article_form.html') # html 파일이 일치하는지 확인
self.assertContains(res, '<h1>form</h1>') # html 문서 안에 원하는 데이터가 있는지
# 2. /articles/create/ 로 POST 요청(invalid)
res = c.post('articles/create/') # 게시글 내용없이 요청을 보내봄
self.assertContains(res, 'This field is required') # 잘 튕겨져 나오는지 확인
self.assertEqual(res.status_code, 200)
# 3. /articles/create/ 로 POST 요청(valid)
before = Article.objects.last() # 게시물 작성 전 맨 뒤에 게시글
res = c.post('articles/create/', {'title':'hi'}) # 새 게시물 작성
after = Article.objects.last() # 게시물 작성 후 맨 뒤에 게시글
self.assertEqual(res.status_code, 302)
self.assertEqual(res.url, 'articles/2/') # 페이지 잘 이동되었는지 확인
self.asertNotEqual(before, after) # 새글이 잘 들어갔는지 확인/ before와 after는 서로 달라야함
def test_article_list(self) :
c=Client()
res = c.get('articles/')
context_articles = res.context.get('articles')
queryset_articles = Article.objects.all()
self.assertEqual(list(context_articles), list(queryset_articles))
self.assertTemplateUsed(res, 'articles/article_list.html')
https://docs.djangoproject.com/en/3.2/topics/testing/tools/#provided-test-case-classes
standard library unittest 의 TestCase
TestCase
LiveServerTestCase
백그란운드에서 라이브 Django 서버를 시작하고 해체시 종료됨
Django 더미 클라이언트(Selenium 클라이언트 등) 이외에 자동화 된 테스트 클라이언트를 사용하여 브라우저 내에서 일련의 기능 테스트를 실행하고 실제 사용자의 작업을 시뮬레이션 할 수 있음
https://docs.djangoproject.com/en/3.2/topics/testing/tools/#liveservertestcase
TransactionTestCase
SimpleTestCase
TestCase
: unittest 프레임 워크의 테스트 조직의 기본 단위Fixture
: 테스트를 진행할때 필요한 테스트용 데이터 혹은 설정 등을 이야기 한다. 주로 테스트 가 실행되기 전이나 후에 생긴다.assertion
: unittest에서 테스트 하는 부분이 제대로 됬는지를 확인하는 부분. Assertion이 실패하면 테스트도 실패한다.setUp()
:이렇한 사전 준비 작업을 위해 이라는 메서드를, tearDown()
: clean up 처리를 위해 이라는 메서드를 제공합니다. 가장 단위에 집중
각 유닛 테스트는 독립적
테스트 시간을 최대한 단축해야한다.
그날 코딩을 시작할 때, 끝날 때 풀 테스트 슈트를 돌리는게 좋다.
테스트 함수의 이름은 최대한 길고, 자세하고 서술적인 이름으로 작성할 것
글 정말 잘읽었습니다. 감사합니다.