기본적인 Django tests.py 파일
Django에서 앱을 만들면 앱 폴더가 생기고 그 안에 테스트 코드를 작성할 수 있는 tests.py 파일이 포함되어 있다.
그래서 해당 파일에 테스트 코드를 작성하고 실행할 때 python manage.py test 코드만 치면,
장고가 알아서 모든 test 파일 위치를 찾아내 실행시켜준다.
python manage.py test
그러나 이번 프로젝트를 하며 앱이 여러개이기도, 테스트 코드를 기능별로 파일로 나눠 작성하고 싶었기에
tests 폴더를 만들기로 결정했다.
Tests 폴더 만들기
app 단위로 개발하고 테스트 코드를 돌릴 것이기에, app 폴더 안에 tests 폴더를 만들었다.
이때 test가 아닌 tests 로 꼭 이름을 설정한다.
그런 다음 아래에 자유롭게 테스트 코드 파일을 작성하면 된다.
Unittest 테스트 코드 작성
아래는 장고 document 사이트에 소개된 테스트 코드이다.
해당 테스트는 unittest로, 파이썬 표준 라이브러리 unittest를 이용한다.
테스트를 위해서는 TestCase를 import 하고, 테스트 할 함수들을 가진 클래그가 TestCase를 상속받도록 한다.
self.assertEqual()등을 사용하여 test를 검증한다.
from django.test import TestCase
from myapp.models import Animal
class AnimalTestCase(TestCase):
def setUp(self):
Animal.objects.create(name="lion", sound="roar")
Animal.objects.create(name="cat", sound="meow")
def test_animals_can_speak(self):
"""Animals that can speak are correctly identified"""
lion = Animal.objects.get(name="lion")
cat = Animal.objects.get(name="cat")
self.assertEqual(lion.speak(), 'The lion says "roar"')
self.assertEqual(cat.speak(), 'The cat says "meow"')
테스트 코드 실행
장고는 테스트 코드 실행도 다채롭게 기능을 지원한다.
단순 test만 적으면 모든 테스트코드를 돌리고, 뒤에 module이나 패키지명, case, 함수명 까지도 세분화하여 테스트 코드를 돌릴 수 있다.
(공식 문서 예시)
# Run all the tests in the animals.tests module
$ ./manage.py test animals.tests
# Run all the tests found within the 'animals' package
$ ./manage.py test animals
# Run just one test case
$ ./manage.py test animals.tests.AnimalTestCase
# Run just one test method
$ ./manage.py test animals.tests.AnimalTestCase.test_animals_can_speak
글쓴이의 경우 apps > app 이름 > tests > 테스트 코드파일.py 만 돌리고 싶었기에, 다음 명령어를 이용하였다.
python manage.py test apps.data_collection.tests.test_views
# Python manage.py test {패키지명}.{tests폴더}.{테스트파일이름}
이때 주의할 것이 폴더명이 아닌 패키지명을 입력해야한다.
처음에 폴더명인줄 알고 삽질을 했다가, 다시 읽고 잘못 하고 있음을 알아챘다.
패키지명은 프로젝트 상위 폴더의 settings.py에 정의된 INSTALLED_APPS 에 등록된 이름을 말한다.
실행하면 uniitest 결과가 잘 나온다.!
여기서 끝이 아니다.
더 나아가 실제 현업에 가면 거의 필수절차로 불리는 Test Coverage까지 해보자
Test Coverage란?
시스템 혹은 소프트웨어 테스트가 얼마만큼 충분한지 나타낸 것이다.
즉, 수행한 테스트가 테스트 대상을 얼마나 잘 커버했는지 나타내는 것이다.
특강을 맡아주신 Max(한기용 님)에 의하면, coverage 70% 이상이면 괜찮다고 하셨다.
장고에서도 coverage를 사용하는 법을 소개해보고자 한다.
pip install coverage
pip install coverage
coverage 사용을 위해 라이브러리를 설치하자
coverage 테스트 진행
coverage run --source="프로젝트경로" manage.py test (테스트할 파일/모듈 등)
원래 장고 test 실행하던 명령어 앞에 'coverage run --source="프로젝트경로" " 만 붙여주고,
뒤에는 python 때고 'manage.py (test할 부분)' 로 작성하면 된다.
이때 프로젝트 경로가 헷갈릴 수 있는데, 제일 간편한것은
장고 프로젝트의 맨 상단으로 가서, cmd 창을 열고 경로 칸에 "." 을 입력하면 된다.
즉, coverage run --source="." manage.py test (테스트할 코드) 를 입력하면 된다.
예시는 다음과 같다.
coverage run --source="." manage.py test apps.data_collection.tests.test_chosun_article_crawler.TestChosunArticleCrawler
실행하면 그냥 test 코드 돌렸을 때와 같고,
coverage 결과를 보려면
coverage report 혹은 coverage html 명령어를 입력하면 확인할 수 있다.
coverage report
coverage result
coverage report의 경우 테스트코드가 파일별 커버리지를 몇 % 만족하는지 "파일 | 커버리지 %" 로 cmd창에 출력해준다.
반면 coverage html은 프로젝트 상위 폴더에 coverage 결과를 담은 'htmlcov' 폴더안에 'index.html'파일로 조회하면 웹 형식으로 결과를 확인할 수 있다.
이때 웹이라서, 상세 파일을 누르면 페이지가 넘어가면서 어떤 부분을 coverage 못했는지까지 보여준다.
(coverage 툴 짱이다...👍👍)
그 외에도 coverage 기능은 많으니 help 명령어로 확인해보면 좋겠다.
이상으로 Django에서 테스트 코드 돌리기 with coverage 글을 마친다.
참고 docs
https://docs.djangoproject.com/ko/4.2/topics/testing/
https://docs.djangoproject.com/ko/4.2/topics/testing/overview/
'#️⃣ Project 및 개발일지 > 개발일지' 카테고리의 다른 글
[Django] 장고 Logging하기 (0) | 2023.05.03 |
---|---|
[크롤링] beautifulsoup 값 안 가져와짐 - 정적 페이지 판단법 (0) | 2023.05.03 |
[오류해결] Selenium 사용시 target frame detached (failed to check if window was closed: disconnected: Unable to receive message from renderer) 에러 - screen 사용 (0) | 2023.05.03 |
[AWS EC2] SSH 연결: Permission denied (publickey) 오류 해결 (0) | 2023.04.26 |
[Docker] Python 크롤러 프로젝트 Docker image로 EC2로 배포하기 (0) | 2023.04.24 |