Queryset의 반복구문 지우기, UnitTest 정리, List속 Dictionary 정렬
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 : 이렇게는 안쓸것같지만 해보는 것
-