2017-10-20 4 views
1

프로덕션 코드에서 어설 션을위한 모범 사례를 찾으려고 노력하고 있지만, 내가 찾은 정보가 거의 없음에 놀랐습니다.프로덕션 코드에서 NUnit 어설 션

먼저 프로덕션 코드에 어설 션문을 사용할 수 있습니까?

둘째, 내장 된 Debug.Assert for .NET은 본질적으로 프로덕션 코드에서 자동으로 비활성화되고 실제로는 개발 환경에서만 실행된다는 것을 읽었습니다. 사실이며 NUnit도이 기능을 내장하고 있습니까?

예를 들어 프로덕션 코드에서 다음을 사용하면 어설 션이 무시됩니까?

var sortedActuals = actuals.OrderByDescending(a => 
        { 
         Assert.That(a.GLPeriodDateTime, Is.Not.Null, "GLPeriodDateTime was null when it should not be"); 
         return a.GLPeriodDateTime.Value; 
        }) 
+0

시도해 보셨습니까? 그 결과는 무엇입니까? – mason

+0

프로덕션 코드에서 NUnit 어설 션을 사용하지 않을 것입니다. 검사를 원할 경우 예외를 발생 시키거나 코드 계약을 사용할 수 있습니다. 이 경우'a' 클래스가'GLPeriodDateTime'이 null이되지 않도록해야합니다. – Lee

답변

2

프로덕션 코드에서 NUnit 어설 션을 사용하지 마십시오. 어설 션이 실패하면 NUnit 어설 션은 항상 예외를 throw합니다. NUnit은 Debug 또는 Release (Production)에서 실행 중인지 확인하지 않습니다. NUnit 어설 션은 또한 NUnit 테스트에서 사용하도록 설계되었습니다.

실제 코드의 어설 션의 경우 Debug.Assert을 사용해야합니다. 기능은 적지 만 출시 모드에서 컴파일되므로 프로덕션 환경에서 실행중인 앱이 중단되지 않습니다.

1

두 번째 질문부터 시작하겠습니다. 아니, 그 주장은 무시 당하지 않을 것이다. C# 프로젝트의 빌드 구성에서 빌드가 DEBUG 상수를 무시하도록 지정할 수 있습니다. 이것은 Debug.Assert 문을 제거하는 방법입니다 (Visual Studio에서는 기본적으로이 방식으로 빌드 구성을 제공합니다).

첫 번째 질문은 생산 코드에서 NUnit 어설 션을 사용하는 것이 용납 될 수 없다는 것입니다. 단언문이 예외 또는 다른 오류 상태를 가지고 어떤 이점을 사용합니까?

GLPeriodDateTime이 사용자의 결함없이 null 일 수있는 경우이 문제를 해결하기 위해 출시하기 전에 더 철저한 테스트가 필요할 수 있습니다. 사용자에게 오류가있는 경우 사용자에게 오류를 알리는 더 좋은 방법 (예 : 예외)이 있습니다. 어설 션은 개발자가 사용하기위한 것입니다.

+0

입력 해 주셔서 감사합니다. 내가 가져온 필드가 사용자 입력에 필요하기 때문에 null이 될 것으로 예상하지 않습니다. 일부 데이터는 레거시 시스템에서 가져오고 항상 "해당 데이터가 있어야"하는 동안 현명한 확인을하지 않을 것이기 때문에 나는 개발자를위한 수표를 좋아할 것입니다. 나는 개발자가 사용자를 귀찮게하지 않고 알릴 수 있도록 내장 된 어설 션을 사용할 것이라고 생각한다. –

3

NUnit 릴리즈 빌드에서 테스트가 필요하기 때문에 어설 션은 릴리즈 빌드에서 작동해야합니다. 여러 가지 이유로 프로덕션 코드에 NUnit 어설 션을 포함하면 안됩니다.

  1. NUnit과 주장 (뿐만 아니라 Debug.Assert는) 당신의 코드에서 문제를 감지하기위한 것입니다. 응용 프로그램에 제공되는 잘못된 데이터는 정상적인 응용 프로그램 흐름의 일부이므로 프로덕션 코드에서 감지하여 처리해야합니다.

  2. 어설 션은 결과가 의미하는 것을 알고있는 NUnit의 제어하에 실행됩니다. 예를 들어, 일부 어설 션은 실패시 예외를 발생시키고 다른 일부는 그렇지 않습니다. 당신은 그것의 어떤 유효한 사용하기 위하여 다름을 알 필요가있을 것입니다.

  3. 등 예외 처리, 사용자 지정 오류 메시지를 포함하여 잘못된 데이터를 다루는 다른, 잘 확립 된 방법이 있습니다

  4. 대부분의 경우, 당신은 NUnit과 제약 구문은 NUnit과 테스트에서 분리 사용하려고 . 그것은 좋은 구문이고 몇몇 사람들은 우리에게 별도의 패키지로 분리하도록 요청했습니다. 우리가 그렇게했다면, 그것을 사용할 수는 있지만, 불행하게도 아직하지 못했습니다.

+0

또 다른 멋진 대답, 고마워요. –