阅读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
等...
但是我没有看到任何方式来调用如何在codedUI测试中实际使用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异常
@williamfalconeruk我已经更新了我的测试类,但是我仍然遇到同样的错误,知道我做错了什么?
答案 0 :(得分:22)
我最近也遇到过这种情况,因为我们希望摆脱遗留环境变量的使用。下面提供的解决方案适合我们的需求,但可能有更好的解决方案......
事实证明,您可以在测试夹具的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的测试设置...
答案 1 :(得分:19)
对于那些使用Resharper解决这个问题的人,我发现了修复(不需要禁用Resharper):
转到Visual Studio顶部菜单 - &gt; Resharper - &gt;选项
找到工具部分,展开“单元测试”
点击“MsTest”。该复选框应启用,但下面的测试设置文件路径可能为空。如果是,请单击“浏览”并选择要使用的runsettings文件。
点击保存,重建并尝试运行测试,参数现在应该可以正常工作。
不确定原因,只需从测试菜单中选择测试设置文件 - &gt;使用Resharper时,测试设置实际上不起作用,因此需要在Resharper选项中直接显式指向此文件。
答案 2 :(得分:3)
禁用Resharper的替代方法是启用MSTest支持并在Resharper Options对话框中选择测试设置文件( - &gt; Tools-&gt; Unit Testing-&gt; MsTest)。
答案 3 :(得分:2)
对于NullReferenceException问题:
我最近也面临同样的问题,解决方案是拥有Visual Studio 2013的最新更新。目前最新的更新是Update 5.我不确定哪个特定的更新修复了这个问题。我应用了Update 5,并且能够成功访问ClassInitialize方法中的TestRunParameters。
您可以找到@ https://support.microsoft.com/en-us/kb/2829760的更新 所以我有两台机器,一台机器都工作正常,另一台我得到了例外。我调查过,唯一的区别是VS的更新;应用它,这解决了问题。 :)
答案 4 :(得分:2)
我也试图做到这一点。许多人可能知道,通过MTM运行测试会向TestContext公开一些其他属性,包括使用的运行设置的名称。我使用这个属性作为&#34;外键&#34;对我们的测试数据进行排序,允许我们指定环境URL等,而无需对其进行硬编码或使用令人难以置信的低调#34;数据驱动&#34;开箱即用测试的工具。
当然,除了@kritner尝试哪个微软描述HERE之外,在执行作为BDT或发布工作流程一部分的测试时,没有办法公开任何运行时属性。但是,如果您阅读该链接的评论,您将发现您可以在此处推断出的内容:
我们这些试图在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
答案 5 :(得分:2)
这对我有用(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文件,此处为:Test - &gt;测试设置。
答案 6 :(得分:1)
我能够通过禁用Resharper来解决这个问题。希望我能对Coded UI测试说同样的话。
答案 7 :(得分:0)
使用 NUnit 3,我能够在 runsettings 文件中找到属性,使用
TestContext.Parameters
所以在这种情况下应该是:
string entryUrl = TestContext.Parameters["webAppUrl"];
string username = TestContext.Parameters["webAppUserName"];
string password = TestContext.Parameters["webAppPassword"];
答案 8 :(得分:-4)