4

그냥 set up a test framework for a new web application을 가졌으므로 큰 문제 중 하나를 놓친 것을 깨달았습니다. "어떻게 테스트를 서로 독립적으로 만들 수 있습니까?"엔드 투 엔드 테스트를 위해 테스트 픽스처를 관리하는 방법은 무엇입니까?

몇 년 전 나는 모든 데이터베이스 테이블을 삭제하고, 스키마를 다시 작성하고, 테스트 데이터를 추가하고, 응용 프로그램을 시작하고, 하나의 테스트를 실행 한 다음 응용 프로그램을 중지하는 전체 순환을 수행하도록 복잡한 앤트 스크립팅을 설정했습니다. 그것은 전체 스위트를 실행하는 데 걸리는 시간 때문에 야간 테스트를 유지하고 제한하는 데 어려움이있었습니다. 그것은 여전히 ​​가치가 있었지만 더 쉬운 방법이 있는지 궁금합니다.

이 방법에 대한 대안이 있습니까? 주요 기준은 각 테스트가 실패 또는 성공 여부에 관계없이 제품군의 다른 테스트의 영향을받지 않아야한다는 것입니다.

답변

0

물론 ... CruiseControl을 사용하여 지속적인 통합 테스트를 살펴보십시오. NAnt, NUnit과 함께 테스트를 실행하고, 환경을 파괴하고 설정하고, 다른 많은 것들을 사용할 수 있습니다. 그리고 누군가 코드 저장소에 체크인 할 때마다이 작업을 실행할 수 있습니다. 코드를 수행하는 유일한 방법입니다!

+0

이미 Hudson, Maven, JWebUnit 및 기타 도구를 사용하고 있습니다. 종단 간 테스트는 주요 프로젝트가 성공적으로 완료 될 때마다 트리거됩니다. 그러나 흥미로운 질문은 테스트를 별도의 프로세스에서 실행하는 동안 데이터베이스에서 실제로 호스트되고 웹 애플리케이션에 캐시 된 환경을 설정하고 제거하는 방법입니다. –

1

레코드의 경우 : 지금 내가 수행하고있는 작업은 전체 데이터베이스를 다시 설정하는 응용 프로그램에 특수 리소스를 구성하는 것입니다 (모든 콘텐츠를 삭제하고 기본 사용자를 추가 함). 응용 프로그램이 "테스트 모드"로 시작된 경우에만이 리소스는 URL에 바인딩됩니다. 우리 애플리케이션은 (대부분) RESTful이기 때문에 새로운 객체를 추가하는 것은 외부에서 수행 할 수있다. 테스트의 기본 클래스는 테스트 케이스를 설정하는 동안 리소스를 호출합니다.

테스트중인 응용 프로그램의 변경이 필요하고 잠재적 인 보안 위험이 있으므로 솔루션을 정말 좋아하지 않습니다. 실제로 나는 적어도 3 번은 플래그가 테스트되기 전에 테스트를합니다. 플래그가 설정되면 첫 페이지에 큰 빨간색 표시가 깜박입니다 (10 년 만에 깜박임 태그를 사용하는 좋은 이유입니다).). 그러나 아직도 그것은 약간 무서운 it 's.

0

테스트 용 데이터베이스를 조정하면 작업 속도가 빨라질 수 있습니다. Ofc. 이것은 당신이 사용하고있는 db 유형에 달려 있습니다 ... db 통합 테스트를 통해 간단하게 트랜잭션을 롤백 할 수 있습니다. 다른 통합 테스트를 통해 데이터 액세스 계층을 조롱 할 수 있습니다. 당신은 선택의 여지가 있지만, 실제 데이터베이스와 해당 시스템을 검사하는 기능 테스트함으로써

...

나는 현재 설비를함으로써 많은 도움이 될 수있는 이벤트 소싱을 실험하고있다. 이 기술에 대한 가장 짧은 설명 : DDD (CQRS 권장)가 필요하고 이벤트 저장소에 도메인 이벤트를 저장 한 다음 이벤트 저장소에서 관련 이벤트를 가져 와서 현재 상태를 빌드하고 순서. 이 이벤트 저장소 위에 여러 가지 캐시 데이터베이스를 구축 할 수 있습니다.이 데이터베이스에는 서비스 구성 요소의 현재 상태 만 포함됩니다. 더 이상 ... 동기화 프로세스는 projections라는 클래스에 의해 수행되며 자동으로 동기화 또는 비동기라고합니다 이벤트를 저장하여

결정기구 :

event.storage.clear(); 
every.cache.clear(); 

var credentials = { 
    name: "infje", 
    password: "oéö9péüöáé9oilusw" 
}; 
var resourceId = "swegretz34ze4wed"; 
var userDataSet = [ 
    { 
     id: 1, 
     type: "UserCreate", 
     resource: resourceId, 
     identificationFactors: credentials, 
     nick: "inf3rno", 
     birthDate: "1333.03.03.", 
     hobbies: ["wall climbing"] 
    }, 
    { 
     id: 2, 
     type: "UserUpdate", 
     resource: resourceId, 
     hobbies: ["base jumping", "knitting"] 
    } 
]; 

event.storage.persistAll(userDataSet); 
auth.cache.sync(event.storage); //a relational database with the user credentials 
users.cache.sync(event.storage); //a nosql document database with the user profile 
그래서 고정을하기 위해, 당신은 예를 들어

당신은 아주 간단한 REST API에서 다음처럼 작성할 수 있습니다 ... 전용 도메인 이벤트를 저장해야

기능 테스트 :

var response = http.get("https://my.test.api/users", credentials); 
assert(response).toEqual({ 
    size: 1, 
    items: [ 
     { 
      id: resourceId, 
      nick: "inf3rno", 
      hobbies: ["base jumping", "knitting"], 
      birthDate: "1333.03.03." 
     } 
    ] 
}); 

참고 :이 개념 코드의 단지 증거이며, 암호 암호화, REST의 하이퍼 미디어 제약, 사설과 같은 세부 그래서 프로젝션 클래스의 C 호출 등은 지금 관련이 없습니다.

c. 이것은 원래의 접근 방식보다 느린 여전히 느린 이벤트이지만, 실제 데이터베이스를 테스트하려는 경우 해당 부분을 변경할 수 없으며 이벤트 소싱을 통해 테스트 픽스처를 만들고 데이터를 마이그레이션하고 캐시 데이터베이스의 구조를 새 릴리스 등 ... 그래서 시도해 볼만한 가치가 있습니다.