[ Django, Python ] 튜토리얼 예제로 살펴보는 Django 분석 ⑤ : 자동화 테스트(Automated Test) - 2
・뷰(View) 수정하기
설문 조사 목록에는
아직 게시되지 않은 설문 조사가 표시될 것이기에
표시되지 않도록 수정해보자.
먼저 이전 튜토리얼
4장에서 클래스 기반의
View로
다시 작업하였는데
그 부분 중 IndexView의 get_queryset 메소드를 수정할 것이다.
현재와 미래를 비교해야만 하기 때문에
timezone을 import 해야한다.
원래 코드를 주석처리하고,
빨간색 박스와 같이
코드를 수정한다.
여기서
Question.objects.filter(
pub_date__lte = timezone.now() )는
Timezone.now 보다 pub_date가 작거나 같은
Question을 반환 하는 코드이다.
여기서 pub_date 이름 뒤에 붙은
__lte는 filter의 [1]조건 키워드로 같거나 작다(<=)를 의미한다.
즉, 지금이거나 과거일
경우 queryset을 반환하게 된다는
이야기 이다.
공식 도큐먼트에서는
여기서 끝내버리지만
나는 실제로 잘 작동하는지를
보고 싶기 때문에
미래의 데이터를 넣어
확인한 다음
그 데이터를 과거로 바꿔
제대로 화면에 출력하는지를 확인할 것이다.
그렇기 위해서는 먼저 shell로 진입해야 한다.
데이터를 넣었다면 명령어를 통해
데이터가 정상적으로 들어가 있는지 확인한다.
그런 후 서버를 가동하고
브라우저로 데이터가 나타나지 않는지 확인해 보자.
위의 사진과 같이
Shell을 통해 등록했던
future
Question text가 보이지 않는 것을
확인 할 수 있다.
그렇다면 역으로 등록했던 것의 날짜를
바꾼다면 제대로 보이는지 확인해보자.
등록한 데이터가 과거일
경우 정상적으로 출력되는 것을 알 수 있다.
물론 위와 같이 shell에서
데이터를 추가하고 수정하지 않고도
django에서 제공해주는
관리자
앱을 사용한다면 좀 더 손쉽게
데이터를 추가 및
수정하여 확인해 볼 수 있다.
관리자 앱에 대한 내용은
이전 포스팅을 참고하길 바란다.
마지막으로 자동화 테스트를 작성할 것이다.
이번 자동화 테스트는
1개의 클래스(함수 5개)와 1개의 함수로
총 6개의 테스트 케이스를
만들 것 이다.
먼저
자동화 테스트 과정
중에 사용할 create_question
함수,
여기서 days인수는 과거의 설문조사와
미래의 설문조사를 나누는 일 수를 말한다.
예를 들어
이번 자동화 테스트에서는
이 인수에 미래의
경우 30이 과거의 경우 -30이 들어가는데
오늘 기준 pub_date가 30일 후의 경우
미래에
진행할 설문 조사 목록이며
오늘 기준 pub_date가 30일 이전에 경우에는
과거에 끝난 설문조사 목록이 된다.
시행할 설문 조사가
없을 경우,
설문 조사 목록 중에
pub_date가 과거인 설문조사를
페이지에 출력하는
Test_past_question함수
설문 조사 목록 중에
pub_date가 미래인 설문조사를
페이지에 출력하는
Test_future_question 함수
설문 조사 목록 중에
과거의 끝난 설문
조사와 미래에 진행할 설문 조사 둘 다 존재할 경우
과거에 끝난 설문조사만
출력하는
Test_future_question_and_past_question 함수
마지막으로
설문 조사 목록 중에서
과거에 끝난 설문 조사와
미래에 진행할 설문 조사 둘 다 출력하는
Test_two_past_question
함수이다.
이 6가지 함수 중에는
새롭게 사용되는 메소드들이 있기 때문에
이에 대해 살펴보고
가는 것이 옳을 것이라 생각 된다.
하나의 함수만 살펴보고자
하는데,
Test_fufure_question_and_pass_question
함수를 살펴보려고
한다.
Test_future_question_and_past_question
함수는 위와 같으며
먼저 create_question함수부터 살펴보려고
한다.
Create_question
함수는 2가지의 매개변수를
가지고 있는데
매개변수 question_text는 만들고자하는 질문의
텍스트를
매개변수 days는 가산하고 싶은
날의 수를 입력 받는다.
지역변수 time에는 현재의 시간과
매개변수 days에 들어있는 수를
더한다.
여기서 datetime.timedelta
함수는 date형을 리턴해주는 함수로
시간을 더 할 때
사용한다.
자세한 것은 아래
링크를 참고하길 바란다.
https://www.geeksforgeeks.org/python-datetime-timedelta-function/
Return 값은 model인
Question 클래스에 명시되어
있는 코드의 오브젝트를 생성하고,
오브젝트의 지역변수인
question_text에는
매개변수 qeustion_text의 문자열을,
지역변수인 pub_date에는
매개변수 현재 시간에
days를 합산한 시간을
넣는다.
따라서 리턴 되는
것은 model에서의 Question 오브젝트이고
이 오브젝트 안에는
질문 문자열과
현재 시각에 매개변수
days에서 받은 일수를
더한 시간 값이 들어 있다.
다음으로 지역 변수 response에는
reverse함수를 이용해 urls에서
이름이 polls로 지정되어 있는
url패턴
안에 이름이 index로 되어있는 경로를
얻어 온다.
코드는 아래와 같다.
그리고 url 패턴을 통해 참조해야하는
View가
어떤 Vew인지 알 수 있게
되었는데,
바로 IndexView이다.
위의 사진이 IndexView이다.
빨간색 박스와 같이
이전에 다른 제너릭 뷰 들과는 다르게
Context_object_name이라는 지역변수를
따로 설정해 준적이 있다.
IndexView의 경우 많이 사용할
것 같은
View들을 미리 만들어
놓은 제너릭 뷰들 중 하나로
JAVA에서의 인터페이스를
Django에서 제공해준다고
생각하면 이해하기 쉬울 것 이다.
어쨌든 IndexView는 ListView라는 제너릭 뷰 인데,
List 자료형의 변수를 가지고
있는 View이다.
따라서 데이터 입/출력이 필요 할 때
IndexView를 이용하게 될 것이다.
작성을 완료했다면,
실제 테스트를 시행해보자.
작성한 자동화 테스트를
시행해보자.
이전에 작성한 2개의 자동화 테스트
함수와
이번에 작성한 6개의 자동화 테스트
함수를 합해
총 8개의 자동화 테스트를
시행한 결과
작성한 코드의 문제가 없음을 확인했다.
・DetailView 테스트하기
지금까지 작성한 코드들은 잘 작동된다.
하지만 미래에 진행할 설문들은
페이지에 나타나지는
않지만,
사용자가 URL을 알고 있거나,
추측한다면 접근할
수 있다.
따라서 DetailView도 IndexView
때와
마찬가지로 유사한 제약조건을 추가할 필요가 있다.
빨간색 박스와 같은
함수를 추가한다면,
쿼리를 불러올 때 미래의 값들은 불러오지 않는다.
또한 위와 같이
시간이 지난 pub_date 값을 가지고 있는
설문은 표시되고
미래의 pub_date는 표시되지 않는
테스트 케이스도 추가하자.
[1] 조건 키워드 :
키워드 |
설명 |
__lt / __gt |
작다 / 크다 |
__lt /
__gte |
작거나 같다/ 작거나 크다 |
__in |
리스트([1,2,3와 같은]) 의 데이터와 동일한 검색 |
__year
/ __month / __day |
년, 달, 일 검색 |
__isnull |
Null인 값 검색 |
__contains |
지정한 문자열을 포함하는 데이터를 검색 |
__icontains |
지정한 문자열을 포함하는 데이터를 대소문자 구별하지 않고 검색 |
__startswith |
지정한 문자열로 시작하는 데이터를 검색 |
__istartswith |
지정한 문자열로 시작하는 데이터를 대소문자 구별하지 않고 검색 |
__range |
문자, 숫자, 날짜의 범위를 지정해 검색 |
- 공유 링크 만들기
- X
- 이메일
- 기타 앱