2013-04-15 2 views
0

Java 프로그램에서 jUnit 테스트 케이스를 실행하고 시간 초과 후 실행을 중지하려고합니다. 테스트를 실행하기 위해 JUnitCore의 run (Request) 메소드를 사용한다.특정 조건에서 Thread.suspend()를 사용해도 괜찮습니까?

테스트 클래스에는 많은 시간이 소요되거나 종료되지 않는 메소드가 들어 있습니다. 따라서 나는 그 실행을 멈출 수 있기를 원한다.

그러나, jUnit의 pleaseStop 플래그는 완료된 테스트 케이스 후에 만 ​​취해지며, 메소드는 인터럽트 될 수 없으며 컨텐츠 (예 : 닫혀있을 수있는 사용 된 IO 리소스)를 알 수 없다. 또한 프로세스 사용을 피하고 싶습니다.

단일 테스트 케이스의 실행을 중지하는 다른 방법이 있습니까?

스레드간에 리소스를 공유하지 않는 조건에서 Thread.suspend()을 사용해도 괜찮습니까?

는 당신은 개별 테스트 또는 클래스의 모든 테스트에 시간 제한 규칙에 시간 제한 매개 변수를 사용할 수 있습니다

+0

테스트의 경우 경쟁 조건으로 인해 테스트가 실패하는 것이 필수적이지 않은 한 스레드를 일시 중단하는 것이 좋습니다. – Gray

+0

테스트 코드를 향상시킬 수 있습니까? "정지"하지 않고 자원을 사용할 수 없거나 블로킹 (즉, 코드에 타임 아웃을 추가) 할 때 자체적으로 작동 할 수 있도록 변경할 수 있다면 더 좋을 것입니다. 프로덕션에서 중단 된 프로세스는 어떻게됩니까? 또한 무한 루프에서 처리중인 모든 스레드에 대해 "cancel"메소드를 추가하는 것에 대해 생각해보십시오. – Brad

+0

아니요, 프로그램의 목적은 돌연변이 테스트를 실행하는 것입니다. 테스트 케이스는 수정할 수 없거나 알 수 없습니다. – nrainer

답변

2

스레드간에 리소스를 공유하지 않는 조건에서 Thread.suspend()를 사용해도 괜찮습니까?

나는 테스트 것이되지 않는 Thread.suspend() 방법을 사용하는 것이 괜찮을해야한다고 말할 것입니다. 나는 왜 그것이 비난되는 이유를 되풀이하는 것이 중요하다고 생각한다. 스레드가 잠금을 유지하는 동안 스레드를 일시 중단하여 코드 작동 방식을 크게 변경하고 교착 상태가 발생할 수도 있습니다.

가능하면 다른 메커니즘을 사용하여 동일한 동작을 수행하는 것이 좋습니다.

은 JavaDoc을 인용합니다 :

추천되고 있지 않습니다. 이 메소드는 본질적으로 교착 상태가 발생하기 쉽기 때문에 더 이상 사용되지 않습니다. 대상 스레드가 일시 중단 될 때 중요한 시스템 자원을 보호하는 모니터 잠금을 보유하고 있으면 대상 스레드가 재개 될 때까지 스레드가이 자원에 액세스 할 수 없습니다. 타겟 thread를 재개하는 thread가, resume를 호출하기 전에이 모니터를 잠그려고하면, 데드락이 발생합니다. 이러한 교착 상태는 일반적으로 "고정 된"프로세스로 나타납니다. 자세한 내용은 Thread.stop, Thread.suspend 및 Thread.resume가 사용되지 않는 이유는 무엇입니까?를 참조하십시오.

+0

"테스트에서는 괜찮습니까?" 프로그램은 제대로 작동하고 신뢰할 수 있어야합니다. – nrainer

+0

내 가정은 맞습니까? 스레드간에 공유 객체가 없기 때문에 교착 상태가 발생하지 않습니까? – nrainer

+0

나는 라이브 코드에서 Junit을 사용하는 것과 차별화하려고 노력했다. @nrainer의 한계를 이해한다면 테스트를 통해 이러한 메소드를 사용할 수 있습니다. – Gray

관련 문제