문제

저는 현재 레이어의 전체 "영역"을 포함하는 솔루션을 테스트하는 중입니다.UI, 중간, 그리고 편재하는 데이터베이스.

제가 현재 팀에 합류하기 전에 쿼리 테스트는 다양한 관련성 규칙, 정렬 등에 따라 저장 프로시저가 반환해야 하는 결과 집합을 이론적으로 반환하는 쿼리를 수동으로 작성하는 테스터에 의해 수행되었습니다.

이로 인해 문제의 실제 쿼리보다 테스터의 쿼리에 대해 버그가 더 자주 제출되는 부작용이 있었습니다.

나는 존재하는 데이터를 제어하기 때문에 결과가 어떻게 반환되어야 하는지 추론할 수 있는 알려진 결과 집합을 사용하여 실제로 작업할 것을 제안했습니다. 이전에는 데이터를 프로덕션에서 가져와 삭제한 다음 테스트 데이터베이스에 채웠습니다.

사람들은 여전히 ​​개발자가 만든 것을 테스트하기 위해 자신만의 쿼리를 만드는 데 집착했습니다.나는 아직도 많은 사람들이 그럴 것이라고 생각합니다.나는 이것이 전혀 이상적이지 않으며 테스트 공간을 불필요하게 늘릴 뿐이라고 생각합니다.

그렇다면 이와 같은 시나리오를 테스트하기 위해 어떤 방법을 사용하는지, 그리고 혼란스러운 데이터를 도입하지 않고 얻을 수 있는 최상의 엔드투엔드 적용 범위에 이상적인 것으로 간주되는 것은 무엇인지 궁금합니다.

내가 가진 문제는 어떤 테스트를 수행하기에 가장 좋은 장소가 어디인지입니다.서비스를 직접 살펴보고 해당 데이터 세트를 저장 프로시저에서 가져올 수 있는 데이터 세트와 비교합니까?대략적인 아이디어가 있고 지금까지 충분히 성공했지만 여기서는 여전히 중요한 것을 놓치고 있는 것 같습니다. 그래서 커뮤니티에서 테스트 접근 방식을 공식화하는 데 도움이 될 수 있는 귀중한 통찰력이 있는지 알아보고 있습니다. 더 나은.

도움이 되었습니까?

해결책

저장된 프로세스를 테스트하려면 테스트하는 각 사람이 별도의 db 인스턴스를 가지고 있어야 합니다.이는 요구 사항입니다.환경을 공유하면 테스트 결과를 신뢰할 수 없게 됩니다.그들은 쓸모가 없을 것입니다.

또한 결과를 예측 가능하고 안정적으로 만들려면 모든 테스트 후에 DB를 이전 상태로 롤백해야 합니다.매 테스트 후에 상태를 롤백해야 하기 때문에 이러한 테스트는 표준 단위 테스트보다 완료하는 데 훨씬 더 오랜 시간이 걸리므로 아마도 밤새도록 실행하고 싶을 것입니다.

이 문제를 해결하는 데 도움이 되는 몇 가지 도구가 있습니다.DbUnit은 그 중 하나이며 Microsoft에는 DB 테스트에 대한 일부 지원이 포함된 데이터베이스 전문가용 Visual Studio 도구가 있다고 생각합니다.

다른 팁

다음은 몇 가지 지침입니다.

  1. 단위 테스트를 위해 격리된 데이터베이스를 사용합니다(예:다른 테스트 실행이나 활동 없음)
  2. 항상 동일한 테스트 내에 쿼리하려는 모든 테스트 데이터를 삽입하세요.
  3. 다양한 양의 데이터를 무작위로 생성하는 테스트를 작성하세요.임의의 삽입 수는 1에서 10행 사이라고 말합니다.
  4. 데이터를 무작위로 지정합니다.부울 필드 무작위 삽입 및 true 또는 false
  5. 변수 테스트에서 개수를 유지합니다(예:행 수, 참 수)
  6. Assert의 경우 쿼리를 실행하고 로컬 테스트 변수와 비교합니다.
  7. Enterprises Services 트랜잭션을 사용하여 데이터베이스를 이전 상태로 롤백

기업 서비스 거래 기술에 대해서는 아래 링크를 참조하세요.

http://weblogs.asp.net/rosherove/articles/DbUnitTesting.aspx

지속적인 통합의 일환으로 데이터베이스 쿼리의 야간 '빌드'를 실행합니다.여기에는 코드의 실제 호출과 예상되는 임시 쿼리에서 정기적으로 업데이트되는 일련의 DB 호출이 포함됩니다.

이러한 호출은 다음을 보장하기 위해 시간이 정해져 있습니다.

1/ 그리 오래 걸리지 않습니다.

