본문 바로가기
관리자

Programming-[Backend]/Django

[TIL] django 테스트 - subTest 활용하기, 인스턴스 field update 하기

728x90
반응형

 

subTest 활용하기

 

테스트 시에 subTest를 활용하면 논리적으로 구분되어 읽기 좋고, 어떤 부분에서 에러가 났는지 명확히 알 수 있다. 나는 아래와 같이 논리적 구분을 위해 사용했다.

 

def test_update(self):

###...중략
### django model bakery로 초기 데이터(fixture) 생성

    # then
    with self.subTest("200 정상 확인"):
        self.assertEqual(
            response.status_code,
            status.HTTP_200_OK,
        )

    with self.subTest(
        "입력값으로 받은 name이 post에 업데이트 된다"
    ):
        post.refresh_from_db()
        post2.refresh_from_db()
        self.assertIsNotNone(post.name)
        self.assertIsNotNone(post2.name)

 

주의점

django TestCase에서 setUp() 메서드로 정의한 인스턴스 정보들이 하나의 def 함수에 묶이므로 함수 자체를 subTest로 만들면 안된다.

 

참조

https://www.caktusgroup.com/blog/2017/05/29/subtests-are-best/

 

 


 

인스턴스 field update : refresh_from_db()

 

test시에 어떤 인스턴스는 캐싱되어 field값 업데이트가 이루어지지 않는다.

(자바의 DataJpaTest가 그립다...)

 

어쨌든 client로 요청을 보내고 업데이트된 인스턴스의 정보를 확인할려면, django orm 코드를 활용하여 인스턴스를 새롭게 부르거나, serializer에서 제공하는 refresh_from_db()를 사용하면 된다!

 

#테스트 코드(요약 코드)

# 모델 생성
comment = baker.make("comment.Comment", name=null)

# 클라이언트 요청(이름을 변경해주는 API라고 가정)
client.patch(url주소, data={name="홍길동"})

# comment의 name이 null -> "홍길동"으로 변경되었는지 확인하려면
# 1. comment를 다시 탐색
comment = Comment.objects.get(pk=comment.id)

# 2. refresh_from_db() 사용
comment.refresh_from_db()


# 확인
self.assertEqual(comment.name, "홍길동")
728x90
반응형