나에게 중요한 차이점은 통합 테스트 에서 기능이 작동하거나 깨 졌는지 여부를 밝혀내는 것입니다. 실제와 가까운 시나리오에서 코드에 스트레스를주기 때문입니다. 하나 이상의 소프트웨어 메소드 또는 기능을 호출하고 예상대로 작동하는지 테스트합니다.
반대로 단일 방법을 테스트 하는 단위 테스트 는 모든 종속성을 명시 적으로 조롱하기 때문에 나머지 소프트웨어가 올바르게 작동한다고 가정합니다 (종종 잘못된 가정).
따라서 일부 기능을 구현하는 방법에 대한 단위 테스트가 녹색 인 경우 기능이 작동하고있는 것은 아닙니다 .
다음과 같은 방법이 있다고 가정 해보십시오.
public SomeResults DoSomething(someInput) {
var someResult = [Do your job with someInput];
Log.TrackTheFactYouDidYourJob();
return someResults;
}
DoSomething
고객에게 매우 중요합니다. 기능 만 중요합니다. 그렇기 때문에 일반적으로 Cucumber 사양을 작성 하여 기능이 작동 하는지 여부 를 확인 하고 전달 하려고합니다 .
Feature: To be able to do something
In order to do something
As someone
I want the system to do this thing
Scenario: A sample one
Given this situation
When I do something
Then what I get is what I was expecting for
의심 할 여지없이 : 테스트에 통과하면 작업 기능을 제공한다고 주장 할 수 있습니다. 이것이 바로 비즈니스 가치 라고 부릅니다 .
단위 테스트를 작성 DoSomething
하려면 나머지 클래스와 메소드가 작동하는 것 (즉, 메소드가 사용하는 모든 종속성이 올바르게 작동 함)을 척하고 (모의를 사용하여) 메소드가 작동하고 있다고 주장해야합니다.
실제로 다음과 같은 작업을 수행합니다.
public SomeResults DoSomething(someInput) {
var someResult = [Do your job with someInput];
FakeAlwaysWorkingLog.TrackTheFactYouDidYourJob(); // Using a mock Log
return someResults;
}
Dependency Injection, Factory Method 또는 Mock Framework를 사용하거나 테스트중인 클래스를 확장 하여이 작업을 수행 할 수 있습니다.
에 버그가 있다고 가정합니다 Log.DoSomething()
. 운 좋게도 Gherkin 사양에서이를 찾아 내고 종단 간 테스트에 실패합니다.
기능이 작동하지 않습니다. 기능이 작동 Log
하지 않기 때문 [Do your job with someInput]
이 아닙니다. 그리고 [Do your job with someInput]
그 방법에 대한 책임은 전적으로 귀하에게 있습니다.
또한 Log
100 개의 다른 기능, 100 개의 다른 클래스의 100 개의 다른 메소드에서 사용 된다고 가정하십시오 .
그러나 100 가지 기능이 실패합니다. 그러나 다행스럽게도 100 개의 엔드 투 엔드 테스트가 실패하고 문제가 드러났습니다. 그리고 그렇습니다 : 그들은 진실을 말하고 있습니다.
매우 유용한 정보입니다. 깨진 제품이 있다는 것을 알고 있습니다. 또한 매우 혼란스러운 정보입니다. 문제가 어디에 있는지 전혀 알려주지 않습니다. 근본 원인이 아니라 증상을 알려줍니다.
그러나 DoSomething
단위 테스트는 Log
절대로 깨지지 않는 가짜를 사용하기 때문에 녹색 입니다. 그리고 그렇습니다 : 그것은 분명히 거짓말 입니다. 고장난 기능이 작동 중임을 알리고 있습니다. 어떻게 유용 할 수 있습니까?
( DoSomething()
의 단위 테스트에 실패하면 [Do your job with someInput]
몇 가지 버그가 있습니다.)
이것이 클래스가 깨진 시스템이라고 가정하십시오.
하나의 버그로 여러 기능이 중단되고 여러 통합 테스트가 실패합니다.
반면에 동일한 버그는 단 하나의 단위 테스트 만 중단합니다.
이제 두 시나리오를 비교하십시오.
동일한 버그로 단 하나의 단위 테스트 만 중단됩니다.
- 깨진
Log
부분을 사용하는 모든 기능 은 빨간색
- 모든 단위 테스트는 녹색이고 단위 테스트
Log
는 빨간색입니다
실제로는 기능을 사용하지 않는 모든 모듈에 대한 단위 테스트는 녹색입니다. 모의를 사용하면 종속성이 제거 되었기 때문입니다. 다시 말해, 그들은 이상적인 가상의 세계에서 실행됩니다. 그리고 이것이 버그를 격리하고 찾는 유일한 방법입니다. 단위 테스트는 조롱을 의미합니다. 조롱하지 않으면 단위 테스트가 아닙니다.
차이점
통합 테스트는 작동하지 않는 것을 알려줍니다 . 그러나 문제의 위치 를 추측하는 데 아무런 소용이 없습니다 .
단위 테스트는 버그의 정확한 위치 를 알려주는 유일한 테스트입니다 . 이 정보를 얻으려면 다른 모든 종속 항목이 올바르게 작동하는 모의 환경에서 메소드를 실행해야합니다.
그렇기 때문에 당신의 문장이 "아니면 2 개의 수업에 걸친 단위 테스트 일뿐"이라는 말이 어떻게 바뀌 었는지 생각합니다. 단위 테스트는 2 개의 클래스에 걸쳐서는 안됩니다.
이 답변은 기본적으로 여기에 쓴 내용에 대한 요약입니다. 단위 테스트는 거짓말 입니다.