Spring. Net 에서 테스트 지원

6956 단어 spring
Spring 팀 은 테스트 가 기업 소프트웨어 개발 에서 없어 서 는 안 되 거나 없어 서 는 안 되 는 일부분 이 라 고 생각한다.
주입 에 의존 하 는 주요 장점 중 하 나 는 코드 의 운행 환경 이나 다른 서브 시스템 입 니 다. 숨겨 진 의존 관 계 는 없 을 것 입 니 다.이로써 단원 테스트 에서 테스트 대상 은 간단하게 실례 화 되 고 단원 테스트 코드 에 의존 하도록 설정 할 수 있다.코드 격 리 를 테스트 하기 위해 mock 대상 (다른 많은 가치 있 는 테스트 기술 과 연결) 을 사용 할 수 있 습 니 다.Spring 의 구조 제안 을 따 르 면 뚜렷 한 차원 과 코드 구성 요소 가 유닛 테스트 에 큰 편 의 를 줄 것 입 니 다.예 를 들 어 서비스 계층 대상 의 존 근 이나 DAO 인 터 페 이 스 를 테스트 할 수 있 습 니 다. 영구적 인 데 이 터 를 방문 하지 않 은 동시에 유닛 테스트 를 실행 할 수 있 습 니 다.
실제 유닛 테스트 는 실행 할 때 인 프 라 시설 의 설정, 즉 데이터 베이스, ORM 도구 또는 다른 무엇이 없 기 때문에 매우 빠르게 실 행 됩 니 다.따라서 당신 의 개발 방법론 의 일부분 으로서 진정한 단원 테스트 가 당신 의 생산력 을 향상 시 킬 것 이 라 고 강조 합 니 다.
그러나 마찬가지 로 중요 한 것 은 통합 테스트 를 실행 하여 테스트 할 수 있 는 것 입 니 다. 예 를 들 어 Spring IoC 용기 컨 텍스트 의 정확 한 설정 입 니 다.데이터 접근 은 ADO. NET 또는 ORM 도 구 를 사용 합 니 다.이것 은 SQL 의 정확성 과 같은 일 을 포함 할 것 이다. /NHibernate 의 XML 맵 파일 입 니 다.
Spring. NET 은 두 가지 테스트 환경 을 지원 합 니 다. NUnit 테스트 에 대한 지원 정 의 는 파일 Spring. Testing. NUnit. dll 에 있 습 니 다. 여 기 는 NUnit 2.5.1 을 사용 합 니 다.MSUnit 에 대한 지원 정 의 는 Spring. Testing. Microsoft. dll 에 있 습 니 다.
이 프로그램 들 은 NUnit 와 MSTest 의 부모 클래스 AbstractDependency Injection Spring ContextTests 를 집중 적 으로 제공 하여 Spring 용기 의 통합 테스트 를 지원 합 니 다.이러한 초 류 는 다음 과 같은 기능 을 제공 합 니 다.테스트 인 스 턴 스 는 매우 투명 한 의존 주입 입 니 다.통합 테스트 에 적합 한 사무 관리.일련의 Spring 의 특정한 계승 사례 변 수 는 정말 유용 할 때의 통합 테스트 입 니 다.
문맥 관리
Spring. Testing. NUnit 와 Spring. Testing. Microsoft 네 임 스페이스 는 Spring 컨 텍스트 와 캐 시 를 일치 하 게 불 러 오 는 능력 을 제공 합 니 다.마찬가지 로 Spring 은 캐 시 컨 텍스트 를 테스트 하 는 데 매우 중요 합 니 다. 큰 프로젝트 에서 작업 을 한다 면 시작 시간 이 문제 가 될 수 있 습 니 다. Spring 자체 의 비용 때 문 이 아니 라 Spring 용기 에서 초기 화 된 대상 이 실례 화 되 기 때 문 입 니 다.예 를 들 어 50 - 100 의 NHibernate 맵 파일 프로젝트 는 10 - 20 초 동안 맵 파일 을 불 러 오고 그 전에 모든 테스트 사례 를 실행 하 게 할 수 있 습 니 다. 모든 테스트 사례 는 전체적인 테스트 효율 을 떨 어 뜨 릴 수 있 습 니 다.
이 문 제 를 해결 하기 위해 AbstractDependency InjectionSpringContextTests 는 부모 클래스 로 서 하위 클래스 는 컨 텍스트 정의 파일 의 위 치 를 제공 해 야 합 니 다.
protected abstract string[] ConfigLocations { get; }

