44

Reading through https://msdn.microsoft.com/en-us/library/jj635153.aspx I have created a .RunSettings files with a few parameters similar to the example:

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

I plan on having a .RunSettings file for each of our environments with appropriate URLs and credentials for running a CodedUI test on the specified RunSettings file's environment.

I can see that from command line to reference the Settings file I can run:

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

etc...

But I don't see any way that calls out how to actually utilize the TestRunParameters from within the codedUI test.

What I would like to do is set up test initializers that use the TestRunParameters to determine where to log in, and what credentials to use. Something like this:

[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
}

Information on how to reference the TestRunParameters is greatly appreciated!

EDIT

/// <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
}

The exception I'm getting when running:

NullReference Exception

enter image description here

@williamfalconeruk I have updated my test class as above, but I am still getting the same error, any idea what I'm doing wrong?

4

9 回答 9

27

对于那些使用 Resharper 解决此问题的人,我发现了修复(无需禁用 Resharper):

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

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

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

  4. 单击保存,重建并尝试运行测试,参数现在应该可以工作了。

不知道为什么,只是从测试菜单中选择测试设置文件 -> 测试设置在使用 Resharper 时实际上不起作用,因此需要直接在 Resharper 选项中明确指出该文件。

于 2016-07-04T09:05:11.357 回答
24

我最近也遇到了这个问题,因为我们想摆脱遗留环境变量的使用。下面提供的解决方案适合我们的需求,但可能有更好的解决方案......

事实证明,您可以在测试夹具TestContext的方法中访问这些。ClassInitialize有一个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 中的测试设置

于 2015-08-05T11:07:47.690 回答
5

这对我有用(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);
        }
    }
}

确保选择您希望使用的运行设置文件,此处:测试 -> 测试设置。

于 2017-12-27T09:27:31.460 回答
3

我也试图做这件事。许多人可能知道,通过 MTM 运行测试会向 TestContext 公开一些附加属性,包括使用的运行设置的名称。我将此属性用作我们测试数据的“外键”,允许我们指定环境 URL 等,而无需对其进行硬编码或使用开箱即用测试附带的极其乏味的“数据驱动”工具。

当然,除了微软在此处描述的@kritner 所尝试的之外,在作为 BDT 或发布工作流的一部分执行测试时,没有办法公开任何运行时属性。但是,如果您阅读该链接的评论,您会发现您可以在这里推断出什么:

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

我们这些试图在 CI 或 CD 工作流程中执行 UI 或负载测试的人完全被搞砸了。即使在执行具有在 MTM 中创建的某些测试配置(而非设置)的计划/套件时,您也不会在 testContext 中获得任何其他属性。@Adam 在运行和调试时可能已经能够让它工作,但这可能只适用于单元测试。通过 CodedUI,我无法在没有得到 NullReferenceException 的情况下检索属性。这是我用来调查的 janky 代码示例:

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 
于 2016-04-25T19:53:41.747 回答
3

禁用 Resharper 的另一种方法是启用 MSTest 支持并在 Resharper 选项对话框 (->Tools->Unit Testing->MsTest) 上选择测试设置文件。

于 2016-03-23T13:35:13.907 回答
2

对于 NullReferenceException 问题:

我最近也面临同样的问题,解决方法是更新 Visual Studio 2013。现在最新的更新是更新 5。我不确定哪个特定更新解决了这个问题。我应用了 Update 5 并能够成功访问 ClassInitialize 方法中的 TestRunParameters。

您可以找到更新@ https://support.microsoft.com/en-us/kb/2829760 所以我有两台机器,一台运行正常,另一台出现异常。我调查了唯一的区别是VS的更新;应用它并解决了问题。:)

于 2015-10-27T08:04:16.283 回答
1

通过禁用 Resharper,我能够为单元测试解决此问题。希望我可以对 Coded UI 测试说同样的话。

于 2015-09-16T00:05:59.557 回答
0

使用 NUnit 3,我能够在 runsettings 文件中找到属性,使用

TestContext.Parameters

所以在这种情况下,它将是:

string entryUrl = TestContext.Parameters["webAppUrl"];
string username = TestContext.Parameters["webAppUserName"];
string password = TestContext.Parameters["webAppPassword"];
于 2021-05-15T23:34:38.547 回答
-4

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

应用设置

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

var yesICan= Properties.Settings.Default.IToldYou;

您可以从它们中创建属性,几乎可以做很多事情。

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

    }
于 2016-04-14T11:40:24.823 回答