오늘도 여전히 Debug.Assert를 사용해야합니까?


23

나는 최근에 많은 Debug.Assert (C #)와 함께 새로 작성된 코드를 발견했습니다.

일반적으로 TDD, BDD 및 단위 테스트를 사용 함에도 불구하고 여전히 이것을 널리 사용해야합니까?


9
한 사람이 다른 사람을 어떻게 배제하는지 알 수 없습니다.
superM

2
@superM 나는 게으른 개발자가 의존성을 모의하기 어려워 코드를 작성하기 전에 테스트를 어설 션으로 추가하는 것을 분명히 보았습니다. 말할 것도없이 이것을 추천하지 않을 것입니다
jk.

답변:


23

Assert를 사용하지 말아야 할 이유가 없습니다. 그렇게함으로써, 당신은 이미 전제 조건과 불변 인과 같은 경비원의 필요성을 인정했고 계약에 의한 설계 로 나아가고 있습니다. Assert는 이것을 달성하는 한 가지 방법 일뿐입니다 ...

// Precondition using Asert
void SomeMethod(Foo someParameter)
{
    Debug.Assert(someParameter != null)
}

// Precondition using If-Then-Throw
void SomeMethod(Foo someParameter)
{
    if (someParameter == null)
        throw new ArgumentNullException("someParameter");
}

// Precondition using Code Contracts
void SomeMethod(Foo someParameter)
{
    Contract.Requires(someParameter != null);
}

// Precondition using some custom library
void SomeMethod(Foo someParameter)
{
    Require.ArgumentNotNull(() => someParameter);
}

모두 같은 것을 달성하는 방법입니다 : 코드의 견고성. 옵션을 선택하면 Assert가 올바른 선택입니다.

유닛 테스트는 지금까지 전혀 다른 것을 달성하지 않았으므로 언급하지 않았습니다. 단위 테스트는 가드를 실행하여 코드의 견고성을 공식적으로 증명합니다.

[Test]
void SomeMethod_WhenGivenNull_ThrowsArgumentNullException()
{
    delegate call = () => someObject.SomeMethod(null);

    Assert.That(call).Throws<ArgumentNullException>();
}

이것은 완전히 다른 종류의 주장입니다 ...

** 일부 프레임 워크에서는 어설 션 오류로 인해 전체 런타임이 중단 될 수 있으므로 다른 옵션 중 하나가 선호 될 수 있으므로 어설 션 오류에 대한 단위 테스트는 실제로 매우 어렵습니다. *


10

Asserts와 Unit Test는 내 도구 상자에서 서로 다른 두 가지 도구라고 생각합니다. 어떤 것들은 한 가지에 더 적합하고 어떤 것들은 다른 것에 더 적합합니다.

예를 들어, 요즘 저는 주로 비공개 메소드의 매개 변수를 검증하기 위해 어설 션을 사용합니다.


5

요즘 Debug.Assert를 조기 최적화로 봅니다. 실제로 성능이 필요하지 않은 경우 릴리스 모드에서 Assert를 억제하면 버그를 더 오래 숨길 수 있습니다.

MattDavey가 지적한 것처럼 코드 계약 은 동적 검사 대신 정적 검사를 제공하는 것이 우수 할 수 있으며, 사용할 수없는 경우 Trace.Assert 또는 평범한 오래된 것을 선호합니다.if(x) throw SomeException;


4
릴리스 모드에서 Visual Studio를 사용하여 코드를 생성하면 Debug클래스의 메소드에 대한 모든 호출이 컴파일에서 생략됩니다. 따라서 Assert단순히 성능 을 위해 호출을 억제 하는 것은 조기 최적화가 아니라 평범한 말이 아닙니다.
Konamiman

@Konamiman 요점은 거의 항상 릴리스 모드에서 동일한 방식으로 실패하기를 원합니다. Debug.Assert는 97 %의 시간을 필요로하지 않습니다
jk.

그렇다면 3 %는 무엇입니까, @jk? 레거시 코드 또는 다른 인스턴스 만?
DougM

@DougM 성능이 중요한 코드, knuth 따옴표에 대한 참조. 나는 또한 내가 Heartbleed와 버그가 내보기 당신은 다른 선택의 여지가없는 경우를 제외하고, 귀하의 릴리스 코드에 있지 생략하다 전제 조건 검사를 수행 올바른 것을 보여줍니다 생각 추가 할 것
JK합니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.