xUnit 프레임 워크가 테스트를 병렬로 실행할 수없는 이유는 무엇입니까?


15

오늘날 머신에서 여러 코어를 사용하기 위해 테스트를 병렬로 실행할 수있는 xUnit 프레임 워크에 대해 알고 있습니까?

그들 중 어느 것도 그렇게하지 않는다면, 아마도 이유가있을 것입니다 ... 사람들이 단순히 그것들을 병렬화 할 필요성을 느끼지 않을 정도로 시험이 너무 빠르다는 것입니까?

여러 스레드에 테스트를 배포하는 것을 방해하는 더 깊은 것이 있습니까?


단위 테스트는 확실히 느립니다. 각 테스트 자체가 빠르더라도 문자 그대로 수백만 개의 테스트 사례가 있으므로 누적됩니다.
Pacerier

답변:


6

테스트를 병렬로 실행할 수있는 NUnit 2.5 번들 pNUnit.

이 릴리스에는 분산 병렬 테스트를위한 확장 NUnit 러너 인 pNUnit이 포함되어 있습니다. pNUnit 프로그램은 플라스틱 SCM 테스트에 사용하기 위해 Codice Software에서 개발되었으며 NUnit에 기여했습니다. pNUnit 사용에 대한 자세한 내용은 pNUnit 사이트를 참조하십시오.

JUnit 측에는 amino 뿐만 아니라 병렬 접합 도 있습니다 .


따라서 다른 프레임 워크의 유일한 이유는 '아직 구현되지 않은 것'입니까?
Xavier Nodet

1
@Xavier 예; 그것은 공정한 진술입니다.
Aaron McIver

10

질문의 두 번째 부분에 대답하려면 : 여러 스레드에 테스트를 배포하는 것을 방해하는 더 깊은 것이 있습니까?

단일 스레드를 실행할 때만 많은 코드가 작동합니다. 단일 스레드로 실행될 것이라는 가정하에 프로그램을 작성할 때 실수로 리소스 경합과 교착 상태를 발생시키는 것은 쉽지 않습니다. 대부분의 프로그램이 실제로 단일 스레드를 실행하기 때문에 이것은 잘 작동합니다. 병렬화는 여러 사본 또는 다른 프로그램을 동시에 실행하여 얻을 수 있습니다 (웹 스크립트는 하나의 일반적인 예입니다. 단일 페이지에 액세스하는 많은 사용자는 동시에 실행되는 해당 페이지에 대한 많은 스크립트 사본을 의미합니다).

간단한 "파일에 로그"클래스를 상상해보십시오. 인스턴스를 만들면 쓰기 위해 파일이 열리고 인스턴스를 해제하면 파일이 닫힙니다. 따라서 첫 번째 테스트는 인스턴스를 만들고 테스트 실행을 시작합니다. 두 번째 테스트는 두 번째 스레드에서 동일한 작업을 수행합니다. 두 번째 인스턴스가 파일에 대한 쓰기 권한을 얻을 수 없기 때문에 실패합니다. 그러나 한 번에 하나씩 실행하면 모든 테스트가 통과됩니다.

이 모든 것이 코딩 될 수 있으며 간단한 예제가 작동하도록 조정할 수 있습니다. 그러나 그렇게하는 것은 아마도 원래 프로그램에는 불필요 것입니다 . 단위 테스트를 실행할 수 있도록 스레드 안전 코드를 작성해야하는 것은 많은 사람들에게 부당합니다. 따라서 다중 스레드 단위 테스트는 추가 옵션으로 유지해야합니다.


+1 실제로 그 이유에 대한 답변이므로 제외 된 답변이어야합니다.
Oliver Weiler

4

테스트에서 데이터베이스를 설정하고 쿼리해야하는 경우, 병렬로 실행되는 각 테스트에 대해 별도의 데이터베이스가없는 한 병렬로 실행되는 테스트는 서로 간섭합니다.


