2012-02-08 3 views
12

유닛 테스트 비공개 방법이 좋은 방법인지 궁금합니다.단위 테스트 개인 메서드가 좋은 방법입니까?

일반적으로 공용 인터페이스 만 테스트해야합니다.

그러나 복잡한 계산 중에 다른 개인 메서드가 여러 개 호출되는 경우 개인 메서드를 먼저 테스트하고 공용 인터페이스 메서드를 간단하게 테스트하는 것이 더 쉽다는 것을 알았습니다. checkIfValidTimeRange(...), moveToFilePos(...), fillBuffers(...) :

void play(){ ... } 
void pause(){ ... } 
void seek(time t) 
{ 
    //All Private methods 
    checkIfValidTimeRange(...); 
    moveToFilePos(...);  
    fillBuffers(...);  
} 

는 일반적으로 I가 단위 테스트를 작성합니다의 당신이 오디오 플레이어가 있고 기능을 가지고 가정 해 봅시다 예를 들어

.

하지만 이렇게하는 것이 좋은 방법인지 잘 모르겠습니다.

+2

무엇이든 할 수 있습니다. 개인적인 방법이 복잡한 경우 왜 테스트하지 않는 것이 좋습니까? –

답변

14

그것은 이 아니며 좋은 방법은 아닙니다 (아직 그렇게하지 않아도된다는 의미는 아닙니다). 가능하면 피해야합니다. 개인 방법 테스트는 보통 design could be better을 의미합니다.

  • moveToFilePos : 이제 플레이어의 예제를 잠깐 살펴 보자 더 나는 O 작업을 \ 일을 무언가의 책임 같은 소리가 아닌 음악 플레이어의
  • fillBuffers : 메모리 관리자의 작업보다 오히려 음악 플레이어에 비해
  • checkIfValidTimeRange : 다시, 아마 몇 가지 간단한 검증 클래스에 플레이어의 범위 밖으로 이동 될 수있는 순간 당신의,825에서

(이 다른 aswell 장소에서 유용 할 수 있습니다 것 같다)음악 플레이어은 I/O, 메모리 관리 등을 수행합니다. 그것은 모두 그 책임 범위에 실제로 있습니까?

+0

이 예제는 간단한 데모를 보여주기위한 것입니다. 하지만 MusicFileIO 클래스와 MusicFileBuffer 클래스를 만들어 확인해 보겠습니다. 이 클래스들을 뮤직 플레이어 클래스 내부에 만들어야합니까? (나는 그 존재를 사용자에게 노출시키고 싶지 않기 때문에). 그러나 내가 그들을 내부적이고 사적인 것으로 만들면 처음에는 내 문제로 돌아 가지 않을 것인가? – Anton

+1

@Anton : 새로운 클래스가 노출되는 정도가 적절하게 테스트되는 한 관련성이 없습니다. 우리는 여기서 실제 문제를 벗어나려고하고 있습니다. 개인 메서드를 테스트하는 것은 나쁘지 않습니다. * 메서드가 private *이기 때문에 나쁘지는 않지만, 일반적으로 * 가난한 디자인 *을 의미하기 때문입니다. 'fillBuffer' (* "Now 버퍼는 다른 곳에서 채워집니다!"- 익명 클라이언트 *)를 변경하면 상황에 빠지기를 원하지 않습니다. 프로그램에서 음악 재생이 중단됩니다. 지금은 거의 이해가되지 않습니다. 나중에 전혀 이해가되지 않습니다. –

+0

아직도. 테스트되지 않은 코드는 "레거시"코드가됩니다 ([레거시 코드로 효과적으로 작업] (http://www.amazon.co.uk/Working-Effectively-Legacy-Robert-Martin/dp/0131177052) 참조). 공개 인터페이스의 실제 복잡성이 개인적인 방법을 테스트하는 것이 완전히 불가능한 경우 (즉, 외관)에는 두 가지 사소한 경우가 있습니다. – Txangel

3

IMHO 아주 좋은 생각입니다. 나는 항상 그렇게합니다. 나는 보통 private 메소드를 액세스 가능하게 만들고 테스트 해주는 헬퍼 클래스를 만든다.

매우 특정한 것을하기 때문에 private 메소드를 테스트하는 것이 더 쉽다. 반면에 당신은 테스트하기에 좀 더 어려운 공개 방법이있을 수 있습니다. 따라서 단위 테스트가 확실히 간단 해집니다.

5

개인적인 방법이 테스트를 보증 할 정도로 복잡하면 개인 메서드가 공개 된 일부 클래스가 누락 된 것일 수 있습니다.

확실히 개인적인 방법을 테스트 할 수 있지만 디자인에 잘못된 것이 있다는 힌트로 사용해야합니다.

0

내 개인적인 방법 중 귀하의 코드 기반 중 어느 부분이 의존하고 있습니까? 누군가가 작업에 의존하는 방법 중 하나를 변경하여 사용자의 방법을 어기면 알만한 가치가 있지 않습니까? 테스트는 메소드가 정상적으로 작동하는지 확인하는 것뿐만 아니라 코드베이스의 다른 부분에서 변경 사항이 메소드를 손상시키지 않는지 확인하는 것입니다.

귀하의 방법이 귀하의 언어의 기본 구문 만 사용하지 않는 한 테스트하십시오!

관련 문제