JUnit : 테스트 유틸리티 클래스에서 "실행 가능한 메소드 없음"을 피하는 방법


118

JUnit3.8에서 JUnit4.4로 전환했습니다. ant를 사용하여 테스트를 실행하고 모든 테스트가 성공적으로 실행되지만 테스트 유틸리티 클래스가 "No runnable methods"오류와 함께 실패합니다. 내가 사용하는 패턴은 테스트 폴더 아래에 * Test *라는 이름의 모든 클래스를 포함하는 것입니다.

주자가 @Test 속성으로 주석이 달린 메서드를 찾을 수 없다는 것을 이해합니다. 그러나 이러한 클래스는 테스트가 아니기 때문에 이러한 주석을 포함하지 않습니다. 놀랍게도 이클립스에서 이러한 테스트를 실행할 때 이러한 클래스에 대해 불평하지 않습니다.

JUnit3.8에서는 이러한 유틸리티 클래스가 TestCase를 확장하지 않았기 때문에 실행자가 실행을 시도하지 않았기 때문에 전혀 문제가되지 않았습니다.

개미 스크립트의 junit 대상에서 이러한 특정 클래스를 제외 할 수 있다는 것을 알고 있습니다. 그러나 추가하는 모든 새 유틸리티 클래스에서 빌드 파일을 변경하고 싶지 않습니다. 나는 또한 클래스의 이름을 바꿀 수 있습니다 (하지만 클래스에 좋은 이름을주는 것은 항상 나의 가장 약한 재능이었습니다 :-))

이 문제에 대한 우아한 해결책이 있습니까?


테스트가 Eclipse / NetBeans / 좋아하는 IDE에서 작동합니까?
guerda

나는 이클립스를 사용합니다. 실제로 거기에는 문제가 없습니다. 어떻게 든 이클립스는 이러한 클래스를 실행하려고하지 않습니다. 어떻게 될까요?
LiorH

귀하의 질문을 이해했는지 모르겠습니다. 질문을 다시 읽고 추가 정보를 추가하십시오.
guerda

1
@guerda : 질문은 나에게 꽤 분명해 보인다. 그의 Ant 작업은 필터가 유틸리티 클래스를 선택하기 때문에 테스트를 포함하지 않는 클래스를 찾는 것입니다. 따라서 내 대답은 여전히 ​​전적으로 관련이 있다고 생각합니다.
Jon Skeet

LiorH : 설명 주셔서 감사합니다, 내 대답은 폐기물 :) 그래서
guerda

답변:


50

테스트 클래스를 찾는 데 사용되는 패턴을 제어한다고 가정하면 . *Test대신 일치하도록 변경하는 것이 좋습니다 *Test*. 그 방법 TestHelper은 일치하지 않을 FooTest것입니다.


1
나는 그것이 도움이 될 것이라고 생각하지 않는다. 그가 JUnit 4.4로 옮겼고 그것은 중요하지 않기 때문이다.
guerda

2
내 대답의 요점을 놓친 것 같습니다. 그는 테스트로 간주 할 클래스를 결정하는 이름 필터가 있습니다. 필터를 변경하면 도우미 클래스를 쉽게 제외 할 수 있습니다.
Jon Skeet

