2017-09-21 5 views
0

현재 일련의 테스트를 실행하고 있습니다. 최대한 스위트를 병렬화하고 싶습니다. 내가 가진 한 가지 큰 문제는 일부 테스트의 경우 특정 글로벌 응용 프로그램 상태를 한 방향으로 설정해야하고 일부는 다른 방향으로 설정해야한다는 것입니다. NUnit 테스트 러너 그룹을 테스트에 필요한 전역 상태를 기반으로 테스트를 수행 한 다음 각 그룹 내에서 서로 병렬로 테스트를 실행하고 그룹간에 전역 상태를 수정할 수있는 방법이 있습니까?NUnit - 키별로 테스트를 그룹화하고 병렬로 각 그룹에서 테스트를 실행할 수 있지만 시리즈별로 각 그룹을 실행할 수 있습니까?

예를 들어 Foo 테스트에 필요한 값을 지정하는 데 사용할 수있는 Foo 및 사용자 지정 속성 [RequiresFoo(X)]이 있다고 가정 해 봅니다. 런타임시 NUnit은 모든 테스트를 인수로 RequiresFoo으로 그룹화하고 표시되지 않은 테스트는 기본값 인 Foo 값으로 계산합니다. N는 해당 그룹의 Foo 값입니다

그런 다음 각 그룹에 대해, 나는

  1. 설정 Foo = N로합니다.
  2. 해당 그룹의 모든 테스트를 병렬로 실행하십시오.

이상적인 세계에서 저는이 글로벌 상태에 대한 모의 시스템을 갖게 될 것입니다. 그러나 지금 당장은 필요하지 않은 많은 시간이 걸릴 것입니다. NUnit을 사용하여이 작업을 수행 할 수 있습니까?

변수를 설정하는 것뿐만 아니라 그룹간에 어떤 방법을 실행할 수 있어야합니다. 실제로 다루는 전역 컨텍스트는 마이크로 서비스 시작 또는 중지, 구성 파일 업데이트 등을 포함 할 수 있습니다. 이러한 요구 사항을 사용자 지정 특성에 전달할 문자열로 serialize 할 수 있지만 런타임에는 임의적으로 실행할 수 있어야합니다. 요구 사항을 구문 분석하고 환경을 재구성하는 코드.


여기에 의사 코드 예제가 나와 있습니다. 기본 테스트로

이 같은 일련의 실행 :

foreach (var t in allTests) 
{ 
    Run(t); 
} 

NUnits 기본 병렬 동작은 다음과 같이이다 : 당신으로

var grouped = allTests 
    .GroupBy(t => GetRequirementsFromCustomAttributes(t)); 

foreach (var g in grouped) 
{ 
    SetGlobalState(g.Key); 
    Parallel.ForEach(g, t => Run(t)); 
} 

답변

1

:

Parallel.ForEach(allTests, t => Run(t)); 

나는 이런 식으로 뭔가를 원하는 문제를 진술하면 NUnit에서 아직 가능하지 않습니다. 계획되었지만 아직 구현되지 않은 기능이있어 이 아닌이 함께 실행될 수있는 임의의 그룹화 테스트를 허용 할 수 있습니다.

해결 방법은 각 "그룹"을 테스트하는 것입니다. NUnit은 테스트에서 병렬화만을 지정할 수 있기 때문입니다. 테스트에서는 테스트 케이스 또는 테스트 그룹 (즉, 조명기 또는 네임 스페이스 슈트)을 의미합니다.

[Parallelizable]을 계층 구조의 아무 곳이나 테스트하면 동일한 수준의 다른 테스트와 병렬로 테스트가 실행됩니다. [NonParallelizable]을 입력하면 동일한 테스트가 분리되어 실행됩니다.

Foo 값을 요구하는 5 개의 조명기가 있다고 가정 해 보겠습니다.이러한 비품을 병렬 처리 할 수 ​​없게 만들 것입니다. 그런 식으로 어느 누구도 동시에 달릴 수 없으며 다른 사람들을 간섭 할 수도 없습니다.

다른 조명기와 병렬로 조명기를 실행하려면 Tests.FooRequred과 같은 네임 스페이스에 모두 넣기 만하면됩니다. 해당 네임 스페이스에 SetupFixture을 만듭니다. 실제 설정 작업이없는 더미 일 수 있습니다. 그것에 [Parallelizable] 속성을 넣으십시오.

모든 foo 테스트 그룹은 다른 테스트와 병렬로 실행되지만 개별 조명기는 서로 병렬로 실행되지 않습니다.

+0

감사합니다. Charlie. 네임 스페이스 비품에 대해서는 몰랐습니다. 그건 그냥 속임수를 할 수 있습니다. – JamesFaix

+0

작은 기술 수정 : 우리는 네임 스페이스 제품군을 보유하고 있습니다. 그러나 네임 스페이스에 SetUpFixture를 만들면 더 높은 수준의 OneTime 설정 및 해체를 허용 할뿐만 아니라 네임 스페이스 제품군의 작업을 대신 수행합니다. 이 경우, 속성을 표시 할 수있는 뭔가를 제공하기 위해 SetupFIxture를 제안합니다. 특성은 네임 스페이스에 적용되지 않습니다. – Charlie