답변:
테스트를 병렬로 실행할 수있는 NUnit 2.5 번들 pNUnit.
이 릴리스에는 분산 병렬 테스트를위한 확장 NUnit 러너 인 pNUnit이 포함되어 있습니다. pNUnit 프로그램은 플라스틱 SCM 테스트에 사용하기 위해 Codice Software에서 개발되었으며 NUnit에 기여했습니다. pNUnit 사용에 대한 자세한 내용은 pNUnit 사이트를 참조하십시오.
질문의 두 번째 부분에 대답하려면 : 여러 스레드에 테스트를 배포하는 것을 방해하는 더 깊은 것이 있습니까?
단일 스레드를 실행할 때만 많은 코드가 작동합니다. 단일 스레드로 실행될 것이라는 가정하에 프로그램을 작성할 때 실수로 리소스 경합과 교착 상태를 발생시키는 것은 쉽지 않습니다. 대부분의 프로그램이 실제로 단일 스레드를 실행하기 때문에 이것은 잘 작동합니다. 병렬화는 여러 사본 또는 다른 프로그램을 동시에 실행하여 얻을 수 있습니다 (웹 스크립트는 하나의 일반적인 예입니다. 단일 페이지에 액세스하는 많은 사용자는 동시에 실행되는 해당 페이지에 대한 많은 스크립트 사본을 의미합니다).
간단한 "파일에 로그"클래스를 상상해보십시오. 인스턴스를 만들면 쓰기 위해 파일이 열리고 인스턴스를 해제하면 파일이 닫힙니다. 따라서 첫 번째 테스트는 인스턴스를 만들고 테스트 실행을 시작합니다. 두 번째 테스트는 두 번째 스레드에서 동일한 작업을 수행합니다. 두 번째 인스턴스가 파일에 대한 쓰기 권한을 얻을 수 없기 때문에 실패합니다. 그러나 한 번에 하나씩 실행하면 모든 테스트가 통과됩니다.
이 모든 것이 코딩 될 수 있으며 간단한 예제가 작동하도록 조정할 수 있습니다. 그러나 그렇게하는 것은 아마도 원래 프로그램에는 불필요 할 것입니다 . 단위 테스트를 실행할 수 있도록 스레드 안전 코드를 작성해야하는 것은 많은 사람들에게 부당합니다. 따라서 다중 스레드 단위 테스트는 추가 옵션으로 유지해야합니다.
테스트에서 데이터베이스를 설정하고 쿼리해야하는 경우, 병렬로 실행되는 각 테스트에 대해 별도의 데이터베이스가없는 한 병렬로 실행되는 테스트는 서로 간섭합니다.
JUnit 자체가 허용하지 않을 수도 있지만 (최신 버전에 친숙하지는 않지만) Surefire 플러그인이있는 Maven에는 테스트를 병렬로 실행할 수있는 옵션이 있습니다. 그래도 아직 시도하지 않았습니다.
우리는 수천 가지가 넘는 테스트를 받았으며 충분히 빠르게 실행되기 때문에이 옵션을 조사하도록 강요받지 않았습니다. 그러나 일부 테스트 픽스처 사이에 암시 적 종속성이 있음을 알고 있습니다 (과거에 테스트가 예기치 않게 중단되었을 때 그러한 종속성이 있음을 발견했습니다). 문제를 명시 적으로 만들면 이것이 좋다고 말할 수 있습니다. 그러나 우리는 레거시 시스템을 다루고 있으며 처리해야 할 더 중요한 문제가 있습니다. 시간은 평소와 같이 부족한 리소스입니다.
멀티 스레드 코딩은 사소한 것이 아닙니다. 자신이하는 일을 아는 사람들이 수행하더라도 타이밍 종속 버그가 발생할 수 있습니다. 그들은 고치기 어렵다. 멀티 트 레딩으로 발생할 수있는 수천 가지의 사례 유형 버그를 처리 했으므로 테스트 프레임 워크에 포함시키지 않는 것이 좋습니다. 첫 번째 수정은 효과가 있었지만 추가 테스트를 통해 수만 버그 중 하나가 된 것으로 나타났습니다.
멀티 프로세서 PC의 출현으로 멀티 프로세서에서 멀티 스레딩을 수행하는 기술이 향상되고 있습니다. 그러나 널리 사용 되려면 시간이 걸립니다.
일부 테스트 스위트는 테스트가 단일 스트림에서 실행될 때 명시 적으로 언급 할 필요가없는 테스트간에 종속성이 있습니다. 그러나 다중 스팀 엔진에서는 명시 적으로 명시해야합니다. (이러한 의존성이 존재하는 곳은 다른 질문입니다.)
다른 관점에서, 어떤 것은 병렬로 실행할 필요가 없습니다. 프로세스가 충분히 빠르게 실행되므로 멀티 스레딩을 구현하는 것 이외의 작업에 집중하는 것이 좋습니다.