2016-06-10 2 views
1

У нас есть проект с открытым исходным кодом для запуска удаленных тестов XUnit.Net. Особенность заключается в том, что тело теста предназначено для запуска в удаленном процессе, и результаты сериализуются обратно в визуальную студию. Проект можно найти здесь.Как отключить параллельное выполнение теста для всех тестов, помеченных пользовательскими фактами в XUnit.Net

https://github.com/Weingartner/XUnitRemote

Например, тест может быть как

[SampleProcessFact] 
    public void OutOfProcess() 
    { 
     _Output.WriteLine("Process name: " + Process.GetCurrentProcess().ProcessName); 
     Assert.Equal(1,1); 
    } 

SampleProcessFact является пользовательский атрибут объявлен так.

[AttributeUsage(AttributeTargets.Method)] 
[XunitTestCaseDiscoverer("XUnitRemote.Test.SampleProcessFactDiscoverer", "XUnitRemote.Test")] 
public class SampleProcessFactAttribute : FactAttribute { } 


[AttributeUsage(AttributeTargets.Method)] 
[XunitTestCaseDiscoverer("XUnitRemote.Test.ScheduledSampleProcessFactDiscoverer", "XUnitRemote.Test")] 
public class ScheduledSampleProcessFactAttribute : FactAttribute { } 

[AttributeUsage(AttributeTargets.Method)] 
[XunitTestCaseDiscoverer("XUnitRemote.Test.SampleProcessTheoryDiscoverer", "XUnitRemote.Test")] 
public class SampleProcessTheoryAttribute : TheoryAttribute { } 

См. https://github.com/Weingartner/XUnitRemote/blob/master/XUnitRemote.Test/XUnit.cs#L26 для исходного кода.

Однако нам нужна опция, чтобы, если я помечаю свой тестовый пример как SampleProcessFact, тогда тестовый бегун будет запускать тесты последовательно.

Я знаю, что я могу пометить все мои тестовые случаи с TestCollection (строка идентификатора) и он должен предотвратить последовательный ход, но это должно быть воплощен в SampleProcessFact тега, если это возможно. Это должно работать во всех тестовых сценариях во всех сборках.

Мой вопрос касается только отрыва тестов от визуальной студии. Удаленная часть работает нормально, но визуальная студия вызывает наш удаленный тестовый корпус параллельно для всех тестов.

Любые идеи?

ответ

0

Мы проверили наш проект, который решил проблему.

https://github.com/Weingartner/XUnitRemote/commit/565e1dfb55f65ff0612afa40bc5d076c69bb739c

Общее решение было перехватить ITestMethod экземпляр в XUnitRemoteTestCaseDiscoverer :: Discover и переписать UniqueID из его коллекции тест.

public IEnumerable<IXunitTestCase> Discover(ITestFrameworkDiscoveryOptions discoveryOptions, ITestMethod testMethod, IAttributeInfo factAttribute) 
    { 
     if(CollectionId.HasValue) 
      testMethod = WrapTestMethod(testMethod, CollectionId.Value); 

     if (!Process.GetCurrentProcess().ProcessName.Equals(Path.GetFileNameWithoutExtension(_ExePath), StringComparison.OrdinalIgnoreCase)) 
     { 
      yield return new XUnitRemoteTestCase(_DiagnosticMessageSink, discoveryOptions.MethodDisplayOrDefault(), testMethod, _Id, _ExePath); 
     } 
     else 
     { 
      foreach (var testCase in _DefaultTestCaseDiscoverer.Discover(discoveryOptions, testMethod, factAttribute)) 
      { 
       yield return _TestCaseConverter(testCase); 
      } 
     } 
    } 

и

private ITestMethod WrapTestMethod(ITestMethod testMethod, Guid uniqueId) 
    { 
     var testClass = testMethod.TestClass; 
     var testCollection = testClass.TestCollection; 
     testCollection = new TestCollection 
      (testCollection.TestAssembly, testCollection.CollectionDefinition, testCollection.DisplayName) 
     { 
      UniqueID = uniqueId 
     }; 
     testClass = new TestClass(testCollection, testClass.Class); 
     testMethod = new TestMethod(testClass, testMethod.Method); 
     return testMethod; 
    }