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
반응형