2009-06-08 9 views
2

단위 테스트가 있습니다. 각 테스트 메소드는 시스템의 기능에 대한 논리 UNIT를 테스트합니다. 내 유닛 테스트에서 외부 종속성 (db, file 등)은 Mocks와 Fakes를 사용하여 처리됩니다.통합 테스트 구성 요소

이제 iam이 통합 테스트에 어떻게 접근해야하는지 100 % 확신하지 못했습니다. 내가 단위 테스트를 반복하고 실제 자원 (DB, 파일 등)로 다음을 대체하거나 내가 같은 더 낮은 수준의 것들에 대한 테스트를해야한다 : 하나 개의 레코드를 검색 할 수 있습니다)

1) 데이터베이스
2 ping을 할 수
3) 파일이 존재
등 ...

내 직감 느낌이 그것의 대부분은 오른쪽 단위에서 수행 했어야 나는이 단계에서 비즈 논리를 방지해야한다는 것입니다?

감사

편집 : 난 내가 또한 내가 다음 내 통합 단계에서 비즈 로직을 테스트하기 위해 필요한 경우 내가 너무 내 테스트 스위트를 설정하는 방법이었다 알고 싶어 무엇을 내 질문에, 구성에 약간 게으른 테스트 코드 반복을 최소화합니다. 예를 들면 다음과 같습니다 :

[TestMethod] //Unit Tests 
public void CanGetData() 
{ 
IRepository rep = new MockRepository(); 
var result = rep.GetData(); 
Assert.IsTrue(result != null) 
} 

[TestMethod] //Integration Test 
public void CanGetData() 
{ 
IRepository rep = new Repository(); //real repository 
var result = rep.GetData(); 
Assert.IsTrue(result != null) 
} 

어떤 테스트 구조가 효과가 있습니까? 유닛 테스트 어셈블리를 통합 프로젝트에서 직접 사용하고 올바른 리소스를 주입합니까?

답변

4

통합 테스트는 이 아니고은 비즈니스 논리를 피해야합니다. 통합 테스트의 요점은 응집력있게 함께 작동하는 여러 앱 도메인의 동작을 확인하는 것입니다. 이 에는 비즈니스 로직이 포함됩니다.

단위 테스트는 특정 조건 하에서 단일 작업 단위가 올바르게 작동하는지 확인합니다. 그러나 이는 "작업 단위 (UOW)"가 시스템의 다른 "작업 단위 (UOW)"와 올바르게 작동한다는 것을 보증하지는 않습니다. 여기서 통합 테스트가 테스트 스위트에서 중요한 역할을합니다. 시스템 (DB, 파일 등)의

실제 자원 하지 비록 당신의 단위 테스트에서, 어떤 시점에서 테스트 스위트에 도입되어야한다. 대부분의 사람들은 통합 테스트가 리소스를 포함 할 적절한 위치에 있다는 것을 알게됩니다. 테스트 스위트에 환경 리소스를 포함시키는 것은 약간의 일이 될 수 있습니다. 또한 통합 테스트가 확실히 느려집니다.

또한 단위 테스트와 통합 테스트를 별도로 유지해야합니다. 나는 별도의 어셈블리를 선호한다. 이렇게하면 각 테스터를 통해 각각 별도로 실행하여 각 제품군에 대한 결과를 얻을 수 있습니다. 이유는 통합 테스트가 일반적으로 단위 테스트보다 훨씬 오래 실행되기 때문입니다.

3

글쎄, 수줍어하지 않을 수도 있지만 통합 테스트에서는 통합을 테스트해야합니다. 개별 단위를 테스트하는 대신 구성 요소가 함께 작동하는 것을 보여주는 광범위한 테스트가 필요합니다. 당신은 일반적으로 어떤 시점에서, 당신의 시스템이 mock 대신 실제 자원으로 작동한다는 것을 증명하기를 원합니다.

일반적으로 실제 데이터베이스 등으로 테스트해야합니다. 단위 테스트를 거쳤지 만 비즈니스 로직을 테스트해야합니다. 기본적으로 모든 사용자가 액세스 할 수있는 기능을 처음부터 끝까지 테스트하기 위해 시나리오를 실행해야하며 결과는 데이터베이스의 내용을 포함하여 예상대로 유지되어야합니다.

+1

대관 찰스! – ojblass

1

단위 테스트는 단일 구성 요소가 작동하는지 확인합니다. "구성 할 수있는 가장 작은 것"과 같은 "구성 요소". 이것들은 구성 요소의 내부 작업을 검증합니다.

통합 테스트는 사이의 인터페이스가 구성 요소인지 확인합니다. 예 : 클래스가 실제 데이터베이스에 데이터를 쓸 수 있습니까? 데이터베이스의 오류를 올바르게 처리합니까? 이 데이터를 데이터베이스에 저장하면 webapp에서 볼 수 있습니까?

일반적으로 둘 사이의 줄은 약간 유창합니다. "실제로 클래스가 통합 테스트라는 사실에도 불구하고"단위 테스트에서 "can 클래스 X 자체를 유지"할 것입니다.

