[ 프로젝트 BEP ] 최종장 - 엔지니어로서의 마인드셋에 대해 : 우수한 엔지니어는 누구이고, 가져야할 마인드 셋에 대해

이미지
  들어가면서 이제 2025년도 얼마 남지 않은듯 하다.  조금 길어질 수도 있기 때문에  실제로 업로드 하는 것은 새해 이후가 될 가능성도 있으나  올해는 이 글로 마무리 해보려고 한다. 이제 이 최종장을 끝으로 이 프로젝트를 다소 마무리 할 수 있을 것 같다. 물론 전체적으로 글 자체가 부족한 부분이 여려 곳 보이지만,  이는 천천히 개선하기로 하고 일단 마무리를 잘 지어보려고 한다. 이 프로젝트의 목표는 어디까지나 주니어 엔지니어(넓은 범위로서)에게  도움이 될 수 있는 부분을 정리해 놓은 것 이며, 이를 전달하는 것에 주력을 했다. 정확히는 그 사이에 몇 번이나 직장은 바뀌었지만,  내가 다니고 있는 회사에서 작게는 멘터,  크게는 주니어 교육에 활용하기 위한 초안이였다. 들어가기 앞서서 먼저 개발자는 무엇인가에서 부터 시작해서,  수학은 필요한가, 그리고 학위에 대한 이야기를 나누어보았고, 그 다음으로 컴퓨터가 무엇인가에 대해서는,  가장 첫 장인 컴퓨터 개론에서 메모리 손실과 함께 설명하였다. 다음으로는 개발 방법론과 시스템 설계,  그리고 프로그래밍 언어에 대한 이야기로 간단하고 이론적인 이야기를 하였다. 눈치가 빠른 사람은 알 수 있듯이,  현실에서 가질 수 있는 몇 가지 의문으로 시작해서  컴퓨터라는 하드웨어 부터 시작해서,  프로젝트(개발 방법론), 설계, 프로그래밍 언어 순으로  일부러 점점 컴퓨터 세계로 들어가도록 구성을 해 놓았다. 여기서 한 걸음 더 나아가자면, 알고리즘이 들어갈 수는 있겠으나  어디까지나 가볍게 전달하는대에 목적이 있기도 하고,  개인적으로는 당장은 크게 중요하지 않은 부분이 라고 생각 했기 때문이다. 먼저 이 부분에 대해서 좀 더 자세히 이야기해보도록 하자. 시작 부터 모든 지식을 쌓을 수는 없다 이는 개발 영역에서만 해당되는 이야기는 아니지만,  모든 것에는...

[ Django, Python ] 튜토리얼 예제로 살펴보는 Django 분석 ⑤ : 자동화 테스트(Automated Test) - 2

(View) 수정하기


설문 조사 목록에는 아직 게시되지 않은 설문 조사가 표시될 것이기에

표시되지 않도록 수정해보자.

 

먼저 이전 튜토리얼 4장에서 클래스 기반의 View

다시 작업하였는데



그 부분 중 IndexViewget_queryset 메소드를 수정할 것이다.



현재와 미래를 비교해야만 하기 때문에 

timezone import 해야한다.



원래 코드를 주석처리하고,

빨간색 박스와 같이 코드를 수정한다.

 

여기서

Question.objects.filter( pub_date__lte = timezone.now() )

Timezone.now 보다 pub_date가 작거나 같은 

Question을 반환 하는 코드이다.


여기서 pub_date 이름 뒤에 붙은 

__lte filter[1]조건 키워드로 같거나 작다(<=)를 의미한다.

 

, 지금이거나 과거일 경우 queryset을 반환하게 된다는 이야기 이다.

 

공식 도큐먼트에서는 여기서 끝내버리지만

나는 실제로 잘 작동하는지를 보고 싶기 때문에

미래의 데이터를 넣어 확인한 다음


그 데이터를 과거로 바꿔 

제대로 화면에 출력하는지를 확인할 것이다.


그렇기 위해서는 먼저 shell로 진입해야 한다.



셀로 진입한 후 Question 객체에 미래의 데이터를 넣기로 하자.


데이터를 넣었다면 명령어를 통해 

데이터가 정상적으로 들어가 있는지 확인한다.


그런 후 서버를 가동하고 

브라우저로 데이터가 나타나지 않는지 확인해 보자.