1
귀하의 제안은 유효하지만 테스트 클래스를 확인하고 일부는 Test로 시작하고 일부는 Test로 끝납니다. 유틸리티 클래스와 실제 테스트 클래스간에 명확한 구분이 없습니다. 제안하신 컨벤션이 좋은 습관이라고 생각하십니까? (즉, 유틸리티는 Test로 시작하고 테스트는 Test로
끝남

4
* Test로 testcase 클래스를 접미사하는 것은 거의 관례입니다. 테스트 클래스의 이름을 적절하게 변경하여 리팩터링해야 할 수 있으며 해당 접미사 규칙을 사용하지 않도록 도우미의 이름을 변경해야 할 수도 있습니다.
Spoike

2
Spoike에 동의합니다. 클래스 이름으로 테스트인지 도우미인지 알 수 없으면 클래스 이름을 변경해야합니다. 관례는 "이 클래스는 Test로 끝나는 경우에만 테스트입니다." 유틸리티 클래스는 Test로 시작할 수도 있고 시작하지 않을 수도 있습니다. 상관 없습니다.
Jon Skeet

142

@Ignore로 util 클래스에 주석을 답니다. 이로 인해 JUnit이 테스트로 실행하지 않습니다.


6
사실은 안됩니다. @Ignore는 테스트를 일시적으로 비활성화하기위한 것입니다.
Alice Young

1
미안하지만 그건 나쁜 생각입니다. 테스트 패턴과 일치 할 수 있다는 이유만으로 테스트 관련 주석으로 프로덕션 코드에 주석을 달고 싶습니까? 올바른 대답은 테스트에 대한 패턴 일치를 트리거하는 경우 클래스 이름을 수정하는 것입니다. 그리고 패턴이 Test로 끝나는 클래스 만 찾는 지 확인하십시오. 즉, 일반적으로 받아 들여지 패턴의
케빈 M

네, 이것은 나쁘고 제거 할 수없는 또 다른 찬성 투표를 할 때까지 깨닫지 못했습니다. 기본 클래스를 추상화하면 JUnit이이를 무시합니다. 아래 @gmoore의 답변을 참조하십시오.
Ryan Shillington

83

내 특정 사례에는 다음과 같은 시나리오가 있습니다. 우리의 테스트

public class VenueResourceContainerTest extends BaseTixContainerTest

모두 확장

BaseTixContainerTest

JUnit이 BaseTixContainerTest를 실행하려고했습니다. 불쌍한 BaseTixContainerTest는 단지 컨테이너를 설정하고, 클라이언트를 설정하고, 피자를 주문하고, 긴장을 풀려고했습니다.

앞서 언급했듯이 클래스에 다음과 같이 주석을 달 수 있습니다.

@Ignore

그러나 이로 인해 JUnit은 해당 테스트를 건너 뛴 것으로보고했습니다 (완전히 무시되는 것과 반대).

Tests run: 4, Failures: 0, Errors: 0, Skipped: 1

그런 종류의 짜증이났습니다.

그래서 저는 BaseTixContainerTest 추상을 만들었고, 이제 JUnit은 그것을 정말로 무시합니다.

Tests run: 3, Failures: 0, Errors: 0, Skipped: 0

7
대부분보다 나은@Ignore
neworld

나는 @Ignore 접근 방식을 시도하고의 좋은, 나는이 대답을 읽고, 이마에 자신을 때렸다 잘한다는 생각 "중 물론 !"
dnuttle

38

JUnit이 테스트 기본 클래스를 인스턴스화하는 것을 방지하려면

public abstract class MyTestBaseClass { ... whatever... }

(@Ignore는 일시적으로 무시 된 테스트를 위해 예약 한 무시 된 것으로보고합니다 .)


3
JUnit 실행기는 종종 추상 클래스도 인스턴스화하려고 시도한 다음 인스턴스화 오류로 실패합니다.
Holly Cummins

기본 테스트 수업을 위해 완벽하게 작동합니다
ruX

3
이것은 추상 수정 자 때문이 아니라 이름 (Test로 끝나지 않음) 때문에 작동합니다. 클래스 이름을 MyBaseClassTest로 변경하면 @HollyCummins가 언급 한대로 인스턴스화를 시도합니다 (실패)
Hutch

제 경우에는 protected abstract class.
Mystic Lin

18
  1. 이것이 AbstractTest와 같은 기본 테스트 클래스이고 모든 테스트가 이것을 확장하면이 클래스를 추상으로 정의하십시오.
  2. Util 클래스 인 경우 클래스 이름에서 * Test를 제거하는 것이 좋습니다. MyTestUtil 또는 Utils 등입니다.

10

IDE의 코드 완성을 사용하여 @Test.

예를 들어 이어야 import org.junit.Test하고 이어야 import org.testng.annotations.Test합니다. 후자를 수행하면 "실행 가능한 메서드 없음"오류가 발생합니다.


이것은 답변 이라기보다는 코멘트 여야합니다.
Swaranga Sarma

3
이유를 모르겠습니다. 유효한 해결책입니다.
Sridhar Sarnobat

4
Intellij Idea 2017은 org.junit.jupiter.api.Test대신 가져 오기로 내 마음을 망쳤 습니다! 하지만 당신 덕분에 지금은 해결
AmiNadimi

대단히 감사합니다. "실행 가능한 메소드 없음"문제가 발생하는 동안 혼란 스러웠습니다.
Peter S.

7

Ant는 이제 skipNonTests당신이 찾고있는 것을 정확하게 수행하도록 설계된 속성을 제공 합니다. 추상화하거나 주석을 추가하기 위해 기본 클래스를 변경할 필요가 없습니다.


2
skipNonTests속성은 ant 1.9+에서만 사용할 수있는 것 같습니다 . 매우 유용 해 보이기 때문에 안타까운 일입니다. 또한 추상 테스트 슈퍼 클래스를 제외합니다.
Holly Cummins

4

이러한 클래스에 빈 테스트 메서드를 추가하는 것은 어떻습니까?

public void avoidAnnoyingErrorMessageWhenRunningTestsInAnt() {
    assertTrue(true); // do nothing;
}

8
하지만 거짓은 수에게 테스트를 증가 시킨다는 것을 우리는이 :)하지 자사의 큰 거래
Sudarshan

1

테스트 클래스에서 작성하면 import org.junit.jupiter.api.Test; 그것을 삭제하고 import org.junit.Test를 작성하십시오; 이 경우에도 저에게 효과적이었습니다.


1
놀랍게도 효과가있었습니다. Windows 명령 줄에서 수동으로 실행했습니다. 그러나, 또 다른 문제는입니다 @BeforeAll@AfterAll실행되지 않습니다.
BingLi224

겉으로는, JUnit4 함께 (일을 @BeforeClass하고 @AfterClass있지만, JUnit5은 참조 아니다 :. junit.org/junit5/docs/current/user-guide/#migrating-from-junit4
BingLi224

0

또한 가장 간단한 코드 (@Test, @Before 등 사용)를 실행할 때 유사한 문제 ( "실행할 수있는 메서드 없음 ..")에 직면했고 해결책을 찾지 못했습니다. Junit4 및 Eclipse SDK 버전 4.1.2를 사용하고있었습니다. 최신 Eclipse SDK 4.2.2를 사용하여 문제를 해결했습니다. 나는 이것이 다소 비슷한 문제로 어려움을 겪고있는 사람들에게 도움이되기를 바랍니다.

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