문제

이 게시물은 "멀티 스레드 코드 단위 테스트의 일반적인 패턴은 무엇입니까?"로 시작했지만 몇 가지를 발견했습니다. 다른 토론 SO에서는 일반적으로 "It is Hard(TM)" 및 "It 종속(TM)"에 동의했습니다.그래서 질문의 범위를 줄이는 것이 더 유용할 것이라고 생각했습니다.

배경 :우리는 작업을 시작하고 중지할 때 콜백을 등록하고 예약 빈도를 구성하는 방법을 제공하는 간단한 스케줄러를 구현하고 있습니다.현재 우리는 java.util.Timer에 대한 경량 래퍼를 만들고 있습니다.

상들:

  • 공개 인터페이스에만 의존하여 이 스케줄러를 테스트하는 방법을 찾지 못했습니다(예: addJob(jobSchedule, jobArgs,jobListener) , removeJob(jobId)).

  • 지정된 일정에 따라 작업이 호출되었다는 사실의 시간을 어떻게 측정합니까?

도움이 되었습니까?

해결책

당신은 a를 사용할 수 있습니다 레코더 객체 스케줄러의 각 단위 테스트에서 순서, 타이밍 및 기타 유용한 내용을 기록합니다. 테스트는 간단합니다.

  1. a 레코더 객체
  2. 일정을 구성하십시오
  3. 단위 테스트를 실행하십시오
  4. 레코더 객체가 일정과 "호환"인지 확인하십시오.

다른 팁

기억해야 할 한 가지는 타이머가 작동 할 필요가 없다는 것입니다. 클래스를 연장하거나 사용하여 Timer의 모의 버전을 작성할 수 있습니다. EasyMock)) 그것은 단순히 당신이 그것을 올바르게 호출하고 있는지 확인하고, 아마도 스레드가 필요하지 않을 정도로 충분히 교체 할 수도 있습니다. 이 경우 작업 리스너가 스케줄러를 추적하기에 충분한 콜백이있는 경우 필요한 것보다 더 많은 작업 일 수 있습니다.

기억해야 할 또 다른 중요한 것은 스케줄러를 테스트 할 때 스케줄러 작동 방식을 추적하는 사용자 지정 작업을 사용한다는 것입니다. 예약 된 작업을 테스트 할 때는 스케줄러가 아닌 콜백을 직접 호출하십시오. 시스템에 따라 둘 다 함께 점검하는 더 높은 수준의 통합 테스트가있을 수 있습니다.

그러한 스케줄러가 전시 할 수있는 많은 고장 모드가 있으며 각각 자체 테스트 케이스가 필요할 가능성이 높습니다. 이러한 테스트 사례는 매우 다를 수 있으므로 "의존합니다."

일반적으로 Java의 동시 소프트웨어를 테스트하려면 Javaone 2007 에서이 프레젠테이션을 권장합니다. 동시 소프트웨어 테스트.

스케줄러가 일정에 따라 정확하게 작업을 실행해야한다는 테스트를 위해 시간 자체의 추상화를 만들었습니다. 시간이나 시계 인터페이스가있는 프로젝트 중 하나에서 비슷한 일을했습니다. 기본 구현은 밀리 초 타임이지만 테스트 중에는 틱 타임으로 전환합니다. 이 구현을 통해 시간이 진행될 때와 얼마만큼이나 단위 테스트를 제어 할 수 있습니다.

이런 식으로, 당신은 10 개의 진드기마다 한 번씩 일정을 잡을 예정인 테스트를 작성할 수 있습니다. 그런 다음 테스트는 진드기 카운터를 발전시키고 작업이 올바른 진드기에서 실행되는지 확인합니다.

동시 코드를 테스트하는 몇 가지 방법.

  • 로드된 상태에서 동일한 코드를 여러 번 실행하면 일부 버그는 가끔씩만 나타나지만 반복적으로 수행하면 일관되게 나타날 수 있습니다.
  • BlockingQueue와 같은 컬렉션에 다양한 스레드/작업의 결과를 저장합니다.이를 통해 현재 스레드의 결과를 확인하고 적시에 완료할 수 있습니다(추악한 임의의 수면 문 없이).

동시성 테스트가 어려운 경우 개체/구성 요소를 리팩토링하여 테스트하기 쉽게 만드는 것을 고려하십시오.

스케줄러가 Executor 또는 ExecutorService 작업을 실행하려면 종속성 주입을 사용하여의 유형에 대한 직접 의존성을 제거 할 수 있습니다. Executor, 그리고 간단한 단일 스레드를 사용하십시오 Executor 스케줄러의 많은 기능을 테스트합니다 없이 진정으로 다중 스레드 코드의 합병증. 이 테스트가 디버깅되면 더 열심히 움직일 수 있지만 이제는 스레드 안전성 테스트 작업의 크기가 크게 줄어 듭니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top