이 속성 방법의 실현 은 프로그램 설정 에 사용 할 메타 데이터 XML 설정 자원 의 위 치 를 포함 하 는 배열 을 제공 해 야 합 니 다.이것 은 일반적인 App. config / Web. config 또는 다른 배치 설정 에서 지정 한 장소 와 거의 같 습 니 다.기본적으로 불 러 오 면 설정 파일 의 설정 은 모든 테스트 용례 에서 다시 사 용 됩 니 다.이렇게 설정 한 비용 은 한 번 만 발생 하고 다음 테스트 는 훨씬 빨 라 집 니 다.어떤 경우 에는 설정 가능 한 위 치 를 테스트 하려 면 다시 불 러 와 야 합 니 다. 예 를 들 어 '더러 운', 대상 의 정의 나 응용 대상 의 상 태 를 바 꾸 면 SetDirty () 방법 을 사용 할 수 있 습 니 다. AbstractDependency InjectionSpringContextTests 는 테스트 사례 를 통 해 설정 재 구축 을 다시 불 러 온 다음 테스트 사례 의 응용 프로그램 컨 텍스트 를 실행 할 수 있 습 니 다.
 
테스트 용례 의 의존 주입
AbstractDependency InjectionSpringContextTests (하위 클래스) 가 프로그램 을 불 러 오 는 경우 Setter 를 통 해 테스트 클래스 에 주입 하 는 인 스 턴 스 를 선택적으로 설정 할 수 있 습 니 다.모든 할 일 은 인 스 턴 스 변수 와 해당 하 는 setter 방법 을 정의 하 는 것 입 니 다.AbstractDependency InjectionSpringContextTests 는 ConfigLocations 속성 에서 지정 한 프로필 설정 에서 해당 대상 을 자동 으로 찾 습 니 다.아래 의 상황 을 고려 하여 우 리 는 하 이 버 네 이 트 TitleDao 라 는 클래스 가 있 습 니 다. 데이터 접근 논 리 를 실행 하여 Titl e 도 메 인 대상 을 얻 을 수 있 습 니 다.
통합 테스트 를 작성 하려 면 다음 과 같은 몇 가지 측면 을 테스트 해 야 합 니 다.Hibernate 맵 파일 의 설정 은 모든 정확 한 맵 과 정확 한 지연 을 지방 설정 에 불 러 오 는 것 입 니까?논리 와 HibernateTitleDao;예상 한 대로 이 종류의 인 스 턴 스 를 설정 하 시 겠 습 니까?
/// <summary>
///      AbstractDependencyInjectionSpringContextTests     
///      ConfigLocations                 
/// AbstractDependencyInjectionSpringContextTests           
/// </summary>
[TestFixture]
public class HibernateTitleDaoTests : AbstractDependencyInjectionSpringContextTests {

    // this instance will be (automatically) dependency injected
    //        
    private HibernateTitleDao titleDao;
        
    // a setter method to enable DI of the 'titleDao' instance variable
    //      
    public HibernateTitleDao HibernateTitleDao {
        set { titleDao = value; }
    }

    [Test]
    public void LoadTitle() {
        Title title = this.titleDao.LoadTitle(10);
        Assert.IsNotNull(title);
    }

    // specifies the Spring configuration to load for this test fixture
    //          
    protected override string[] ConfigLocations {
        get
        {
            return new String[] { "assembly://MyAssembly/MyNamespace/daos.xml" };
        }
    }
}

이와 관련 된 설정 매개 변 수 는 다음 과 같 습 니 다.
<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net">
<!-- this object will be injected into the HibernateTitleDaoTests class -->
<object id="titleDao" type="Spring.Samples.HibernateTitleDao, Spring.Samples">
<property name="sessionFactory" ref="sessionFactory"/>
</object>
<object id="sessionFactory" type="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate">
<!-- dependencies elided for clarity -->
</object>
</objects>

AbstractDependency InjectionSpringContextTests 류 사용 유형 자동 조립.따라서 같은 유형의 여러 대상 에 대한 정의 가 있다 면 이런 방법 으로 특정한 대상 에 대해 서 는 안 된다.이 경우 계 승 된 applicationContext 인 스 턴 스 변 수 를 사용 하고 (예 를 들 어) applicationContext. GetObject ("titleDao") 를 사용 하 는 명시 적 호출 을 명 확 히 찾 을 수 있 습 니 다.

좋은 웹페이지 즐겨찾기