如何在RunSettings文件中访问TestRunParameters

47

阅读 https://msdn.microsoft.com/en-us/library/jj635153.aspx 后我创建了一个类似于示例的.RunSettings文件,其中包含了一些参数。

  <TestRunParameters>
    <Parameter name="webAppUrl" value="http://localhost" />
    <Parameter name="webAppUserName" value="Admin" />
    <Parameter name="webAppPassword" value="Password" />
  </TestRunParameters>

我计划为我们每个环境设置一个.RunSettings文件,其中包含适当的URL和凭据,以在指定的RunSettings文件的环境中运行CodedUI测试。

我可以看到从命令行引用设置文件的方法是运行:

vstest.console myTestDll.dll /Settings:Local.RunSettings /Logger:trx
vstest.console myTestDll.dll /Settings:QA.RunSettings /Logger:trx

但是我没有找到任何调用实际如何利用代码UI测试中的TestRunParameters的方法。

我想要做的是设置测试初始化器,使用TestRunParameters来确定在哪里登录以及使用什么凭据。就像这样:

[TestInitialize()]
public void MyTestInitialize()
{

    // I'm unsure how to grab the RunSettings.TestRunParameters below
    string entryUrl = ""; // TestRunParameters.webAppUrl
    string userName = ""; // TestRunParameters.webAppUserName
    string password = ""; // TestRunParameters.webAppPassword

    LoginToPage(entryUrl, userName, password);
}

public void LoginToPage(string entryUrl, string userName, string password)
{
    // Implementation
}

非常感谢有关如何引用 TestRunParameters 的信息!

编辑

/// <summary>
/// Summary description for CodedUITest1
/// </summary>
[CodedUITest]
public class CodedUITest1
{

    public static string UserName = string.Empty;

    [ClassInitialize]
    public static void TestClassInitialize(TestContext context)
    {
        UserName = context.Properties["webAppUserName"].ToString();
        Console.WriteLine(UserName);
    }

    [TestMethod]
    public void CodedUITestMethod1()
    {
        this.UIMap.RecordedMethod1();
        // To generate code for this test, select "Generate Code for Coded UI Test" from the shortcut menu and select one of the menu items.
    }

    // Rest of the default class - TestContext instantiation, UI map instantiation, etc
}

运行时遇到的异常:

NullReference Exception

enter image description here

@williamfalconeruk 我已经按照上述内容更新了我的测试类,但仍然遇到相同的错误,请问我做错了什么?


