2010-03-23 2 views
5

유닛 테스트를 처음 사용하는 사람에게는 새로운 것이므로 제 경험이 부족할 수도 있습니다. 나는 어떤 테스트도 다른 사람에게 의존해서는 안된다는, 즉 단위 테스트가 서로 완전히 독립되어 있어야한다는 많은 자료를 읽었습니다. 현실에서 그렇게 할 수 있습니까? 나는 다음과 같은 예제를 가지고있다. 특정 데이터베이스 스키마에 기반하여 서로에 의존하는 몇 개의 엔티티 클래스가있다. (나는 Linq-를 사용하여 SQL을 생성한다.) 이제 빌드해야하는 각 모델 클래스를 테스트하고 싶다. 모델 클래스의 객체, 각 의존성에 대한 테스트 객체를 빌드하고 객체의 속성에 할당 한 다음 컨텍스트를 확인하고 실제로 작동하는지 확인하기 전에 객체를 유지합니다.모델 테스트가 완전히 독립적 일 수 있고 어떻게 [ASP.NET MVC]

분명히 서로 의존하지 않는 테스트를 만들거나 특정 순서로 실행하지 않게 만듭니다 (적어도 하나의 유형 인스턴스를 갖기 전에 작성해야하는 유형의 인스턴스 인스턴스가 아닙니다. ContentType) 최소한 모델 수준의 종속성이 있으므로 피할 수 없습니다.

내가 틀렸다고 생각하면 제발 많이 비판 해주세요. 배우고 싶습니다.

P. 내가 ASP.NET MVC 앱을 개발하고 NUnit을 테스트하는 중이라면 언급하겠다.

답변

1

예, 단위 테스트는 독립적이어야한다. 당신이 설명하는 문제는 의존성에 관한 것입니다. 종속성은 Dependency Injection 프레임 워크를 사용하여 해결해야합니다 (AutoFac, Ninject 프로젝트 참조).

다른 것은 데이터베이스가 모의 객체를 사용하여 조롱되어야한다는 것입니다 (Moq, Rhino Mocks 프로젝트 참조). 데이터베이스가 분리 된 경우에도 모든 코드를 테스트해야합니다.

다른 단점은 단위 테스트는 모든 프로세스가 아닌 하나의 기능 만 테스트해야한다는 것입니다.

1

여기서 설명하는 것은 단위 테스트가 아니며 통합 테스트입니다. 응용 프로그램의 데이터 모델이 데이터베이스와 밀접하게 결합되어 있으므로 테스트는 아마도 "datamodel"이 아닌 데이터베이스 기능을 테스트 할 것입니다.

이것은 완벽하게 훌륭합니다. 통합 테스트에는 (귀하의 경우 데이터베이스에서) 설정이 필요하고 실행하는 데 오랜 시간이 걸립니다.

다른 구성 요소와 완벽하게 격리 될 수 있고 데이터베이스를 실행할 필요가없는 컨트롤러에 대한 단위 테스트가있을 수도 있습니다. 이러한 단위 테스트는 사용자가 얘기하는 단위 테스트입니다.

실제 데이터베이스 기능을 테스트하지 않으면 가짜/모의 객체를 사용하여 외부 클래스를 대체 할 수 있습니다. 실제로 초기 MVC 프로젝트로 생성 된 테스트에는 가짜 객체를 롤백하여 정확히 수행합니다.

외부 종속성을 "분리"하는 또 다른 방법은 자신의 클래스로 Linq2Sql 코드를 왜곡하고 Mocking 프레임 워크를 사용하여 이러한 클래스 호출을 위조하는 것입니다.

2

, 실제로 이것을 수행 할 수 있습니다.

각 단위를 분리 할 수있는 열쇠는 약자 코드로 작성되어 있습니다. LINQ to SQL (L2S) 클래스에 대한 종속성은 느슨하게 결합되지 않으므로 문제가 설명됩니다.

L2S 코드를 숨길 수있는 일련의 인터페이스를 정의하는 것이 좋습니다. 그런 다음 도메인 모델은 L2S 클래스에서 직접 작동하는 대신 해당 인터페이스에서 작동합니다.

+0

컨트롤러를 더 잘 테스트해야합니다. 또는 저장소 패턴을 사용하는 경우 저장소를 테스트 할 수 있습니까? – xantrus

+0

모든 코드 또는 코드 (각 유닛은 격리되어 있음)를 테스트해야하지만 리포지토리 패턴은 느슨한 결합의 좋은 예입니다. 이것은 당신이 콘트 리트를 콘트리트 리포지터리와 독립적으로 테스트 할 수 있다는 것을 의미합니다. 그리고 다른 단위 테스 트에서는 컨트 롟러를 다루지 않고 콘 Re츠 리티를 테스트 핛 수 있습니다. –

관련 문제