문제

이전에 대규모 방법을 가지고있는 수업이 있어이 방법의 작업을 '도우미'방법으로 세분화했습니다.

이러한 도우미 방법은 선언됩니다 private 캡슐화를 시행하려면 큰 공개 방법을 테스트하고 싶습니다. 마치 헬퍼 방법을 유닛 테스트하는 것도 마치 마치 마치 마치 실패 할 공개 방법이 실패하는 것처럼, 이런 식으로 우리는 그것이 실패한 이유를 식별 할 수 있습니까?

또한 모의 개체를 사용하여 이것들을 테스트하기 위해서는 가시성을 비공개에서 보호로 변경해야합니다. 이것이 바람직합니까?

도움이 되었습니까?

해결책

한 가지 방법은 생략하는 것입니다 private 테스트를 동일한 패키지에 넣습니다. 그런 다음 테스트는 내부 방법을 호출 할 수 있지만 다른 사람 (= 패키지 외부)은 할 수 없습니다.

또한 내부 방법에 실패하면 오류 메시지가 생성되어 문제를 쉽게 해결할 수 있습니다. 코드를 프로덕션에 넣으면 테스트보다 적게 볼 수 있으며 문제를 빠르게 해결해야합니다. 그래서 여기서 1 분을 보낸 1 시간 후에 상사가 목에 앉아있는 한 시간 후에 당신을 구할 것입니다.

다른 팁

이것은 당신이 잘못된 문제가있는 것처럼 냄새가납니다. 당신이 설명한 것은 하위 "단위 테스트"를 만드는 것과 유사하며, 이로 인해 단위 테스트가 실제로 단위를 테스트하고 있다고 믿습니다.

그것은 당신이하려는 일에 대한 비판이 아닙니다. "오늘날 우리가있는 곳"에서 "측정 할 수있는 더 나은 다른 곳"으로가는 것은 승리의 움직임입니다. 그러나 현재 상황을 평가하기 위해 조금 뒤로 물러서서 현재 상황이 어떻게 다른지 이해하면 새로운 가능성을 보여주는 데 도움이 될 수 있습니다.

여기에는 도우미 방법을 범위화하는 것에 대한 많은 제안이 있습니다. 또 다른 가능성은 구현을 검토하여 현재 구현에 헬퍼 클래스가 숨겨져 있는지 확인하는 것입니다. 새로운 클래스와 운동을위한 다양한 테스트를 만드는 것은 항상 허용됩니다.

이 접근법은 리팩토링에서 단열됩니다. 테스트 스위트를 변경하지 않고 구현을 변경할 수 있습니다 (도우미 객체에 대한 단위 테스트는 더 이상 생산 구현의 일부가 아니더라도 도우미 객체에 대한 단위 테스트가 계속 전달되기 때문에). 구현 및 IT 테스트의 깨끗한 포장 (USECase : Bozo-Sort가 잘못된 구현이며 더 이상 사용되지 않도록 결정합니다. Bozo-Sort 구현이 분리되면 간단히 제거하고 테스트를 제거합니다. 그러나 Bozo-Sort 구현의 테스트가 다른 모든 테스트와 관련이있을 때 더 많은 사고가 관련되어 있습니다).

또한 코드에 대한 단위 테스트가있는 이유를 검토하는 데 도움이 될 수 있습니다. 그 이유 중 하나가 "리팩토링 안전을 위해"라면, 당신을 구현하는 테스트를 작성하고 싶지 않습니다.

당신의 수업이 정말로 크다면, 당신이 도우미를 끊어야하는 것처럼 들립니다. 사물, 도우미뿐만 아니라 행동 양식 (추출 방법은 종종 길을 따라 한 단계이지만). 이 작업을 마치면 이전 클래스가 더 단순하고 테스트하기가 쉬워지며 (아마도 모의가 있으면) 새로운 지원 클래스의 메소드를 직접 테스트 할 수 있습니다.

내가 선호하는 것은 객체의 공개 API를 통해 테스트하는 것입니다. 그것이 너무 힘들다면, 객체를 깨뜨려야한다는 힌트입니다.

나는 여기서 몇 가지 답변에 꽤 충격을 받았습니다.

본질적으로 일부 사람들은 "TDD 패러다임을 위반하기 때문에 개인 코드를 테스트하지 마십시오"라고 말합니다.

망할 코드를 테스트하십시오. 정확히 작동하는지 확인하기 위해 필요한 모든 것을 수행하십시오.

개인적으로, 나는 방법을 보호 또는 기본값으로 만들고, 테스트를 작성하고, 테스트를 실행하고, 성공할 때 개인으로 되돌아갑니다. 이 시점에서 나는 관련 테스트를 언급하고 그 위에 명령 블록을 남겨 둘 것입니다.

