如何从外部 运行 OneTimeSetUp 和 OneTimeTearDown class

How to run OneTimeSetUp and OneTimeTearDown from external class

你好,我有几个测试 classes,我在这些测试上使用与 OneTimeSetUpOneTimeTearDown 相同的资源,即 IEmbeddable.

假设我有 N 测试classes,我想在其中重用 OneTimeSetUpOneTimeSetDown 和资源(接口 IEmbeddedable) 。我如何创建一个静态的 class EmbeddableController 可以被所有测试 class 重复使用?

基本上我想:

-Start static Resource of type `IEmbeddedable` once
-Run TestClass 1 on resource ( set it up +tear it down)
-Run TestClass 2 on resource (set it up + tear it down)
......
-Run TestClass N on resource (set it up +tear it down)

可嵌入

interface IEmbeddedable:IDisposable {
        int ExposedPort { get; }
    }

Test_ClassX

class Test_ClassX {
            private IEmbeddedable server;
            [OneTimeSetUp]
            public  void Launch() {
                server = RedisServer.Launch();
            }
            [OneTimeTearDown]
            public void Stop() {
                this.server.Dispose();
            }

            [TestCase()]
            public async Task CanRunEmbeddedServer() {

                using (server) {
                    var multi = new Multiplexer();
                    using (var link = multi.OpenLink(Address.Create(Port:server.ExposedPort))) {
                        string rez=await link.FlushAllAsync();
                        Assert.AreEqual(rez, "OK");
                    }


                }
            }
}

原型

 static class EmbeddedController {
        private static  IEmbeddedable server;
        [OneTimeSetUp]
        public static void Run() {
            server = RedisServer.Launch();
        }
        public static void Stop() {
            server.Dispose();
        }
    }

我如何在所有测试class中注入最后一个class?它可以是静态的也可以不是,无论哪种方式它都只是一个实例。

OneTimeSetUp 可以 运行 不同级别。在 TestFixture 上,它 运行s 一次用于夹具。在 SetUpFixture 上,它 运行s 一次用于命名空间。这为您提供了多种选择...

  1. 让您的所有灯具都继承自 EmbeddedController。但是,OneTimeSetUp 将对每个灯具进行一次 运行。虽然可以进行测试并且只初始化服务器一次,但您无法知道 last 测试何时有 运行 以便您可以处理它。我的结论是这对你的情况不起作用,尽管它适用于任何没有资源因此不需要处理的东西。

  2. 将所有需要 EmbeddedController 的灯具放入同一个命名空间,没有任何其他 类。将 EmbeddedController 放入同一个命名空间并使其成为 SetUpFixtureOneTimeSetUp 将 运行 一次,在任何灯具之前, OneTimeTearDown 将 运行 一次,在所有灯具完成后。为了让灯具访问服务器,您应该使 Server 成为 EmbeddedController 的静态 属性。