【问题标题】:How to disable test parallel execution for all tests marked with custom Facts in XUnit.Net如何在 XUnit.Net 中为所有标有自定义事实的测试禁用测试并行执行
【发布时间】:2016-06-10 08:41:34
【问题描述】:

我们有一个用于运行远程 XUnit.Net 测试的开源项目。其特点是测试主体设计为在远程进程上运行,并将结果序列化回 Visual Studio。该项目可以在这里找到。

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(string id) 标记我的所有测试用例,它应该可以防止顺序运行,但是这应该封装在 SampleProcessFact 标记中,如果可能的。这应该适用于所有程序集中的所有测试用例。

我的问题仅与从 Visual Studio 启动测试有关。远程部分工作正常,但 Visual Studio 正在为所有测试并行调用我们的远程测试用例引擎。

有什么想法吗?

【问题讨论】:

    标签: c# .net multithreading xunit


    【解决方案1】:

    我们检查了解决问题的项目。

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

    一般的解决方案是在 XUnitRemoteTestCaseDiscoverer::Discover 中拦截 ITestMethod 实例并重写其测试集合的 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;
        }
    

    【讨论】:

      猜你喜欢
      • 2021-10-21
      • 1970-01-01
      • 2020-05-23
      • 2015-03-20
      • 1970-01-01
      • 2017-08-13
      • 1970-01-01
      • 2021-03-06
      • 1970-01-01
      相关资源
      最近更新 更多