테스트 플랫폼 (xUnit)이 신경 쓰지 않아도됩니다. 그것은 구현 세부 사항입니다.
Aaron McIver

또한 단위 테스트 프레임 워크로 작성된 모든 테스트가 단위 테스트는 아닙니다. 데이터베이스에 액세스하는 테스트는 실제로 통합 테스트와 같은 단위 테스트가 아닙니다.
c_maker

테스트가 데이터베이스에 닿았다고해서 통합 테스트라는 의미는 아닙니다. 예를 들어 사전 구성이 예상되지 않는 한 (즉, 데이터 스키마는 있지만 데이터는 존재하지 않는 한) C #에서 부분적으로 및 데이터베이스 데이터베이스에서 부분적으로 실행되는 방법은 여전히 ​​개념적으로 단위 테스트입니다. 이러한 테스트는 개별 실행에 대한 데이터를 생성 할 수 있지만 완료되면 빈 상태로 재설정해야합니다. 이것은 아마도 논란의 여지가 있지만, 그러한 테스트는 소규모 코드 단위를 테스트하는 제로 구성, 제로 배치 테스트이기 때문에 통합 테스트로 간주 될 수 없습니다.
Triynko December

2

JUnit 자체가 허용하지 않을 수도 있지만 (최신 버전에 친숙하지는 않지만) Surefire 플러그인이있는 Maven에는 테스트를 병렬로 실행할 수있는 옵션이 있습니다. 그래도 아직 시도하지 않았습니다.

우리는 수천 가지가 넘는 테스트를 받았으며 충분히 빠르게 실행되기 때문에이 옵션을 조사하도록 강요받지 않았습니다. 그러나 일부 테스트 픽스처 사이에 암시 적 종속성이 있음을 알고 있습니다 (과거에 테스트가 예기치 않게 중단되었을 때 그러한 종속성이 있음을 발견했습니다). 문제를 명시 적으로 만들면 이것이 좋다고 말할 수 있습니다. 그러나 우리는 레거시 시스템을 다루고 있으며 처리해야 할 더 중요한 문제가 있습니다. 시간은 평소와 같이 부족한 리소스입니다.


0

멀티 스레드 코딩은 사소한 것이 아닙니다. 자신이하는 일을 아는 사람들이 수행하더라도 타이밍 종속 버그가 발생할 수 있습니다. 그들은 고치기 어렵다. 멀티 트 레딩으로 발생할 수있는 수천 가지의 사례 유형 버그를 처리 했으므로 테스트 프레임 워크에 포함시키지 않는 것이 좋습니다. 첫 번째 수정은 효과가 있었지만 추가 테스트를 통해 수만 버그 중 하나가 된 것으로 나타났습니다.

멀티 프로세서 PC의 출현으로 멀티 프로세서에서 멀티 스레딩을 수행하는 기술이 향상되고 있습니다. 그러나 널리 사용 되려면 시간이 걸립니다.

일부 테스트 스위트는 테스트가 단일 스트림에서 실행될 때 명시 적으로 언급 할 필요가없는 테스트간에 종속성이 있습니다. 그러나 다중 스팀 엔진에서는 명시 적으로 명시해야합니다. (이러한 의존성이 존재하는 곳은 다른 질문입니다.)

다른 관점에서, 어떤 것은 병렬로 실행할 필요가 없습니다. 프로세스가 충분히 빠르게 실행되므로 멀티 스레딩을 구현하는 것 이외의 작업에 집중하는 것이 좋습니다.


0

MBUnit은 일부 어셈블리 레벨 속성을 지정하여 테스트를 병렬로 실행할 수 있습니다.

[assembly: DegreeOfParallelism(6)]
[assembly: Parallelizable(TestScope.All)]

그 프로젝트를 사용하여 셀레늄 테스트를 한동안 병렬로 성공적으로 수행했습니다. 불행히도 프로젝트는 더 이상 살아 있지 않습니다.

xUnit 2.0은 병렬 단위 테스트도 지원해야하지만 아직 시도하지 않았습니다.

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