문제

상태에 대한 의존도가 높은 데이터베이스 백엔드 개발용 테스트 코드를 작성하는 데 좋은 힌트를 주는 사람이 있나요?

특히 데이터베이스에서 레코드를 검색하는 코드에 대한 테스트를 작성하고 싶지만 대답은 데이터베이스의 데이터(시간이 지남에 따라 변경될 수 있음)에 따라 달라집니다.

사람들은 일반적으로 특정 기능이 항상 정확히 동일한 결과 집합을 반환하도록 '고정' 데이터베이스를 사용하여 별도의 개발 시스템을 만드나요?

나는 이것이 새로운 문제가 아니라고 확신하므로 다른 사람들의 경험으로부터 배우고 싶습니다.

일반적으로 웹 기반 개발 문제를 논의하는 좋은 기사가 있습니까?

나는 보통 PHP 코드를 작성하지만 이러한 모든 문제는 대체로 언어와 프레임워크에 구애받지 않을 것으로 예상됩니다.

도움이 되었습니까?

해결책

DBUnit을 살펴보거나 이에 상응하는 PHP를 찾으십시오(반드시 하나가 있어야 합니다).이를 사용하여 테스트 데이터를 나타내는 특정 데이터 세트로 데이터베이스를 준비할 수 있으므로 각 테스트는 더 이상 데이터베이스 및 일부 기존 상태에 의존하지 않습니다.이러한 방식으로 각 테스트는 자체적으로 포함되며 추가 데이터베이스 사용 중에 중단되지 않습니다.

업데이트:빠른 Google 검색 결과 DB 유닛 확장 PHPUnit용.

다른 팁

데이터 계층 테스트에 주로 관심이 있다면 이 책을 확인해 보세요. xUnit 테스트 패턴:리팩토링 테스트 코드.나 자신도 항상 그것에 대해 확신이 없었지만 이 책은 성능, 재현성 등과 같은 문제를 열거하는 데 큰 도움이 됩니다.

어떤 데이터베이스를 사용하느냐에 따라 다르지만 Red Gate(www.red-gate.com)에서는 SQL Data Generator라는 도구를 만듭니다.데이터베이스를 합리적으로 보이는 테스트 데이터로 채우도록 구성할 수 있습니다.또한 난수 생성기에서 항상 동일한 시드를 사용하도록 지시하여 '임의' 데이터가 매번 동일하도록 할 수도 있습니다.

그런 다음 단위 테스트를 작성하여 이 안정적이고 반복 가능한 데이터를 활용할 수 있습니다.

웹 측면을 테스트하기 위해 현재 Selenium(selenium.openqa.org)을 조사하고 있습니다.이는 기능을 테스트하는 데 도움이 되는 크로스 브라우저 가능 테스트 모음인 것으로 보입니다.그러나 이러한 모든 웹 사이트 테스트 도구와 마찬가지로 이러한 기능이 얼마나 잘 작동하는지 테스트할 수 있는 실제 방법은 없습니다. 바라보다 사람의 눈에 띄지 않고 모든 브라우저에서!

우리는 인메모리 데이터베이스(hsql: http://hsqldb.org/).최대 절전 모드(http://www.hibernate.org/)를 사용하면 테스트 데이터베이스에서 단위 테스트를 쉽게 지정할 수 있으며 번개처럼 빠르게 실행된다는 추가 보너스도 있습니다.

나는 내 작업과 똑같은 문제를 겪고 있으며 가장 좋은 아이디어는 데이터베이스를 다시 생성하는 PHP 스크립트를 사용한 다음 미친 데이터를 던져서 데이터베이스가 손상되는지 확인하는 별도의 스크립트를 갖는 것임을 알았습니다.

나는 단위 테스트 등을 사용한 적이 없으므로 작동하는지 여부를 말할 수 없습니다.

테스트를 실행하기 전에 알려진 수량으로 데이터베이스를 설정하고 마지막에 해체할 수 있다면 작업 중인 데이터가 무엇인지 알 수 있습니다.

그런 다음 Selenium과 같은 것을 사용하여 UI에서 쉽게 테스트하고(여기서는 웹 기반이라고 가정하지만 다른 UI 버전에 대한 많은 UI 테스트 도구가 있음) 데이터베이스에서 가져온 특정 레코드의 존재를 감지할 수 있습니다.

데이터베이스의 테스트 버전을 설정하거나 테스트 스크립트가 테스트의 일부로 알려진 데이터로 데이터베이스를 채우도록 하는 것은 확실히 가치가 있습니다.

당신은 시도해 볼 수 있습니다 http://selenium.openqa.org/ 이는 데이터 계층 테스트 애플리케이션보다는 GUI 테스트에 더 적합하지만 작업을 기록하여 다양한 플랫폼에서 테스트를 자동화하기 위해 재생할 수 있습니다.

내 전략은 다음과 같습니다(저는 JUnit을 사용하지만 PHP에서도 동일한 작업을 수행할 수 있는 방법이 있다고 확신합니다).

특정 DAO 클래스에 대한 모든 단위 테스트 전에 실행되는 메서드가 있습니다.개발 데이터베이스를 알려진 상태로 만듭니다(모든 테스트 데이터 등을 추가합니다).테스트를 실행하면서 알려진 상태에 추가된 모든 데이터를 추적합니다.이 데이터는 각 테스트가 끝나면 정리됩니다.클래스에 대한 모든 테스트가 실행된 후 다른 방법은 개발 데이터베이스의 모든 테스트 데이터를 제거하여 테스트가 실행되기 전의 상태로 유지합니다.이 모든 작업을 수행하는 것은 약간의 작업이지만 일반적으로 모든 DAO 테스트 클래스가 액세스할 수 있는 DBTestCommon 클래스에 메서드를 작성합니다.

나는 세 개의 데이터베이스를 사용할 것을 제안하고 싶습니다.하나의 프로덕션 데이터베이스, 하나의 개발 데이터베이스(각 개발자에게 의미 있는 데이터로 채워짐) 및 하나의 테스트 데이터베이스(빈 테이블과 항상 필요한 몇 개의 행이 포함됨).

데이터베이스 코드를 테스트하는 방법은 다음과 같습니다.

  1. 상태를 초기화하려면 SQL을 사용하여 몇 개의 행을 삽입하세요.
  2. 테스트하려는 기능을 실행하십시오.
  3. 예상 결과와 실제 결과를 비교해보세요.여기에서는 일반적인 단위 테스트 프레임워크를 사용할 수 있습니다.
  4. 변경된 행을 정리합니다. 그러면 다음 실행에서 이전 실행이 표시되지 않습니다.

정리는 다음을 사용하여 표준 방식으로 수행할 수 있습니다(물론 테스트 데이터베이스에서만). DELETE * FROM table.

일반적으로 나는 Peter의 의견에 동의하지만 테스트 데이터를 생성하고 삭제하는 데 SQL을 직접 사용하지는 않습니다.나는 가능한 한 프로덕션과 유사한 데이터를 생성하기 위해 제품에서 사용되는 일부 CRUD API를 사용하는 것을 선호합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top