2/ 전날 밤과 (나쁜 방식으로) 크게 다르지 않습니다.

이런 방식으로 잘못된 쿼리나 DB 변경 사항을 빠르게 포착합니다.

특히 이 경우에는 쿼리 플래너가 여러분의 친구입니다.인덱스가 예상대로 사용되는지, 쿼리에 추가 작업이 필요하지 않은지 확인하는 것은 항상 좋은 습관입니다.제품군에 스트레스 테스트가 포함되어 있더라도 앱이 중단되기 전에 비용이 많이 드는 쿼리를 포착하는 것이 좋습니다.

우리는 각 개발자와 테스터를 위해 빈 데이터베이스를 따로 마련해 두었습니다.

테스트가 실행되면 각 테스트는 데이터베이스를 지우고 사용할 것으로 예상되는 데이터를 로드합니다.이는 우리에게 항상 알려진 상태를 제공합니다.

그런 다음 동일한 DB에서 여러 가지 시나리오를 차례로 테스트할 수 있으며 다른 테스터 발가락을 밟지 않습니다.

여기에는 데이터 액세스 자체 테스트가 포함됩니다.서비스 테스트의 경우 거의 동일한 작업을 수행하지만 서비스 내부만 테스트합니다. 실제로 서비스에 도달하지 않고 서비스 처리 클래스의 인스턴스를 생성하고 필요한 모든 것을 전달합니다.그렇게 하면 인프라(메시지 등)가 아닌 코드를 테스트하게 됩니다.

Django는 데이터베이스 단위 테스트 기능을 제공합니다.그들의 디자인 아이디어를 빌려 다른 환경에서 재현할 수 있습니다.

Django 사람들은 Python의 표준 단위 테스트의 하위 클래스를 제공합니다. TestCase 알려진 고정 장치(알려진 데이터 행 세트)로 데이터베이스를 채우는 클래스입니다.

Django(및 Python)의 경우 JSON 데이터 추출에서 데이터베이스를 채우는 것이 가장 쉽습니다.픽스처의 다른 파일 형식을 다른 프레임워크에 사용할 수 있습니다.예를 들어 Oracle에서 작업하는 경우 CSV 파일을 사용하는 것이 더 쉬울 수 있습니다.

이것 TestCase 하위 클래스를 사용하면 알려진 데이터 고정 장치로 데이터베이스를 실행하는 전형적인 TestCase를 작성할 수 있습니다.

또한 Django 테스트 실행기는 테스트 목적으로 임시 스키마를 생성합니다.Django에는 DDL 생성을 포함하는 완전한 개체 관계형 관리 구성 요소가 있기 때문에 이는 쉽습니다.이를 사용할 수 없는 경우에도 단위 테스트 목적으로 테스트 스키마를 생성하고 폐기할 수 있도록 DDL 스크립트가 필요합니다.

SQLServerCentral에는 기사가 있습니다. 여기 (등록해야 할 수도 있지만 무료이며 문자열이 없습니다.) tsqlUnit이라는 TSQL 단위 테스트 프레임워크에 대해 설명합니다.이는 오픈 소스이며 xUnit 프레임워크의 전통을 따릅니다.

SEAT TDD 패턴을 따릅니다.

설정 - 개체, 테이블 및/또는 데이터를 조작하여 테스트 조건을 준비합니다.

연습 - 프로덕션 코드 호출

Assert - 실제 결과가 예상 결과와 동일한지 확인

Teardown - 테스트가 시작되기 전의 상태로 모든 것을 되돌립니다.이는 실제로 모든 것을 깔끔하고 깔끔하게 유지하는 트랜잭션 롤백을 통해 수행됩니다.

비록 제가 그것을 사용하지는 않았지만 그것은 유망해 보이며 확실히 더 자세히 살펴볼 것입니다.

프레임워크를 다운로드할 수 있습니다. 여기.

데이터베이스 쿼리 결과보다는 데이터베이스로 전송되는 SQL을 테스트하는 것이 유용하다고 생각합니다.

나중에 수행하지 않는다는 것은 아니지만 데이터베이스를 너무 많이 사용하는 것보다 테스트하는 것이 훨씬 더 빠르다는 것을 알았습니다.

이것은 무거운 설정이지만 TDDing 컨테이너를 권장합니다.

테스트 스크립트를 실행하면 데이터베이스가 내부에서 실행되는 새 컨테이너를 구축하고 모의 데이터로 시드한 다음 쿼리를 실행하고 반환된 내용과 쿼리 성공 여부를 테스트합니다.

이렇게 하면 테스트 환경이 프로덕션에 얼마나 가까운지 제어할 수 있습니다.

소트웍스

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