위의 사진과 같이

Shell을 통해 등록했던 

future Question text가 보이지 않는 것을 확인 할 수 있다.

 

그렇다면 역으로 등록했던 것의 날짜를 

바꾼다면 제대로 보이는지 확인해보자.



위와 같이 2020년이였던 것을 과거인 2018로 수정해 서버를 가동후 확인해 보자.


브라우저에는 빨간색 박스와 같이

등록한 데이터가 과거일 경우 정상적으로 출력되는 것을 알 수 있다.


물론 위와 같이 shell에서 

데이터를 추가하고 수정하지 않고도



django에서 제공해주는

 관리자 앱을 사용한다면 좀 더 손쉽게

데이터를 추가 및 수정하여 확인해 볼 수 있다.


관리자 앱에 대한 내용은 

이전 포스팅을 참고하길 바란다.

 

마지막으로 자동화 테스트를 작성할 것이다.

 

이번 자동화 테스트는

1개의 클래스(함수 5)1개의 함수로

6개의 테스트 케이스를 만들 것 이다.

 

먼저 



자동화 테스트 과정 중에 사용할 create_question 함수,

여기서 days인수는 과거의 설문조사와 

미래의 설문조사를 나누는 일 수를 말한다.


예를 들어

이번 자동화 테스트에서는

이 인수에 미래의 경우 30이 과거의 경우 -30이 들어가는데


오늘 기준 pub_date 30일 후의 경우 

미래에 진행할 설문 조사 목록이며

오늘 기준 pub_date30일 이전에 경우에는 

과거에 끝난 설문조사 목록이 된다.



시행할 설문 조사가 없을 경우,

설문 조사가 없다는 메시지를 출력해주는 test_no_questions 함수



설문 조사 목록 중에 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에서 제공해준다고 생각하면 이해하기 쉬울 것 이다.

 

어쨌든 IndexViewListView라는 제너릭 뷰 인데,

List 자료형의 변수를 가지고 있는 View이다.


따라서 데이터 입/출력이 필요 할 때

IndexView를 이용하게 될 것이다.

 

작성을 완료했다면,

실제 테스트를 시행해보자.



작성한 자동화 테스트를 시행해보자.

 

이전에 작성한 2개의 자동화 테스트 함수와

이번에 작성한 6개의 자동화 테스트 함수를 합해

8개의 자동화 테스트를 시행한 결과

작성한 코드의 문제가 없음을 확인했다.


DetailView 테스트하기

지금까지 작성한 코드들은 잘 작동된다.

 

하지만 미래에 진행할 설문들은

페이지에 나타나지는 않지만,

 

사용자가 URL을 알고 있거나,

추측한다면 접근할 수 있다.

 

따라서 DetailViewIndexView 때와

마찬가지로 유사한 제약조건을 추가할 필요가 있다.



빨간색 박스와 같은 함수를 추가한다면,

쿼리를 불러올 때 미래의 값들은 불러오지 않는다.



또한 위와 같이

시간이 지난 pub_date 값을 가지고 있는 설문은 표시되고

미래의 pub_date는 표시되지 않는 테스트 케이스도 추가하자.

 

[1] 조건 키워드 :

키워드

설명

__lt / __gt

작다 / 크다

__lt / __gte

작거나 같다/ 작거나 크다

__in

리스트([1,2,3와 같은])

의 데이터와 동일한

검색

__year / __month / __day

, , 일 검색

__isnull

Null인 값 검색

__contains

지정한 문자열을

포함하는 데이터를 검색

__icontains

지정한 문자열을

포함하는 데이터를 대소문자

구별하지 않고 검색

__startswith

지정한 문자열로 시작하는

데이터를 검색

__istartswith

지정한 문자열로 시작하는

데이터를 대소문자

구별하지 않고 검색

__range

문자, 숫자, 날짜의 범위를

지정해 검색



이 블로그의 인기 게시물

[ Web ] 웹 애플리케이션 아키텍처 (Web Application Architecture)

[ Web ] 서버 사이드(Sever Side) ? 클라이언트 사이드(Client Side)? 1 [서론, 클라이언트 사이드(Client Side)]

[ Web ] 웹 애플리케이션 서버 아키텍처의 정의 및 유형 ( Define and Types of Web Application Server Architecture )