/** 이것에 대해 죄송하지만, 나는 엉망진창을 상속 받았다 ... *이 방법을 테스트 해야하는 경우 소스에 노출시키고 다음과 같은 * 줄 */

그러나 개발 방법론에 대한 엄격한 준수가 코드를 개선하는 데 방해가되지 않습니다.

테스트하고 싶다면 돕는 사람 방법을 비공개에서 변경할 수 있지만 이것을 고려할 수 있습니다.

리팩토링 및 테스트 "중단"으로 인해 변경 될 수 있기 때문에 구현의 개인 세부 정보를 주로 테스트해서는 안됩니다.

이것은 내가 계속해서 규칙을 어기는 경우 중 하나입니다.

만약 당신이 처음부터 수업을 설계하고 있다면, 당신은 분명히 도우미 방법을 스스로 테스트하는 것을 원하지 않지만 ... 기존 클래스를 리팩토링하기 때문에 규칙을 구부리기 위해 허용됩니다. '아무것도 깨뜨리십시오.

그들을 보호하게 만들도록 도우미를 스스로 테스트 할 수 있도록하고, 큰 머리볼 방법에서 논리를 뽑을 때 여전히 기대하는 동작을 갖도록하고, 그들을 위협하고 고정 응답을 반환하여 당신이 리팩토링중인 큰 방법이 도우미 방법의 특정 결과에 대해 예상대로 작동하는지 확인할 수 있습니다.

그러나 당신은 그 시점에서 아직 끝나지 않았습니다. 방법을 분할하는 것이 실제로 문제의 근본에 도달하지는 않습니다. 이제 모든 논리가 무엇을하는지 정확히 보여주는 방법을 분해하고 (약간 정통한) 테스트 세트가 있으므로 전체 클래스를 재검토하고 방법이 왜 있는지 알아 내기 위해 좋은 위치에 있습니다. 처음에는 너무 큽니다. 아마도 전체 학급은 불연속적인 책임을 가진 작은 단위로 나뉘어야하며 규칙을 구부리지 않고 테스트하기가 더 쉬울 것입니다.

기본적으로 두 가지 옵션이 있습니다.

  1. 도우미 방법의 범위를 개인에서 기본값으로 늘리십시오. 그런 다음이 방법을 테스트 할 수 있습니다 (테스트 클래스가 테스트 대상과 동일한 패키지에 있다고 가정). 이것은 클래스의 테스트 가능성을 향상 시키지만 일부 캡슐화를 희생합니다.

  2. 모든 것을 그대로 두십시오. 이렇게하면 매우 세밀한 테스트를 작성하지 못하지만 캡슐화를 희생 할 필요는 없습니다.

개인적으로, 나는 개인 방법을 테스트 할 필요가 없기 때문에 (2) 선택할 것입니다. 클래스는 공개 인터페이스를 통해 테스트해야합니다 (개인 메소드를 호출합니다. 개인 방법을 테스트하면 부서지기 쉬운 테스트, 즉 클래스의 내부 동작 만 변경할 때 실패하는 테스트를 초래할 수 있습니다.

세 번째 옵션이 있습니다 (언급하기를 꺼려합니다) : 반사 (또는 다른 부두)를 사용하여 테스트 클래스 내에서 개인 메소드를 호출하십시오. 이것은 (1)의 단점이 있으며 또한 반사 코드에 내재 된 단점이 있습니다 (예 : 유형 검사를 우회하고 읽기가 어렵습니다).

Don과 Dror가 말했듯이, 방법을 공개하여 단위 테스트를 만들 수 있도록 캡슐화를 중단합니다. 그런 다음 특정 구현에 자신을 묶습니다. 그것들을 공개적으로 만들면, 당신은 이러한 방법이 게시 된 인터페이스의 일부이며 해당 사양이 잠겨 있다고 세상에 선언합니다.

개인적으로, 나는보다 실용적인 해결책을 찾으러 갈 것입니다. 비공개를 유지하고 단위 테스트를 작성하지 마십시오. 공개 방법이 실패하고 이유를 알 수 없지만 개인 방법 중 하나에서 문제가 될 수 있다고 생각하면 일시적으로 공개하고, 단위 테스트, 디버그 및 귀하가 '다시 한 번, 다시 비공개로 만들고 단위 테스트를 언급하십시오.

당신은 코드의 해당 부분을 운동하는 단위 테스트를 작성하여 해당 도우미 방법을 테스트합니다.

이 클래스에서 공개 API를 이유 때문에 정의했습니다. 테스트하십시오. 작동하면 수업이 작동합니다.

코드 커버리지 도구를 사용하여 해당 클래스의 충분한 부분이 테스트되고 있는지 알 수 있으며 그렇지 않은 경우 더 많은 단위 테스트를 작성하여 공개 API를 운동하고 덮지 않은 모서리에 부딪칩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top