방어 프로그래밍을 지원하고 보장하기위한 테스트가 있습니다.
방어 프로그래밍은 런타임시 시스템의 무결성을 보호합니다.
테스트는 (대부분 정적) 진단 도구입니다. 런타임에는 테스트가 보이지 않습니다. 그들은 높은 벽돌 벽이나 바위 돔을 세우는 데 사용되는 비계와 같습니다. 시공 중에 비계를 지탱하기 때문에 중요한 부품을 구조물 밖으로 두지 마십시오. 모든 중요한 조각 을 쉽게 넣을 수 있도록 비계를 제작하는 동안 비계가 있습니다 .
편집 : 유추
코드의 주석과 유사합니까?
의견은 목적이 있지만 중복되거나 해로울 수 있습니다. 예를 들어, 코드에 대한 본질적인 지식을 comment 에 넣은 다음 코드를 변경하면 주석이 전혀 관련이없고 최악의 경우 유해하게됩니다.
따라서 MethodA는 null을 취할 수 없으며 MethodB의 인수는이어야 > 0
합니다. 와 같이 코드베이스에 대한 많은 기본 지식을 테스트에 넣었다고 가정 해보십시오 . 그런 다음 코드가 변경됩니다. A는 지금 Null이면 괜찮으며 B는 -10만큼 작은 값을 가질 수 있습니다. 기존 테스트는 이제 기능상 잘못되었지만 계속 통과합니다.
예, 코드를 업데이트하는 동시에 테스트를 업데이트해야합니다. 또한 코드를 업데이트 할 때 주석을 업데이트하거나 제거해야합니다. 그러나 우리는 이러한 일이 항상 일어나는 것은 아니며 실수가 있다는 것을 알고 있습니다.
테스트는 시스템의 동작을 확인합니다. 실제 행동은 테스트 자체가 아니라 시스템 자체에 내재되어 있습니다.
무엇이 잘못 될 수 있습니까?
테스트와 관련된 목표는 잘못 될 수있는 모든 것을 생각하고 올바른 동작을 확인하는 테스트를 작성한 다음 런타임 코드를 작성하여 모든 테스트를 통과시키는 것입니다.
방어 적 프로그래밍이 핵심 이라는 것을 의미한다 .
테스트가 포괄적 인 경우 TDD 는 방어 프로그래밍을 주도합니다 .
더 많은 테스트, 더 방어적인 프로그래밍
버그가 불가피하게 발견되면 버그를 나타내는 조건을 모델링하기 위해 더 많은 테스트가 작성됩니다. 그런 다음 해당 테스트를 통과시키는 코드로 코드가 수정 되고 새 테스트는 테스트 스위트에 남아 있습니다.
좋은 테스트 세트는 좋은 인수와 나쁜 인수를 모두 함수 / 방법에 전달하고 일관된 결과를 기대합니다. 이는 테스트 대상 구성 요소가 사전 조건 검사 (방어 프로그래밍)를 사용하여 전달 된 인수를 확인한다는 의미입니다.
일반적으로 말하면 ...
예를 들어, 특정 프로 시저에 대한 널 인수가 유효하지 않은 경우 하나 이상의 테스트가 널을 전달하고 "유효하지 않은 널 인수"예외 / 오류가 예상됩니다.
적어도 하나의 다른 테스트는 물론 유효한 인수 를 전달 하거나 큰 배열을 통해 루프하고 유효한 인수를 전달하여 결과 상태가 적절한 지 확인합니다.
테스트 가 해당 null 인수를 전달 하지 않고 예상 예외와 함께 스랩되는 경우 (코드가 전달 된 상태를 방어 적으로 확인했기 때문에 예외가 발생 함) null은 클래스의 속성에 할당되거나 묻힐 수 있습니다. 어떤 종류의 컬렉션에 있어서는 안됩니다.
이로 인해 소프트웨어가 배송 된 후 멀리 떨어진 지리적 로캘에서 클래스 인스턴스가 전달되는 시스템의 완전히 다른 부분에서 예기치 않은 동작이 발생할 수 있습니다 . 그리고 우리가 실제로 피하려고하는 것입니다. 맞습니까?
더 나빠질 수도 있습니다. 유효하지 않은 상태의 클래스 인스턴스는 직렬화 및 저장 될 수 있으며 나중에 사용하기 위해 재구성 될 때만 실패 할 수 있습니다. 잘 모르겠습니다. 어쩌면 그것은 자체의 지속적인 구성 상태를 직렬화 해제 할 수 없기 때문에 종료 후 다시 시작할 수없는 일종의 기계 제어 시스템 일 것입니다. 또는 클래스 인스턴스를 직렬화하여 다른 엔터티가 만든 완전히 다른 시스템으로 전달하면 해당 시스템이 중단 될 수 있습니다.
특히 다른 시스템의 프로그래머가 방어 적으로 코딩하지 않은 경우.