2012-06-20 2 views
0

좋아, 지금 화나지 마라. 나는이 주제에 대해 몇 가지 질문이 있지만 여전히 의문점이 있음을 알고있다.개인 변수 값에 대한 테스트

개인 함수를 테스트하지 않는 것에 대해서는 완전히 동의한다고 생각합니다. 합리적이라고 생각하지만 private 변수를 설정하는 공용 메서드를 테스트하려면 어떻게해야합니까?

생성자가 일부 개인 변수를 설정하고 해당 변수가 생성자가 호출 된 후 올바르게 설정되었는지 테스트하려고한다고 가정 해 보겠습니다. 유효한 시험입니까? 공개 getter를 추가하지 않고 private 변수의 값을 어떻게 확인해야합니까?

나는 명확하게하려고하는하지 실제 시나리오 예제를 추가

public class ClassToTest 
{ 
    private bool _isOn; 

    public void SwitchOn() { _isOn = true; } 
    public void SwitchOff(){ _isOn = false; } 

    public void update() 
    { 
     if (_isOn) 
     DoSomething(); 
    } 

    private void DoSomething() 
    { 
    //this could also execute a function of an external dependency. But still the dependency could not have a public function to test if the behavior actually ran. 
    } 
} 

는 어떻게 스위치 온과 스위치 오프 작업이 제대로 나는 _isOn 값에 대해 테스트 할 수없는 경우 있는지 테스트 할 수 있습니까? (예를 들어 공용 getter를 작성하지 않고 함수가 값을 반환하지 않는다는 것을 의미합니다.)

+0

값을 확인해야합니까? 그들이 다른 방법으로 사용되는 방식으로 그들의 가치를 확신 할 수 없습니까? – luketorjussen

+0

문제는 다른 곳에서 가장 많이 드러납니다. 클래스의 전용 부분은 테스트하지 말아야합니다. 이는 고객과 관련이없는 구현 세부 사항이기 때문입니다. 문제를 나타내는 컨텍스트/코드 샘플을 더 제공 할 수 있습니까? 그렇지 않으면 너무 일반적인 답변을 얻을 수 있습니다. –

+0

done .... – sebas

답변

0

테스트는 조립/활성화/어설 패턴을 사용한다

(그들은 예와 아니오!; 모두를 말할 것이다위한, 조언, 엘프, 또는 소프트웨어 방법 론자로하지 이동) 당신은 스위치가있는 실제 이유를 주장합니다. 스위치 자체를 테스트하면 "TDD getter 및 setter를 사용하지 마십시오"라는 규칙이 적용되지 않습니다.

+0

아, 예를 들어이 기사를 가져 왔습니다 : http : // www.codeproject.com/Articles/5019/Advanced-Unit-Testing-Part-I- 세터가 실제 테스트를 거친 부분에 대해서 – sebas

+0

세터 옆에 닉네임을 달았습니다. 당신이 독자적으로 작성한 것을 알아 냈습니다.하지만 당신은 여전히 ​​뭔가 있다고 가정합니다. public (count) ... ClassToTest가 isOn 값에 따라 실행되는 함수가있는 종속성을받는 또 다른 예제를 작성할 수 있습니다. 동일한 종속성은 함수가 실제로 실행되었음을 테스트하는 공용 함수를 가질 수 없습니다. – sebas

+0

유닛 테스트가 어떻게 것들을 디커플링 (decouple)하게 만드는지를 발견하고 있습니다. – Phlip

-1

개인 구성원은 버그가있을 수 있으므로 테스트해야합니다.

"개인"은 마법의 장벽이 아닙니다. 단순히 프로덕션 코드 클라이언트가 해당 회원을 직접 호출하지 말 것을 권고하는 컨벤션입니다.

이러한 멤버를 _underbar로 모두 추가하면 C++과 같은 방법으로 하드웨어를 보호 할 수 있습니다.

차량 엔진에는 주행 중에는 사용해서는 안되는 플러그가있어서 정비사가 테스트 할 때만 사용할 수 있습니다. 소프트웨어는 동일해야합니다. 비공개 멤버를 테스트하고 필요한 경우 비공개를 비활성화하십시오. 그러나

... 객체의


점은 동작을 노출하는 것입니다. 개인 변수가 올바르게 설정되면 개체가 올바르게 작동해야합니다. 테스트에서이 동작을 요청해야합니다.

"시험 주도 개발"(그리고 어제)을 찾아보고 "의도적 프로그래밍"을 찾아보십시오. 테스트 케이스는 해당 동작을 요청하여 시작해야하며 구현 세부 사항을 염려해서는 안됩니다. 다른 내부 구조를 사용하도록 객체를 업그레이드하면 아무런 이유없이 너무 많은 테스트가 중단 될 필요가 없습니다.

test switch on { 
    x = new ClassToTest(); 
    x.SwitchOn(); // <-- Assemble an on switch 
    EmptyMailQueue(); // <-- Assemble nothing in the Q 

    PossiblySendUserEmail(); // <-- Activate the feature 

    assert(mailQueue.count() == 1); 
    } 

test switch on { 
    x = new ClassToTest(); 
    x.SwitchOff(); 
    EmptyMailQueue(); 

    PossiblySendUserEmail(); 

    assert(mailQueue.count() == 0); // <-- Assert switch is off so no mails sent 
    } 

:

관련 문제