어설 션 대 JUnit 어설 션


85

오늘 저는 JUnit 어설 션 대신 자바 어설 션이있는 JUnit 테스트 케이스를 보았습니다. 다른 하나를 선호하는 데 중요한 장점이나 단점이 있습니까?


JUnit assertion과 Java 'assert'키워드 사이에는 절대적으로 사실적인 차이가 있습니다. 이것은 전혀 의견 기반 질문이 아닙니다.
Thomas W

답변:


95

JUnit4에서 JUnit assert에 의해 발생 된 예외 (실제로 Error)는 java assert키워드 (AssertionError)에 의해 발생 된 오류 와 동일하므로 assertTrue차이점을 알 수없는 스택 추적과 정확히 동일 하고 다릅니다.

즉, 어설 션은 JVM에서 특수 플래그를 사용하여 실행해야하므로 JUnit 테스트가 실행될 때 누군가 해당 플래그로 시스템을 구성하는 것을 잊었 기 때문에 많은 테스트가 통과하는 것처럼 보입니다. 좋지 않습니다.

일반적으로이 때문에 JUnit을 사용하는 assertTrue것이 더 나은 방법 이라고 주장합니다 . 테스트 실행을 보장하고 일관성을 보장하고 (때로는 assertThatJava 키워드가 아닌 다른 assert를 사용 하거나) JUnit의 동작이 나중에 변경 될 것입니다 (예 : 일종의 필터 또는 기타 향후 JUnit 기능에 연결). 코드는이를 활용할 수 있습니다.

자바에서 assert 키워드의 실제 목적은 런타임 패널티없이 끌 수 있도록하는 것입니다. 단위 테스트에는 적용되지 않습니다.


26

JUnit 어설 션은 내장 assert명령문 보다 더 풍부한 API를 제공하고 더 중요한 것은 JVM 인수 assert가 필요한 -ea.


1
-ea에서 항상 활성화되어 mvn test있으므로 -ea. 풍부한 API, 좋은 캐치. 때때로 API가 애플리케이션의 일부가 아니기 때문에 테스트에서 오용된다고 생각합니다 (api에서).
Grim

19

테스트가 실패하면 더 많은 정보를 얻을 수 있습니다.

assertEquals(1, 2); 결과 java.lang.AssertionError: expected:<1> but was:<2>

vs

assert(1 == 2); 결과 java.lang.AssertionError

메시지 인수를 추가하면 더 많은 정보를 얻을 수 있습니다. assertEquals


9
시도해보십시오 assert 1==2: "1 is not 2";.
Grim 2015

@PeterRader -ea가 활성화되지 않은 경우 assert 키워드를 사용해보십시오. 또는 더 나은 방법은 항상 작동하는 JUnit 어설 션을 사용하는 것입니다.
Thomas W

1
-ea가 활성화되지 않은 경우 @ThomasW는 테스트가 아닙니다. JUnit 어설 션이 항상 작동하는 것은 아닙니다. 프레임 워크 인 JUnit을 사용하기로 결정한 경우에만 작동하며 maven 종속성의 경우 테스트 범위에만 있어야하는 maven 종속성입니다. 여기에는 두 가지 측면이 있습니다. 무엇을 선호하십니까? 1st Side : 다운로드해야하는 테스트 범위에서만 종속성으로 프레임 워크를 사용합니다. 이클립스는 src / main-folder에없는 클래스에서 사용할 수 있지만 maven은 test-에서만 junit을 가지고 있기 때문에 컴파일하지 않습니다. 스코프 또는 2nd Side : 빌트인 물건을 사용합니다.
Grim

1
@PeterRader이 질문은 JUnit 테스트 케이스에 관한 것입니다. 해당 컨텍스트에서 JUnit 또는 유사한 assertion 클래스를 사용해야합니다. 이는 항상 활성화되어 있기 때문입니다. 저는 개인적으로 과거에 활성화되지 않은 Java 'assert'키워드에 의해 잡혔으 며 신뢰할 수없는 주장이 테스트 코드에 포함되어 있다고 믿지 않습니다.
Thomas W

기능 코드의 단언의 개별 컨텍스트에서-실제로 질문의 주제는 아니지만 강력한 프로그래밍 실무에 중요-Spring과 Google Guava 모두 항상 활성화되는 단언 클래스가 있습니다. 정확성을 보장하기 위해 매개 변수 및 상태 전제 조건으로 이러한 것들을 관대하게 사용하는 것이 좋습니다. 그건 그렇고, 성능이 중요한 분야에서, 자바는 작은 영역이있을 수있다 assert정확성 확인을 위해 - 바람직 할 수있다 성능에 영향을 미칠 수 있으므로 최적의 장애인 기본적으로 있습니다. 그러나 내 경험에 따르면 대부분의 주장은 항상 켜져 있어야합니다.
Thomas W

8

테스트 케이스에서 JUnit 어설 션을 사용하고 코드에서 Java의 어설 션을 사용한다고 말하고 싶습니다. 즉, 실제 코드는 명백한 것처럼 JUnit 종속성을 갖지 않아야하며 테스트 인 경우 어설 션이 아닌 JUnit 변형을 사용해야합니다.


0

JUnit을 사용하는 경우 JUnit 어설 션을 사용해야합니다. assertTrue()기본적으로와 동일합니다 assert. 그렇지 않으면 왜 JUnit을 사용합니까?


4
테스트 실행 프레임 워크에 JUnit을 사용합니다. Assert는 JUnit이 제공하는 가치의 작은 부분입니다. 없는 JUnit Assert에는 더 많은 상용구가 필요합니다. assertJUnit이 없으면 전체 프레임 워크를 작성해야합니다.
Yishai 2010-06-03

1
도구를 사용하려면 도구를 사용하십시오. 일반적인 오래된 assert 문은 JUnit 테스트 케이스에서 약간 어리석은 것처럼 보입니다. 그들은 내 생각에 실제 코드에 속합니다.
CheesePls 2010 년

1
@CheesePls "일반적인 오래된 assert 문"은 사실 JUnit이 주장하는 것보다 더 최신입니다.
고인돌

0

반짝이고 새로운 것을 독점적으로 사용하지만 1.4SE까지 Java에 도입되지 않은 것을 사용하는 경우에는 적용되지 않을 수 있습니다. 따라서 이전 기술이있는 환경에서 작업해야하는 경우 호환성을 위해 JUnit을 사용할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.