【问题标题】:Is it possible to tell a Testclass that it shall be ran last? [duplicate]是否可以告诉 Testclass 它应该最后运行? [复制]
【发布时间】:2015-02-24 19:03:42
【问题描述】:

我在一个单元测试项目(Visual Studio 单元测试项目)中编写了多个类,除了一个类之外它工作正常。由于我如何获取用于我的数据库访问的连接字符串(我以某种方式获取它,因此它只会在程序启动时定义一次并且不会再次获取)包含此例程的测试类阻碍了所有其他单元测试类如果它在他们之前运行,则在他们的功能中。

因此我的问题是:是否可以告诉测试类最后运行?

【问题讨论】:

  • 我的观点是测试应该完全相互独立。应该避免这种依赖。每个类都应该有自己的设置例程

标签: c# unit-testing visual-studio-2013


【解决方案1】:

这听起来像是一个次优设置。您是否尝试在使用 [AssemblyInitialize] 属性标记的初始化方法中进行必要的设置? 它将在项目中的所有其他测试类之前运行。请注意,方法的签名必须如下所示,并且必须放在使用 [TestClass] 属性修饰的类中。

[AssemblyInitialize]
public static void Setup(TestContext context)
{
    // Store data in static variables, initialize database connection etc.
}

【讨论】:

    【解决方案2】:

    不——测试类只是一个包含单元测试的类。它没有关于它应该运行什么顺序的信息。如果您想控制测试运行的顺序,可以考虑使用ordered test

    在这种情况下,听起来您的“测试”实际上是其他测试的初始化逻辑。通过在TestInitializeClassInitializeAssemblyInitialize 中进行初始化,您应该能够使测试正确运行,而不管它们的运行顺序如何。

    【讨论】:

      【解决方案3】:

      (我以某种方式获取它,以便它只会在程序启动时定义一次并且不会再次获取)

      所以您使用的是静态类/属性,对吧?

      类似这样的:

      public class ConnectionStringProvider
      {
          private static string _connectionString;
      
          public static string ConnectionString
          {
              get 
              { 
                  if (_connectionString == null)
                      _connectionString = LoadConnectionString();
                  return _connectionString; 
              }
          }
      
          private static void LoadConnectionString()
          {
              //fetch it from somewhere
          }
      
      }
      

      在不改变行为的情况下使其可测试的最简单方法是将 API 与实现分开。通过创建您在属性 getter 中使用的类的私有实例来做到这一点。

      新实现:

      public class ConnectionStringProvider
      {
          private static ConnectionStringProvider _instance;
          private string _connectionString;
      
          public static string ConnectionString
          {
              get 
              { 
                  if (_instance == null)
                  {
                      _instance = new ConnectionStringProvider();
                      _instance.LoadConnectionString();
                  }
      
                  return _instance._connectionString; 
              }
          }
      
          private void LoadConnectionString()
          {
              //fetch it from somewhere
          }
      
      }
      

      通过这样做,您可以在自己的测试中创建类的新实例,而无需更改静态属性:

      在您的业务代码中:

      var conStr = ConnectionStringProvider.ConnectionString;
      

      在您的测试方法中:

      [Fact]
      public void load_connection_if_not_accessed_previously
      {
      
          var sut = new ConnectionStringProvider();
          // [.. test here.. ]
      }
      

      这样您仍然可以在不影响其他测试的情况下测试实现。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-25
        • 2010-11-01
        • 1970-01-01
        • 2015-01-15
        • 1970-01-01
        • 2015-06-17
        • 1970-01-01
        相关资源
        最近更新 更多