단위 테스트 (MSTest)를 병렬로 실행하는 방법은 무엇입니까?
테스트 스위트를 병렬로 실행하는 방법을 찾고 있습니다.
.testrunconfig
설정을 알고 있습니다. 이를 통해 CPU 수 를 다중화 할 수 있습니다 .
1000 개의 테스트를 병렬로 실행하고 싶습니다. 웹 서비스를 테스트하고 있으므로 테스트에 소요되는 시간의 90 %가 서비스가 응답하기를 기다리고 있기 때문에 이것은 의미가 있습니다.
이 문제를 해결하는 방법에 대한 아이디어가 있습니까? 테스트는 VS 용으로 작성되었지만 VS 외부에서 실행할 수 있습니다.
나중에 편집 : Visual Studio 테스트 팀은 VS 2015 업데이트 1에 이것을 추가했습니다. Mark Sowul의 답변을 참조하십시오.
이 페이지에있는 대부분의 답변은 MSTest 가 별도의 어셈블리에서 테스트 를 병렬화한다는 사실을 잊었습니다 . 단위 테스트를 병렬화하려면 여러 .dll로 분할해야합니다.
그러나! 최근 버전 - MSTEST V2 - 지금 CAN TestFramework 및 TestAdapter - - "에서 조립"병렬 처리 (! 야호는) 당신은 당신의 테스트 프로젝트에 nuget 패키지의 몇 가지를 설치할 필요가 여기에 설명 된 것처럼 https://blogs.msdn.microsoft .com / devops / 2018 / 01 / 30 / mstest-v2-in-assembly-parallel-test-execution /
그리고 이것을 테스트 프로젝트에 추가하기 만하면됩니다.
[assembly: Parallelize(Workers = 4, Scope = ExecutionScope.ClassLevel)]
편집 : [DoNotParallelize]
테스트 메서드를 사용하여 특정 테스트에 대해 병렬 실행을 비활성화 할 수도 있습니다 .
Visual Studio Team Test 블로그 의 방법 을 사용하여 최대 5 개를 얻을 수 있습니다.
MSTest는 각 테스트를 완전히 분리하지 않기 때문에 동시성 문제가있을 수 있습니다 (예를 들어, 한 번 실행되는 코드에 대해 흥미로운 점을 만들기 위해 정적이 전달됨).
(제한이 5 인 이유는 모르지만 MSTest는 5 parallelTestCount
개 이상으로 설정 하면 병렬로 실행되지 않습니다 . 아래 설명에 따라이 규칙은 Visual Studio 2013에서 분명히 변경됩니다.)
Visual Studio 2015 업데이트 1은이를 추가합니다. https://docs.microsoft.com/visualstudio/releasenotes/vs2015-update1-vs#misc
업데이트 2의 경우 테스트 탐색기 창의 상단에있는 도구 모음에 UI 토글 버튼이 있습니다 ( '그룹화'및 '검색'상자 사이).
업데이트 1의 경우 .runsettings에서 다음을 설정하십시오.
<?xml version="1.0" encoding="utf-8"?>
<RunSettings>
<RunConfiguration>
<MaxCpuCount>0</MaxCpuCount>
</RunConfiguration>
</RunSettings>
MaxCpuCount의 값은 다음과 같은 의미를 갖습니다.
• 'n'(여기서 1 <= n <= 코어 수) : 최대 'n'개의 프로세스가 시작됩니다.
• 다른 값의 'n': 시작된 프로세스 수는 컴퓨터에서 사용 가능한 코어 수만큼입니다.
내가 찾은 것은 C : \ Program Files (x86) \ Microsoft Visual Studio 11.0 \ Common7 \ IDE \ CommonExtensions \ Microsoft \ TestWindow \ vstest.console.exe가 .testsettings
다음과 같은 파일로 병렬 테스트를 실행한다는 것입니다 .
<?xml version="1.0" encoding="UTF-8"?>
<TestSettings name="TestSettings1" id="21859d0f-7bdc-4165-b9ad-05fc803c9ee9" xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010">
<Description>These are default test settings for a local test run.</Description>
<Deployment enabled="false" />
<Execution parallelTestCount="8">
<TestTypeSpecific>
<UnitTestRunConfig testTypeId="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b">
<AssemblyResolution>
<TestDirectory useLoadContext="true" />
</AssemblyResolution>
</UnitTestRunConfig>
</TestTypeSpecific>
<AgentRule name="Execution Agents">
</AgentRule>
</Execution>
</TestSettings>
참조는 http://msdn.microsoft.com/en-us/library/vstudio/jj155796.aspx 에서 찾을 수 있습니다 .
위의 답변은 분명히 나를 위해 일을 명확히하는 데 도움이되었지만 John Koerner의 블로그에서 가져온이 시점 : https://johnkoerner.com/vs2015/parallel-test-execution-in-visual-studio-2015-update-1-might-not -당신이 기대하는대로 / 우리가 놓친 부분이었습니다.
"Parallel test execution leverages the available cores on the machine, and is realized by launching the test execution engine on each available core as a distinct process, and handing it a container (assembly, DLL, or relevant artifact containing the tests to execute), worth of tests to execute."
--> "The separate container bit is the piece I was missing. In order to get my tests to run in parallel, I needed to split up my tests into separate test assemblies. After doing that, I saw that the tests in different assemblies were running in parallel."
So yeah, we got the tests running in parallel in VSTS by using their handy 'run in parallel' flag, but it wasn't enough, we had to split our tests up into separate test projects. Logically grouped of course, not a project-per-test which would be ridiculous
- Ensure the first column in your DataTable is a unique Id.
- Create a AsyncExecutionTask delegate that accepts a DataRow and returns nothing.
- Create a static class (ParallelTesting) with a AsyncExecutionContext method that accepts a DataRow and an AsyncExecutionTask delegate.
- In the static class add a static BatchStarted property.
- In the static class add a static AsyncExecutionTests Dictionary property.
In the AsyncExecutionContext method add the following:
public static void AsyncExecutionContext(DataRow currentRow, AsyncExecutionTask test) { if(!BatchStarted) { foreach(DataRow row in currentRow.Table) { Task testTask = new Task(()=> { test.Invoke(row); }); AsyncExecutionTests.Add(row[0].ToString(), testTask); testTask.Start(); } BatchStarted = true; } Task currentTestTask = AsyncExecutionTests[row[0].ToString()]; currentTestTask.Wait(); if(currentTestTask.Exception != null) throw currentTestTask.Exception; }
Now use the class like so:
[TestMethod] public void TestMethod1() { ParallelTesting.AsyncExecutionContext(TestContext.DataRow, (row)=> { //Test Logic goes here. } ); }
Note: You will have to do some tinkering with exceptions to get them to bubble correctly (you may have an aggregate exception here, you'll need the first exception from it). The amount of time displayed that each test takes to execute will no longer be accurate. You will also want to cleanup the ParallelTesting class after the last row is completed.
How it works: The test logic is wrapped in a lambda and passed to a static class that will execute the logic once for each row of test data when it is first called (first row executed). Successive calls to the static class simply wait for the prestarted test Task to finish.
In this way each call the test framework made to the TestMethod simply collects the test results of the corresponding test that was already run.
Possible Improvements:
- Make AsyncExecutionContext take a maxSynchronousTasks parameter.
- Look into how the framework moves complete stacktraces across unmanaged code to see if the Task.Exception can be passed to the visual studio test framework without rethrowing and destroying the stacktrace.
ReferenceURL : https://stackoverflow.com/questions/3917060/how-to-run-unit-tests-mstest-in-parallel
'development' 카테고리의 다른 글
Python-TypeError : 'int'개체는 반복 할 수 없습니다. (0) | 2021.01.07 |
---|---|
Docker 컨테이너에서 실행되는 Tomcat 8에 Java webapp 배포 (0) | 2021.01.07 |
XML에서 컨테이너 요소없이 목록으로 역 직렬화 (0) | 2021.01.07 |
raw.github.com의 js 포함 (0) | 2021.01.07 |
XML 스키마 : 루트 요소 (0) | 2021.01.07 |