2013-03-27 71 views

回答

5

NUnit支持参数​​化测试装置以及参数化测试。所以第一件事就是你想要针对不同的环境运行特定的测试,还是整个测试夹具都将在两种环境中重新运行?

我问,因为这个答案决定你将通过参数(环境)的位置。如果您只是想重新运行整个测试夹具,则应该在测试夹具级别传递环境,即创建参数化测试夹具。如果您只想针对这些环境运行特定的测试,则必须将其传递给每个单独的测试用例。下面是一个例子,我如何去了解相同的事情:

首先创建一种方法来定义测试可以'附加'的'环境'。我建议也许搡到的app.config这一点,并有一个“设置”类和枚举去用它:

public enum Environment 
{ 
    QA, 
    Production, 
    Hotfix, 
    Development 
} 

public class Settings 
{ 
    public static string QAUrl { get { return "some url"; } } 

    public static string ProductionUrl { get { return "some url"; } } 

    public static string HotfixUrl { get { return "some url"; } } 

    public static string DevUrl { get { return "some url"; } } 
} 

上面“某些URL”将会从您的配置文件或硬编码的读取,不过你请。

我们现在已经有了一个环境的概念,它是URL,但它们没有以任何方式链接在一起或相关。理想情况下,您希望为其提供枚举的“QA”值,然后它将为您整理网址。

接下来创建一个基础测试夹具,您的所有测试夹具都可以继承,这样可以保持当前的环境。我们还创建了一个Dictionary,现在涉及的环境价值,它的网址:

public class BaseTestFixture 
{ 
    private Dictionary<Environment, string> PossibleEnvironments 
    { 
     get 
     { 
      return new Dictionary<Environment, string>() 
      { 
       { Environment.QA, Settings.QAUrl }, 
       { Environment.Production, Settings.ProductionUrl }, 
       { Environment.Hotfix, Settings.HotfixUrl }, 
       { Environment.Development, Settings.DevelopmentUrl }, 
      } 
     } 
    } 

    private Environment CurrentEnvironment { get; set; } 

    public BaseTestFixture(Environment environment) 
    { 
     CurrentEnvironment = environment; 
    } 
} 

你也许可以使用反射来有它的工作什么的URL映射到什么enum价值的。

太酷了,我们有一个可以对付的环境。一个样本测试,以管理员身份登录到您的网站:

public class LoginToSite 
{ 
    [Test] 
    public void CanAdministratorSeeAdministratorMenu() 
    { 
     // go to the site 
     driver.Navigate().GoToUrl("production site"); 
     // login as administrator 
    } 
} 

我们如何获取此信息以访问特定网址?让我们修改我们的基类有点...

public class BaseTestFixture 
{ 
    private Dictionary<Environment, string> PossibleEnvironments 
    { 
     get 
     { 
      return new Dictionary<Environment, string>() 
      { 
       { Environment.QA, Settings.QAUrl }, 
       { Environment.Production, Settings.ProductionUrl }, 
       { Environment.Hotfix, Settings.HotfixUrl }, 
       { Environment.Development, Settings.DevelopmentUrl }, 
      } 
     } 
    } 

    private Environment CurrentEnvironment { get; set; } 

    protected string CurrentEnvironmentURL 
    { 
     get 
     { 
      string url; 
      if (PossibleEnviroments.TryGetValue(CurrentEnviroment, out url)) 
      { 
       return url; 
      } 

      throw new InvalidOperationException(string.Format("The current environment ({0}) is not valid or does not have a mapped URL!", CurrentEnviroment)); 
     } 
    } 

    public BaseTestFixture(Environment environment) 
    { 
     CurrentEnvironment = environment; 
    } 

      public BaseTestFixture() 
      { 
      } 
} 

我们的基类,现在可以告诉我们,取决于我们是在什么样的环境,要到什么网页...

所以我们现在有这样的测试,从我们的基地继承:

public class LoginToSite : BaseTestFixture 
{ 
    [Test] 
    public void CanAdministratorSeeAdministratorMenu() 
    { 
     // go to the site 
     driver.Navigate().GoToUrl(CurrentEnvironmentURL); 
     // login as administrator 
    } 
} 

但是,这是伟大的,但上述不会编译...为什么?我们实际上并没有给它一个环境,所以我们必须通过......

[TestFixture(Environment.QA)] 
public class LoginToSite : BaseTestFixture 
{ 
    [Test] 
    public void CanAdministratorSeeAdministratorMenu() 
    { 
     // go to the site 
     driver.Navigate().GoToUrl(CurrentEnvironmentURL); 
     // login as administrator 
    } 
} 

这是伟大的,它现在已经通过在环境中,URL等的检查都在后台为你做了,现在......然而,这仍然不能编译。由于我们使用继承,我们必须有一个构造函数来传递给我们:

public LoginToSite(Environment currentEnvironment) 
    { 
     CurrentEnvironment = currentEnvironment; 
    } 

等voilà。

至于具体的测试情况下,这是一个更容易一些,从早期的以我们的测试案例:

public class LoginToSite 
{ 
    [TestCase(Environment.QA)] 
    public void CanAdministratorSeeAdministratorMenu(Environment environment) 
    { 
     // go to the site 
     driver.Navigate().GoToUrl("production site"); 
     // login as administrator 
    } 
} 

这将通过在环境成具体测试用例。然后,您将需要一个新的Settings类某种,做环境检查您(以类似的方式和我一样前):

public class EnvironmentHelper 
{ 
    private static Dictionary<Environment, string> PossibleEnvironments 
    { 
     get 
     { 
      return new Dictionary<Environment, string>() 
      { 
       { Environment.QA, Settings.QAUrl }, 
       { Environment.Production, Settings.ProductionUrl }, 
       { Environment.Hotfix, Settings.HotfixUrl }, 
       { Environment.Development, Settings.DevelopmentUrl }, 
      } 
     } 
    } 

    public static string GetURL(Environment environment) 
    { 
     string url; 
     if (PossibleEnviroments.TryGetValue(environment, out url)) 
     { 
      return url; 
     } 

     throw new InvalidOperationException(string.Format("The current environment ({0}) is not valid or does not have a mapped URL!", environment)); 
    } 
} 
+0

感谢您的回答。这对我帮助很大。我应该更具体。我想找到一种方法让我们的QA人员运行我的回归工具。所以对我来说最好的方法是在每个环境中使用[配置文件](http://www.nunit.org/index.php?p=configFiles&r=2.2.10)。所以我在我们的共享文件夹“QA”和“Production”上创建了多个文件夹,然后将我的test.dll和test.dll.config复制过来。因此,他们可以在他们的盒子上安装NUnit,并根据他们想要运行回归测试的环境打开相应文件夹中的dll。 – Duk 2013-03-27 19:17:36

0

最好的办法是使用变量而不是硬编码链接来实现所有功能。以便在需要改变环境时可以改变它。更简单的方法是从记事本/ excel文件中读取链接。

相关问题