1
我在VS2013中遇到了与你相同的问题(TestRunParameters未显示在“TestContext”属性中)。查看MSDN示例https://msdn.microsoft.com/en-GB/library/jj635153(v=vs.120).aspx,我注意到直到将版本更改为VS2015,才会指定“TestRunParameters”部分,因此可能是那里的新功能。 - steve16351
@steve16351 哦,有趣,我之前没有注意到。不知道这是否是我的问题 - 我目前正在使用VS2012。我得在2015中试一下。 - Kritner
@steve16351 其实算了。我可以从上面的截图中看到代码镜头信息,知道那是在2015年发生的。但我仍然在VS2015上遇到这个问题。 - Kritner
1
这是Resharper的测试运行程序,它正在忽略您的*.runsettings文件。 - Ruslan
1
@Tsar 我没有Resharper :( - Kritner
9个回答

28

如果您使用Resharper遇到此问题,我发现解决方法(无需禁用Resharper):

  1. 转到Visual Studio顶部菜单 -> Resharper -> 选项

  2. 找到“工具”部分,展开“单元测试”

  3. 点击“MsTest”。复选框应启用,但下面的测试设置文件路径可能为空。如果为空,请单击浏览并选择要使用的runsettings文件。

  4. 点击保存、重新构建并尝试运行测试,参数现在应该起作用了。

不确定为什么,但是在使用Resharper时,仅从Tests菜单-> Test Settings中选择测试设置文件实际上并不起作用,因此需要在Resharper选项中直接指向该文件。


24

最近,我们希望停止使用旧的环境变量。下面提供的解决方案适合我们的需求,但可能会有更好的方案...

事实证明,在测试固件的ClassInitialize方法的TestContext中可以访问这些参数。有一个Properties字典包含这些参数,你可以在这里访问参数的值:

[ClassInitialize]
public static void TestClassinitialize(TestContext context)
{
    var webAppUrl = context.Properties["webAppUrl"].ToString();

   //other settings etc..then use your test settings parameters here...
}
注意: 这些是静态的,如果需要访问,则可能需要设置静态属性以在您的测试代码中访问。
建议使用数据驱动测试方法。以下是一些关于数据驱动测试的基本信息,这也可能有所帮助: https://msdn.microsoft.com/en-us/library/ms182527.aspx 正如我所说,上述解决方案在基础层面上适合我们的需求。 更新: 针对测试设置返回 null 的响应,请参见下面的图像... Visual Studio 中的测试设置

嗯,我的初始化程序不接受textcontext,试图从类textcontext中获取属性会抛出nullreference异常。你是在特定情况下使用具有该签名的初始化程序吗?你是如何使用提供的上下文调用它的呢? - Kritner
这里有一些链接来解释它们的工作原理:https://dev59.com/EWAg5IYBdhLWcg3w7uyk 和 http://geekswithblogs.net/abhi/archive/2013/11/18/test-initialize-vs.-class-initialize.aspx - williamfalconeruk
你好 - 你是否在Visual Studio菜单Test > Test Settings > Select Test Settings File中设置了测试.runsettings文件?这是我调试的方法... - williamfalconeruk
2
为了完整性,还有其他地方可以设置testsettings文件。解决方案资源管理器中“.testsetting”文件的上下文菜单有一个可选的“Active Web and Load Test Settings”条目。这个只适用于Web和Load测试。我不知道为什么Visual Studio有两种非常不同的指定这些文件的方式。 - AdrianHHH
7
我发现它只在使用VS测试资源管理器-运行测试时有效,而不是在调试测试或使用R#测试运行器时。我的设置是VS2015.Update 2和R# Ultimate 10.0.1。 - Adam
显示剩余6条评论

6
这对我很有用(VS2017-pro):
namespace TestApp.Test
{
    [TestClass]
    public class UnitTest1
    {
        // This enables the runner to set the TestContext. It gets updated for each test.
        public TestContext TestContext { get; set; }
        [TestMethod]
        public void TestMethod1()
        {
            // Arrange
            String expectedName = "TestMethod1";
            String expectedUrl = "http://localhost";

            // Act
            String actualName = TestContext.TestName;
            // The properties are read from the .runsettings file
            String actualUrl = TestContext.Properties["webAppUrl"].ToString();

            // Assert
            Assert.AreEqual(expectedName, actualName);
            Assert.AreEqual(expectedUrl, actualUrl);
        }

        [TestMethod]
        public void TestMethod2()
        {
            // Arrange
            String expectedName = "TestMethod2";

            // Act
            String actualName = TestContext.TestName;

            // Assert
            Assert.AreEqual(expectedName, actualName);
        }
    }
}

确保选择要使用的runsettings文件,在这里:测试 -> 测试设置。


3

我也尝试过这个方法。大家可能知道,通过MTM运行测试会向TestContext暴露一些附加属性,包括所使用的Run Settings的名称。我将此属性用作我们测试数据的“外键”,允许我们指定环境URL等,而不需要硬编码或使用自带测试工具中极其欠缺的“Data Driving”工具。

当然,在执行BDT或发布工作流程的一部分时,除了@kritner正在尝试的Microsoft HERE中描述的内容之外,没有办法暴露任何运行时属性。但是,如果你阅读该链接的评论,你可能会发现以下信息:

  • 您需要使用VS 2013 R5或VS 2015才能使用此解决方案。
  • 它只适用于单元测试!

我们中的一些人试图将UI或负载测试作为CI或CD工作流的一部分执行,但完全被卡住了。即使在执行在MTM中创建的某些测试配置(而不是设置)的计划/套件时,也不会在testContext中获得任何其他属性。@Adam可以在运行vs调试时使其正常工作,但这可能仅适用于单元测试。通过CodedUI,我无法检索属性而不会得到NullReferenceException。以下是我正在使用的拙劣代码示例:

if (testContextInstance.Properties["__Tfs_TestConfigurationName__"] != null) //Exposed when run through MTM
{
TFSTestConfigurationName = testContextInstance.Properties["__Tfs_TestConfigurationName__"].ToString();
}
else TFSTestConfigurationName = "Local"; //Local
var configName = testContextInstance.Properties["configurationName"] ?? "No Config Found";
Trace.WriteLine("Property: " + configName);

我这里有一个.runsettings文件的XML:

<?xml version="1.0" encoding="utf-8"?>
<RunSettings>
  <!-- Parameters used by tests at runtime. These are required as a substitute for TFS/MTM test settings.-->
  <!-- File instructions: https://msdn.microsoft.com/en-us/library/jj635153.aspx#example -->
  <!-- TFS instructions: https://blogs.msdn.microsoft.com/visualstudioalm/2015/09/04/supplying-run-time-parameters-to-tests/ -->  
  <TestRunParameters>
    <Parameter name="configurationName" value="Local" />
  </TestRunParameters>
</RunSettings>

以下是BDT工作流程生成的.trx文件中的一段摘录:

Property: No Config Found 

3

禁用Resharper的另一种方法是启用MSTest支持并在Resharper选项对话框中选择测试设置文件(->工具->单元测试->MsTest)。


2

使用NUnit 3,我能够在runsettings文件中找到属性,方法如下:

TestContext.Parameters

所以在这种情况下,应该是这样的:
string entryUrl = TestContext.Parameters["webAppUrl"];
string username = TestContext.Parameters["webAppUserName"];
string password = TestContext.Parameters["webAppPassword"];

2
针对NullReferenceException问题:
我最近也遇到了同样的问题,解决方法是安装Visual Studio 2013的最新更新。目前最新的更新是Update 5。我不确定哪个特定的更新修复了这个问题。我应用了Update 5,并成功地在ClassInitialize方法中访问了TestRunParameters。
您可以在https://support.microsoft.com/en-us/kb/2829760上找到更新。 所以我有两台机器,一台运行正常,另一台出现异常。我调查发现唯一的区别就是VS的更新;我安装了更新,问题得到了解决。 :)

1
很不幸,我正在使用VS2015,仍然遇到这个问题。 - Kritner
1
我在VS2015中也遇到了这个问题。我已经设置了我的RunSettings文件。 - chief7

1

我能通过禁用Resharper来解决单元测试的问题,但对于Coded UI测试我希望也能这样说。


很不幸,我没有resharper。很不幸我的问题不是它,因为我没有它。:( - Kritner

-4

为什么不使用应用程序设置?

AppSettings

然后您可以在任何地方阅读它们

var yesICan= Properties.Settings.Default.IToldYou;

你可以从它们中创建属性,基本上你可以做很多事情。

public string URL_WEBOFFICE
    {
        get
        {
            return Properties.Settings.Default.WEBOFFICE_URL.Replace("***", Properties.Settings.Default.SiteName);
        }

    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接