테스트를 작성하는 데는 두 가지 이유가 있습니다.
- 예상되는 동작 주장
- 행동 회귀 방지
취하기 (1) 예상되는 행동 주장 :
예상되는 동작을 주장 할 때 코드가 예상대로 작동하는지 확인해야합니다. 이것은 모든 종류의 코드를 구현할 때 모든 개발자가 수행하는 일상적인 수동 확인을 수행하는 자동화 된 방법입니다.
- 내가 방금 쓴 것이 효과가 있었습니까?
- 이 루프가 실제로 종료됩니까?
- 내가 생각하는 순서대로 반복됩니까?
- null 입력에 대해 작동합니까?
이것들은 우리 모두가 머릿속에서 대답하는 질문이며, 일반적으로 우리는 코드를 머릿속에서도 실행하려고 시도합니다. 제대로 작동하는지 확인합니다. 이러한 경우 컴퓨터가 명확한 방식으로 응답하도록하는 것이 유용한 경우가 많습니다. 그래서 우리는 그것을 주장하는 단위 테스트를 작성합니다. 이를 통해 코드에 대한 자신감을 얻고 결함을 조기에 발견 할 수 있으며 실제로 코드를 구현하는 데 도움이 될 수도 있습니다.
필요할 때마다이 작업을 수행하는 것이 좋습니다. 이해하기 조금 까다 롭거나 사소하지 않은 모든 코드. 사소한 코드조차도 이점을 얻을 수 있습니다. 그것은 모두 자신의 자신감에 관한 것입니다. 얼마나 자주하고 얼마나 멀리 갈 것인지는 자신의 만족도에 달려 있습니다. 확실하게 예라고 답할 수있을 때 중지하십시오.
이런 종류의 테스트에서는 가시성, 인터페이스 또는 그 어떤 것도 신경 쓰지 않고 작동하는 코드 만 신경 쓰게됩니다. 예, 질문에 예라고 답하기 위해 테스트를 받아야한다고 생각되면 개인 및 보호 방법을 테스트합니다.
취해야 할 사항 (2) 행동 회귀 방지 :
작동하는 코드를 얻은 후에는이 코드를 향후 손상으로부터 보호 할 수있는 메커니즘을 마련해야합니다. 아무도 당신의 소스와 당신의 구성을 다시는 건드리지 않았다면 이것이 필요하지 않을 것이지만, 대부분의 경우 당신이나 다른 사람들은 당신의 소프트웨어의 소스와 구성을 건드릴 것입니다. 이 내부 조작은 작업 코드를 손상시킬 가능성이 높습니다.
메커니즘은 이러한 손상으로부터 보호하기위한 방법으로 이미 대부분의 언어로 존재합니다. 가시성 기능은 하나의 메커니즘입니다. 개인 메서드는 격리되고 숨겨집니다. 캡슐화는 사물을 구획화하는 또 다른 메커니즘으로, 다른 구획을 변경해도 다른 구획에 영향을주지 않습니다.
이를위한 일반적인 메커니즘은 경계에 대한 코딩입니다. 코드 부분 사이에 경계를 만들어 경계 안의 모든 것을 외부로부터 보호합니다. 경계는 상호 작용의 지점이되고 사물이 상호 작용하는 계약이됩니다.
즉, 인터페이스를 깨거나 예상되는 동작을 깨는 방식으로 경계를 변경하면 해당 경계에 의존하는 다른 경계가 손상되고 깨질 수 있습니다. 그렇기 때문에 이러한 경계를 대상으로하고 의미와 동작이 변경되지 않는다고 단언하는 단위 테스트를 갖는 것이 좋습니다.
이것은 일반적인 단위 테스트로, TDD 또는 BDD를 언급 할 때 가장 많이 말하는 것입니다. 요점은 경계를 강화하고 변경으로부터 보호하는 것입니다. private 메서드는 경계가 아니기 때문에이를 위해 private 메서드를 테스트하고 싶지 않습니다. 보호 된 방법은 제한적이며 보호 할 것입니다. 그들은 세계에 노출되지 않지만 여전히 다른 구획 또는 "유닛"에 노출되어 있습니다.
이것을 어떻게 만들까요?
지금까지 살펴본 것처럼 인터페이스가 변경되지 않는다고 주장하기 위해 공용 및 보호 된 메서드를 단위 테스트해야하는 좋은 이유가 있습니다. 또한 우리의 구현이 작동한다고 주장하기 위해 private 메서드를 테스트 할 좋은 이유가 있습니다. 그럼 모두 단위 테스트를해야할까요?
예 그리고 아니오.
첫째 , 가시성에 관계없이 코드가 작동한다는 확신을 가질 수 있도록 대부분의 경우에 작동한다는 확실한 증거가 필요하다고 생각하는 모든 메서드를 테스트합니다. 그런 다음 해당 테스트를 비활성화하십시오. 그들은 그곳에서 일을했습니다.
마지막으로 : 경계 테스트를 작성하십시오. 시스템의 다른 장치에서 사용할 각 포인트에 대해 단위 테스트를하십시오. 이 테스트가 의미 론적 계약, 메서드 이름, 인수 수 등을 주장하는지 확인하십시오. 또한 테스트가 단위의 사용 가능한 동작을 주장하는지 확인하십시오. 테스트는 장치 사용 방법과 장치가 할 수있는 작업을 보여 주어야합니다. 모든 코드 푸시에서 실행되도록 이러한 테스트를 활성화 상태로 유지하십시오.
참고 : 첫 번째 테스트 세트를 비활성화 한 이유는 리팩토링 작업이 발생하도록 허용하기 위해서입니다. 활성 테스트는 코드 커플 링입니다. 테스트중인 코드의 향후 수정을 방지합니다. 인터페이스 및 상호 작용 계약에만 이것을 원합니다.