首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运行长期运行的NUnit/xUnit测试,使它们不会阻塞其他测试。

运行长期运行的NUnit/xUnit测试,使它们不会阻塞其他测试。
EN

Stack Overflow用户
提问于 2020-08-09 21:54:23
回答 2查看 672关注 0票数 2

我正在运行一组集成测试,虽然大多数测试都是在合理的时间内完成的,但是有两个测试在等待特定的条件(准确地说是金融市场条件),它们可以持续2-3个小时。因此,理想情况下,我想实现两件事:

  1. 在其他测试完成后启动这两个测试
  2. 并行运行

在NUnit/XUnit (或其他测试运行程序)中有实现这一目标的方法吗?

EN

回答 2

Stack Overflow用户

发布于 2020-08-17 06:46:51

  1. 并行测试运行取决于测试运行程序的参数,如果您使用的是xUnit控制台测试运行程序,则有一个-parallel参数或MSBuild选项,请参见:https://xunit.net/docs/running-tests-in-parallel。但是无论如何,您必须将长时间运行的测试拆分到不同的测试类上。

  1. 很难保证测试运行的顺序,您可以使用TestCollection (但是根据quide集合按顺序运行)。您可以将长时间运行的测试重命名为将它们放在列表的末尾,即TestClass2将在TestClass1之后执行。您还可以使用类别属性参数来分离测试,并通过dotnet test -filter= tests =LongTest(一个用于长测试,另一个用于其他测试)中的两个命令来运行它们,请参见https://learn.microsoft.com/ru-ru/dotnet/core/testing/selective-unit-tests?pivots=mstest
票数 3
EN

Stack Overflow用户

发布于 2020-08-17 15:51:11

在其他测试完成后启动这两个测试

您可以将这两个测试保存在一个独立的nunit测试项目中,从而允许您单独运行所有其他测试。

对于并行运行测试,这个博客有一篇很好的文章:

https://blog.sanderaernouts.com/running-unit-tests-in-parallel-with-nunit

使用可参数化属性标记测试夹具,并将并行作用域设置为ParallelScope.All.

IDisposable.

  • 创建一个名为TestScope的私有类并实现TestScope

respectively.

  • 将所有启动和清理逻辑放入TestScope构造函数和.Dispose()方法中。

  • 将测试代码封装在使用(var作用域=新TestScope) {.}块

代码语言:javascript
复制
[TestFixture]
[Parallelizable(ParallelScope.All)]
public class MyClassTests {

    [Test]
    public void MyParallelTest() {
        using(var scope = new TestScope()) {
            scope.Sut.DoSomething();
            scope.Repository.Received(1).Save();
        }
    }

    private sealed class TestScope : IDisposable {
        public IRepository Repository{get;}
        public MyClass Sut {get;}
        public TestScope() {
            Repository = Substitute.For<IRepository>();
            Sut = new MyClass(Repository);
        }

        public void Dispose() {
            //clean-up code goes here
            Repository?.Dispose()
        }
    }
}

您应该采取预防措施,以确保在并行运行时,您的测试不会相互干扰。

正如该条所述:

如何安全地并行运行测试

为了允许测试并行运行而不会相互干扰,我已经应用了以下模式一段时间:

  • 创建了一个嵌套的私有TestScope类,该类实现了SetUp方法的初始化或启动代码,将进入TestScope类的构造函数。

代码语言:javascript
复制
[TestFixture]
[Parallelizable(ParallelScope.All)]
public class MyClassTests {

    [Test]
    public void MyParallelTest() {
        using(var scope = new TestScope()) {
            scope.Sut.DoSomething();
            scope.Repository.Received(1).Save();
        }
    }

    private sealed class TestScope : IDisposable {
        public IRepository Repository{get;}
        public MyClass Sut {get;}
        public TestScope() {
            Repository = Substitute.For<IRepository>();
            Sut = new MyClass(Repository);
        }

        public void Dispose() {
            //clean-up code goes here
            Repository?.Dispose()
        }
    }
}

这篇文章提供了更有价值的建议。我建议读一读,并感谢作者。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63331697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档