12. 병렬 프로그램 테스트
- 병렬 프로그램은 순차적인 프로그램에 비해 각 부분 간의 상호작용이 복잡하며, 미리 예상하고 분석해야 할 가능한 오류 상황도 훨씬 많다.
블로킹 메서드 테스트
- 테스트 프레임워크는 대부분 병렬 처리 환경을 적절하게 대응하지 못함
- e. g. 스레드를 생성하는 기능이나 실행된 스레드가 의도하지 않은 방법으로 종료되는 일이 있는지를 모니터링하는 기능을 제공하지 않음
java.util.concurrent
패키지를 테스트하기 위해 JSR 166 전문가 그룹에서는 테스트 케이스에서 실패 상황이 발생했을 때 해당 건을 모아 뒀다가 tearDown
메서드에서 모든 오류 상황을 표시하는 기능을 구현
- 테스트가 오류 없이 정상적으로 끝났는지, 오류가 발생했을때 오류를 제대로 찾아내 수정할 수 있도록 오류 관련 정보를 출력하는게 중요함
안전성 테스트
- 효과적인 안전성 테스트
- 문제가 발생했을 때 잘못 사용되는 속성을 찾아내는 작업을 해야함
- 오류를 확인하는 코드가 테스트 대상의 병렬성을 제한해서는 안됨
- 테스트 대상 속상 값을 확인할 때 추가적인 동기화 작업을 하지 않아도 된다면 가장 좋은 상태라고 할 수 있음
자원 관리 테스트
- 메모리를 계속해서 잡고 있는 경우가 있는지 확인하려면 애플리케이션이 사용하는 메모리의 상황을 볼 수 있는 힙 조사(heap inspection)용 도구를 사용
성능 테스트
- 성능 테스트를 통해 성능과 관련된 스레드의 개수, 버퍼의 크기 등 각종 수치를 뽑아내고자 함
- 일반적으로 적절한 값을 사용하면 비슷한 결과를 얻을 수 있음
- 하드웨어의 버퍼 크기를 조절했을때의 성능 변화
- 스레드의 개수를 크게 늘려도 성능이 별로 떨어지지 않는 수치는 혼동스러운 결과
- 스레드가 많이 실행되었더라도 실제 작업을 하는 양은 그다지 많지 않고 스레드가 대기 상태에 들어갔다 나왔다하는 동기화를 맞추는데 CPU 용량을 대부분 사용한다.
응답성 측정
- 단일 작업 처리 시간을 측정할 때는 측정 값의 분산을 중요한 수치로 생각
- e. g. 100밀리초 안에 작업을 끝내는 비율이 몇 %정도인가