대부분의 프로젝트는 노력으로 테스트를 구분합니다. 대부분의 개발자가 설정없이 실행할 수있는 경우 "단위 테스트"라고 말합니다. 여러 컴퓨터 (데이터로드, 프로그램 시작, 올바른 버전이 속한 곳임을 확인)를 준비해야하는 경우 "통합 테스트"라고합니다.

두 테스트 모두 자동화가 가능하며 자동화되어야합니다.

2

크게 정의가있는 YMMV입니다. IMHO 용어 "단위 테스트"는 언어 표류에서 발생했습니다. 자세한 내용은 내 blog post을 참조하십시오.

단위 테스트가 무엇인지 잘 알고있는 것 같습니다. 이 경우 무엇이 아닌지 설명함으로써 어떤 것을 정의하는 것이 더 쉬울 수도 있습니다. 통합 테스트는 실질적으로 유닛 테스트 (사용자 정의 제공)가 아닌 자동화 된 테스트입니다. 통합 테스트는 시스템의 구성 요소가 실제로 서로 통신하는 테스트를 자동화하는 데 사용하는 다른 모든 기술을 포함하는 상호 배타적 인 범주라고 생각합니다. 즉, 말하듯이 테스트의 컨텍스트에 외부 종속성이 존재 함을 의미합니다.

다른 것은 동의 할 수도 있지만 동의하지 않을 수도 있지만 중요한 점은 입니다. 주어진 테스트의 유지 관리 가능성은 테스트 컨텍스트 크기가 증가함에 따라 증가합니다.. 문맥이 클수록 시험은 더 느리고 유지가 쉽지 않습니다.

이 때문에, 당신은이 수준에서 테스트에서 벗어날 것을 정말로 생각하고 싶습니다. 통합 테스트를 유지하려면 계속적으로 통합해야하며, 실행하는 데 오랜 시간이 걸리면 일정한 간격으로 실행되도록 예약해야합니다. 종종 더 복잡해지기 때문에 고장이 났을 때 진단하기가 더 어려워지며 테스트 스위트에서 지속적으로 실행될 경우 테스트가 명확한 비즈니스 가치를 제공하는지 확인하기를 원할 것입니다. 이 말을하는 또 다른 방법은 테스트가 아닌 것보다 나쁜 테스트를하는 것이 더 나쁩니 다. 이것이 단위 테스트가 개발자로서 당신에게 가장 중요한 이유입니다. 격리 된 장치/구성 요소보다 높은 수준에서 테스트하면 단점이 줄어 듭니다.

이름을 지정하고 문서화하면 많은 도움이 될 수 있지만 조심해야합니다. 요구 사항/기능 또는 회귀/버그를 직접 겨냥한 통합 테스트를 작성하십시오. "연기 테스트"테스트의 경우 가장 관심있는 것 또는 가장 많이 손상되는 테스트입니다. 실용적이어야합니다.

희망이 도움이됩니다.

+0

내 현재 프로젝트의 마지막 계산에서 우리는 약 550 ~ 단위 테스트 방법에 있습니다! 그래서, 프로젝트가 유지하기 위해 괴물이되는 진행되고있다. 나는 지금 우리가 복귀 할 시점에 있다고 생각한다. 따라서 intergration 테스트 및 테스트 코드 reptetion 최소화하는 방법에 대한 내 질문. 아침에 당신의 블로그를 읽을 것입니다 :) –

+0

Gotcha. 나는 공감할 수있다. :) 나는 통합 테스트가 당신이 아무것도 유지할 수 있도록 도움이되지 않을 것이라는 내 견해를 가지고 있으며, 틀림없이 그들은 유지 보수를 어렵게 만듭니다. 당신이 당신에게 명확한 가치를 제공한다는 더 높은 수준의 시험을 소개 할 수 있는지 확인하십시오! 행운을 빕니다! – cwash

+0

정교하게 말하자면 주어진 시나리오를 테스트하기 위해 실제 코드를 반복하는 횟수가 줄어들지 만 고립 된 통합 테스트를 만드는 데는 많은 * 중복 *이 필요합니다. (즉, test1에 대해이 인프라를 모두 설정하고 test1을 실행하고 인프라 전체를 해체하십시오 ...) – cwash

0

편집 한 질문에 답하려면 (별도의 질문으로 바꾸거나 새 설명을 넣고 싶을 수도 있습니다 ...) 너 확실히별도의 관심, 그리고 확실히 싶어 의존성 주입를 사용하고 싶다. 종속성을 격리하고 구성을 사용하여 주입하십시오. 이렇게하면 구성이 아닌 코드에서 오브젝트를 스왑 할 수 있습니다. 그렇게하면 테스트 코드에서 객체 초기화를 모두 유지할 수 있습니다. (스테이징 및 프로덕션 환경에 대한 구성도 사용합니다 ...)

일반적으로이 용도로 Spring을 사용하지만 모든 DI/IoC 컨테이너가이 기능을 제공합니다. 이것은 가장 구성 가능한 접근 방식이며 이미 의존성 주입을 수행하고 있다면 잘 작동합니다. 또한 두 개의 스위트를 분리하여 보관한다는 아이디어와도 잘 어울립니다.