KyleXID

몬스터코딩

Queryset의 반복구문 지우기, UnitTest 정리, List속 Dictionary 정렬

2019-05-07 KyleXIDTIL

Queryset의 반복구문을 지우는 방법

나의 경우에는 유저들이 좋아한 M2M 테이블에서 값을 추출해오면서 해당 테이블에 존재하는 이미지id들이 한개씩만 필요했기때문에 중복된 이미지 id들을 지워주어야했다.

이 경우에는 distinct()를 이용하여 중복된 값들을 지워줄 수 있다.

heart_list = list(Cloth.objects.all().values('hearts__id').values('pk').distinct())

list속 dictionary 정렬하기

나는 반복구문을 지운 후에 heart_list에 존재하는 이미지들의 heart 값에 따른 순위를 나타내기 위한것이 목적이었으므로 heart값에 따라 정렬을 해야했다.

다양한 방법이 있지만, 나의경우는 python의 itemgetter를 사용했다.

from operator import itemgetter

                .
                .
                .
    total_hearts_list = [
			 {"img_id" : d['pk'],
			  "total_hearts" : Cloth.objects.get(id = d['pk']).total_hearts} for d in hearts_list]
    data	      = sorted(total_hearts_list, key = itemgetter('total_hearts'))

total_hearts_list라는 list에서 key가 totla_hearts인 값들을 오름차순으로 정렬한 code이다. itemgetter에는 하나 이상의 값을 넣어서 순서대로 정렬시킬 수 있다.

UnitTest 노트 정리

  • UI

    • 실제 유저가 사용하듯이 테스트
  • integration

    • 간단한 규모로 한 서버,한 서비스만 테스트
  • Unit

    • 더 작은 규모, 함수를 테스트
  • UI 까다로운 이유 : 실행하기 어려움, 프론트,백이 모두 완성되어야함, 마치 배포한 상태가 되야하기 때문, 버그를 발견하기 힘듬

  • intergration : 그 다음으로 공수가 많이 든다.

  • unit test : 가장 쉬움/자동화가 쉬움, 파악이 쉽다.

    • Test code를 짜는것이 매우 중요함.
    • 개발과 unit test 비중은 5:5 로 두는게 이상적임.
    • 방패역할, 익숙해져야한다.

용어

  • TestCase

  • Fixture

  • assertion

  • if __name__ == '__main__':

    • 특별변수(파이썬이 갖고있는 변수) : 자동으로 파일 이름 혹은 모듈 이름으로 지정
    • 부를때 name이 파일이름으로 됨
    • import했을때 호출되는걸 방지하기위함
  • 중복을 방지하기 위해 setup, teardown

  • 테스트를 청소한다는 목적으로 사용한다.

  • setup() : 사전 준비 작업, clean up 처리 : tearDown()

원칙

  • 반드시 독립적이어야 한다.

  • 전체 테스트가 짧아야한다. 몇분 안에 완료 되어야함.

  • 각 앱에 테스트 디렉토리만들어서 수행한다.

  • 0,-1,1을 기억하자!

    • 1 : happy path ex)c = add(2,3) // c==5

    • -1 : 의도한 exception이 나오는지 확인하는 것

    • 0 : 이렇게는 안쓸것같지만 해보는 것