테스트에서 SQLite 사용 및 주의해야 하는 이유.

최근에 phpunit을 사용하기 시작했습니다. 그래, 소리 지르지 마...! 저는 독학 프로그래머일 뿐이며 모든 것을 혼자 해야 합니다. 어쨌든 나는 시험을 좋아하게 된다.

저는 Symfony를 많이 사용하기 때문에 항상 팁과 트릭을 살펴봅니다. 그러다가 Gary Clark의 이 비디오 시리즈를 보게 되었는데, 그건 그렇고, 나는 그의 비디오를 많이 배우면서 높이 존경합니다.

비디오에서 그는 매우 빠른 테스트 실행을 위해 메모리 내 SQLite 데이터베이스를 사용하는 트릭을 보여줍니다. 약간의 조사 후에 저도 그것을 사용하기 시작했습니다.

(날짜 기반) 유효성 검사를 테스트하기 시작할 때까지 모든 것이 잘되었습니다. 특정한 경우에 새로 요청한 날짜가 데이터베이스의 값보다 큰지 테스트해야 했습니다. 이는 날짜 범위가 겹치는 것을 방지하기 위한 것입니다.

사용된 유효성 검사는 저장소에서 DQL을 실행하며 레코드가 반환되면 날짜가 겹칩니다.

내 개발 환경(MariaDB)에서 완벽하게 작동했지만 테스트를 작성하기 시작했을 때 하나의 어설션이 계속 실패했는데, 이는 실제로 수동 개발 테스트에서 유효했습니다.

유효성 검사와 관련된 QueryBuilder 논리는 다음과 같습니다.

 return $this->createQueryBuilder('e')
     ->andWhere('e.asset = :asset')
     ->andWhere('(:requestDateTo > e.fromDate AND :requestDateFrom < e.toDate)')
     ->setParameter('requestDateFrom', $booking->getFromDate())
     ->setParameter('requestDateTo', $booking->getToDate())
     ->setParameter('asset', $booking->getAsset())
     ->getQuery()
     ->execute();


이제 이것은 내 개발 환경에서 완벽하게 작동했지만 특정 주장(내가 옳았어야 함을 알고 있었음)이 매번 테스트에서 실패했습니다.

간단히 말해서 많은 디버깅 후에 SQLite(DQL을 통해)가 DateTime 변수를 다르게 처리한다는 것을 발견했습니다. 이것은 SQL로 다음과 같이 번역됩니다.

select * where '2021-01-01 00:00:000000' > date_from;


유형이 datetype이고 값이 '2021-01-01'인 데이터베이스 레코드가 데이터베이스에 있는 경우 MariaDB에서는 레코드를 반환하지 않지만 SQLite에서는 반환합니다. SQLite는 '2021-01-01 00:00:000000' > '2021-01-01'을 true로 처리하는 반면 MariaDB는 false로 처리합니다.

결국 MariaDB에서도 작동하는 (SQLite) 일치 형식의 날짜 매개변수를 강제로 적용하여 문제를 해결했습니다. 종료:

 return $this->createQueryBuilder('e')
     ->andWhere('e.asset = :asset')
     ->andWhere('(:requestDateTo > e.fromDate AND :requestDateFrom < e.toDate)')
     ->setParameter('requestDateFrom', $booking->getFromDate()->format('Y-m-d'))
     ->setParameter('requestDateTo', $booking->getToDate()->format('Y-m-d'))
     ->setParameter('asset', $booking->getAsset())
     ->getQuery()
     ->execute();


따라서 SQLite 인메모리를 사용하는 것은 데이터베이스 관련 테스트를 신속하게 린(rin)하는 나쁜 트릭이므로 다른 데이터베이스 유형을 사용할 때 나타날 수 있는 단점에 주의하십시오.

좋은 웹페이지 즐겨찾기