Log for everything - Day

Django 서비스 테스트하기

|

Coverage 설치

파이썬 코드의 테스트 커버리지를 나타내 주는 라이브러리인 coverage를 설치한다. pip3 install coverage

Coverage 설정

.coveragerc 파일 생성

vi .coveragerc

vim을 이용해서 간단하게 coveragerc 설정 파일을 생성.

실행환경 설정

[run] 헤더 이후에 설정을 적어주면 된다.
include = 테스트를 포함할 경로
omit = 테스트를 제외할 경로

[run]
omit = ../virtualenvs/landlord_reputation_venv/*

기본적으로 project_root의 폴더들이 모두 포함되므로 위와 같이 가상환경만 제외했다.

Coverage 실행

coverage run manage.py test로 테스트를 수행

Creating test database for alias 'default'...
System check identified no issues (0 silenced).

----------------------------------------------------------------------
Ran 0 tests in 0.000s

OK

위와 같이 테스트를 수행한다.
현재는 아무런 테스트도 넣지 않은 상태

리포트 보기

coverage report로 각각의 파일에 대한 리포트를 볼수 있다.

Name                                    Stmts   Miss  Cover
-----------------------------------------------------------
landlord_reputation/__init__.py             0      0   100%
landlord_reputation/settings.py            20      0   100%
landlord_reputation/urls.py                 4      0   100%
landlord_reputation/views.py                8      0   100%
manage.py                                  13      6    54%
reputation/__init__.py                      0      0   100%
reputation/admin.py                         8      0   100%
reputation/apps.py                          3      0   100%
reputation/migrations/0001_initial.py       8      0   100%
reputation/migrations/__init__.py           0      0   100%
reputation/models.py                        9      0   100%
reputation/tests.py                         1      0   100%
reputation/urls.py                          3      0   100%
reputation/views.py                        90     65    28%
-----------------------------------------------------------
TOTAL                                     167     71    57%

view 파일에 대해 하나도 테스트가 작성되지 않은 상태라 coverage가 매우 낮게 출력된다.

리포트 html 형식으로 보기

좀더 자세한 결과를 보기위해서 리포트를 Html 형식으로 출력할수도 있다.
coverage html 명령을 통해 htmlcov/index.html로 리포트가 생성된다.

리포트 형식

커버리지 리스트

리포트를 선택했을때 나오는 상세 결과

커버리지 디테일

테스트 코드 작성하기

from django.core.urlresolvers import reverse
from django.test import TestCase

from reputation.models import Reputation

class ReputationView(TestCase):
    def setUp(self):
        Reputation.objects.get_or_create(address="sample address", latitude="23.456789",
        longitude="123.4567890", owner_id=1)

    def test_template_url(self):
        url = reverse("reputation:reputation_template",  args=["123.1234567", "23.456789"])
        response = self.client.get(url)
        self.assertEqual(response.status_code, 200)

generic view Http 응답에 대한 테스트 코드를 삽입하였다.

이후 다시 테스트를 수행한 결과

커버리지 디테일 커버리지가 조금 올라가고 붉은색으로 표시된 테스트 되지 않은 범위도 조금 줄어들었다.

테스트 플랜을 짜고 좀더 상세한 Suite/Case를 작성해야겠지만 위 방법을 확장하여 테스트 커버리지를 높일 수 있다.

브라우저 CSS 캐쉬 무력화하기 및 Mac에서 Localhost 지정하기

|

흐름에 따른 사고

|

우리는 무엇인가를 빠르게 습득하고 적용하기 위해 많은 부분들을 건너뛰곤 한다.
남들이 쌓아올린 경험과 지식의 결실을 빠르게 받아들이고 사용할 수 있는 능력이 실리와 직결되기도 한다.
하지만 더욱 깊이있는 발전을 위해서는 그러한 결실이 만들어지는 과정과 사고를 이해하는 것이 중요하다.
최첨단으로 보이는 결실들이 결국 많은 사람들의 고민과 시행착오 끝에 만들어 졌다는 사실을 인지하고,
그러한 고민들을 하게된 이유와 사고의 흐름을 쫓아보는 것이 지식에 대한 이해를 한단계 높여준다.
또한 이러한 사고의 흐름을 바탕으로 자신만의 고유한 해결책을 제시할 수 있게된다.

빠른 결실을 바라는 사회에서 본질로 돌아가 고민하고 차근히 들여다 보는 것은 사회를 역행하는 것처럼 보이기에,
다들 혁신을 부르짓지만 진정한 혁신가라 불리는 이들이 정말 적은 이유가 아닐까.

우리는 일상생활 속에서 일일이 기본원리로 되돌아가 생각할 수는 없습니다.
이것은 정신적으로 상당히 힘든 일입니다.
그래서 우리는 비슷한 것에 기초해서 미루어 추측하거나 타인을 흉내 내는 것으로 인생의 대부분을 보냅니다.
그러나 새로운 지평을 개척하거나 진정한 의미의 혁신을 일으키기 위해서는 기본원리에서부터의 접근이 필요합니다.
어떤 분야에서나 가장 기본적 진리를 찾고 거기서 다시 생각해야 합니다.
그러기 위해서는 정신적 노력이 필요합니다.      - Elon musk

수학의 발전사를 통해 수학적 사고의 발전을 보여주는 수학의 언어로 세상을 본다면을 읽고…

Django를 이용한 포트폴리오 사이트 제작 (1) - 기획

|

발단

매주 토요일마다 여자친구와 공동 프로젝트(?)를 하고 있다.
미술적 재능과 공학이 만나 무엇인가 재미있는 것을 할수있지 않을까싶어 시작한 프로젝트인데,
사실 거창한 것은 없고, 짧은시간동안 뭔가 간단한 것이라도 만들어내는 것에 의미를 두고 있다.

1주차에는 JQuery를 이용해 여자친구가 그린 그림을 이용해 간단한 애니메이션을 구현해 보았고,
2주차에는 Phaser Library를 이용해서 마우스 이벤트에 반응하는 간단한 인터랙션을 제작했다.

기술적으로 볼때는 간단한 일이지만 여자친구 입장에서는 자신의 작품이 움직이는 것을 보니 신기한 모양이다.
그런 모습이 즐겁기도 하고, 나름 뿌듯하기도 해서 점점 프로젝트가 커져가고 있다.

3주차인 이번주부터는 자신의 작품을 모아서 보여줄 수 있는 포트폴리오 사이트를 같이 제작해 보기로 했다.

요구사항

  1. 최신 작업중인 작품을 보여주는 페이지
  2. 간단한 프로필 페이지 (Contact, Profile description, SNS 링크 등)
  3. 기존 작품 목록
    • 목록을 선택하면 ISSUU와 같은 책 형식으로 작품을 보여줄 수 있어야 함.
    • 아날로그적인 느낌으로 책장을 넘기는 애니메이션이 있으면 좋겠음
  4. 사이드 프로젝트 목록
    • 주 작업 외에 기타 작품들을 전시할 공간

요구사항 정리

모든 페이지를 그냥 정적 페이지의 형태로 제작하는게 편할 것 같지만..
(작품 연재주기가 긴 만큼 그때그때 내가 받아서 업데이트 해주는것이 어려울 것이 없을 것 같다.)
그리하면 그냥 지루하고 단순한 작업이 될 것 같아 재미있을 것 같은 요소를 넣기로 했다.
사이트 레이아웃이나 구성방법 등은 같이 고민해가며 구현하면 될 것 같고,
이미지로된 시리즈 연재물을 최대한 유저가 편하게 업로드하고 관리할 수 있는 방법을 생각해 보아야 할 것 같다.

다음주 목표

  1. 기본적인 목업 사이트 틀 잡기
  2. 책 형식으로 작품 보여주는 기능 구현

Django를 이용한 건물주 평판 조회 서비스 제작 (4) - 구현 2일차

|

구현 2일차

평판 디테일 뷰

검색한 위치에서 평판을 등록할 수 있게하고, 맵을 띄워주었다.
지도를 선택해서 마커를 이동하면 해당 위치에서 평판을 등록할 수 있도록 했다.

로그인/로그아웃/회원가입

Django의 기본 Auth를 이용하여 제작했다.
Django의 기능이 강력해서 구현 자체는 금방 끝났으나 UI를 다듬는대 생각보다 많은 시간이 걸렸다.
여전히 Look이 마음에 들진 않는다…

스크린샷

홈화면

검색결과 (평판이 있을때 평판으로 이동할 수 있는 화면)

검색결과(평판없음)

검색결과 (평판이 없을때 검색한 주소에 추가할 수 있는 화면)

검색결과(평판없음)

로그인

로그인

회원가입 (에러 메시지 출력 화면)

회원가입(에러)

맵뷰

맵뷰

고생한 점

2일차 구현은 딱히 어려웠던 점은 없다. UI가 고쳐도 고쳐도 맘에 썩 들지 않는다는 점만 빼면…

진행률

기본적인 기능 구현은 전부 완료했다.

평판 등록/조회 기능 회원가입/로그인 기능 주소 검색 기능
100% 100% 100%

더불어 지난주 계획도 얼추 완료했다.

  1. 로그인/회원가입 등 구현 완료
  2. 가입한 사용자만 정보를 등록할 수 있도록 구현 완료
  3. 디테일뷰에서 DB에 평판 추가하는 부분 구현 완료
  4. UI/UX 개선 완료

6/18일까지 MVP를 제작한다는 일정은 맞춘듯 하다.
전체 프로젝트 목표까지는 아직 조금더 할일이 남긴 했다.

다듬기

  1. 계정 생성시 간단한 인증코드 삽입
  2. 테스트 코드 삽입
    • 간단한 코드라도 테스트 코드 넣는 습관 들이자..
  3. 릴리즈용으로 코드 정리
    • Dev/Production 환경을 나누고 여러 키들 노출되지 않도록 처리할 것