단위 테스트 속성에 일반적으로 공개 메소드가 필요한 이유는 무엇입니까?


12

최근에 .NET 어셈블리의 보호 된 메소드에 [TestInitialize]를 추가하는 것은 존중되지 않지만, 메소드를 공개하면 유닛 테스트 러너 (이 경우 Resharper)가 호출했습니다. 테스트 방법으로 과거에 여러 번 나타났습니다.

기술적으로 말하자면, 공개 방법만큼 사적인 방법에 쉽게 반영 할 수 있습니다. 사실상 리플렉션은 개인 메소드를 단위 테스트하는 데 사용되는 메소드입니다.

그렇다면 왜 모든 단위 테스트 방법을 공개해야합니까?


2
정말 좋은 질문입니다. 내가 들었던 유일한 좋은 주장은 SOLID 원칙의 일부인 "구현이 아닌 인터페이스에 대한 프로그램"이라는 원칙을 따른다는 것입니다.
Robert Harvey

9
클래스 테스트에 대해서는 이야기하지 않고 테스트 프레임 워크에서 호출하는 실제 테스트 메소드에 대해서는 이야기하지 않습니다.
jtiger

1
자바의 @RobertHarvey, 비슷한 제한의 이유 (예 : JUnit)는 프레임 워크 디자이너가 엉망이되고 싶지 않아 setAccessible어떤 커스텀 SecurityManager에 의해 차단 될 수 있기를
gnat

1
이 디자인 결정은 광범위한 사용을 목표로하는 범용 프레임 워크에 대해 결정되었다는 점을 고려해야합니다. 그런 경우 디자이너가 최악의 상황을 가정하고 준비하는 것이 더 안전합니다. 회사 내부 프레임 워크 (원하는 보안 정책을 보장 할 수있는 기회)이거나 협소하고 전문적인 목적을 가진 도구 ( "액세스 할 수없는 구성원에 대한 뷰어") 인 경우 고려해야 할 다른 옵션이 있습니다
gnat

2
@GregBurghardt이 동작은 Nunit에서 발견되며 Microsoft가 작성하지 않은 다른 테스트 프레임 워크 일 수 있습니다. 이 질문을 한 이후 몇 년 동안 나는 .NET에 대해 더 많이 이해하지만 여전히 공정한 질문이라고 생각하며 의견에는 좋은 토론이 있습니다.
저스틴 친애하는

답변:


2

클래스 가 수행 하는 방식 이 아니라 클래스의 수행 방식을 테스트해야 합니다.

"외부 세계"에 관한 한, 그것은 클래스가 공개적으로 이용할 수있는 모든 것입니다. 테스팅 프레임 워크도 같은 가정을하고 있습니다.

Public 이외의 것을 테스트하면 클래스의 내부 구현을 탐색하게되는데 이는 나쁜 생각입니다.


문제는 테스트중인 시스템의 방법이 아니라 테스트 방법에 관한 것입니다. OP는 리플렉션을 사용하여 공개보다 "낮은"것을 테스트 할 수 있다고 주장하는 것은 사실이지만, 테스트 프레임 워크가 개인 메소드에 액세스하는 능력에 대한 논쟁입니다. 테스트 프레임 워크는 리플렉션을 사용하여 테스트 방법 (속성으로 표시됨)을 찾아야하므로 리플렉션을 사용해야합니다. "왜 모든 단위 테스트 방법을 공개해야합니까?"
Theraot

테스트 메소드는 개인 메소드에 액세스 할 수 있습니다. 리플렉션을 사용하면 무엇이든 가능합니다. 나는 이것이 바람직하지 않은 것에 대해이 질문을 본다.
Phill W.

0

일반적으로 공개 메소드에만 액세스하는 것이 가장 좋습니다. 클래스를 작성할 때 다른 클래스가 코드에 액세스해야하는 계약도 작성합니다. 답은 컨벤션이기 때문에 가능합니다.


1
이것은 실제로 질문에 대답하지 않습니다.
RubberDuck
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.