首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确利用TestContext.Properties

如何正确利用TestContext.Properties
EN

Stack Overflow用户
提问于 2018-07-16 14:50:34
回答 3查看 14.9K关注 0票数 10

我需要在TestContext.Properties之前访问TestMethod,这样测试才能接收到要测试的正确环境。

我的test.runsettings的内容

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
  <RunSettings>
    <TestRunParameters>
      <Parameter name="colegio" value="7" />
    </TestRunParameters>

如您所见,该文件只包含一个名为colegio (school)的参数

这是TestBase.cs的内容

代码语言:javascript
复制
using Microsoft.VisualStudio.TestTools.UnitTesting;
using InfraestructureSelenium.Helper;
using System.Collections.Generic;
using InfraestructureSelenium.Configuration.Enumerados;

namespace TestSelenium
{
    [DeploymentItem("chromedriver.exe")]
    [DeploymentItem("IEDriverServer.exe")]
    [DeploymentItem("phantomjs.exe")]
    [DeploymentItem("geckodriver.exe")]
    [TestClass]
    public class TestBase
    {
        protected TestBase()
        { }

        public TestBase(int id = (int)ColegioEnum.ColegioDemoMovilidad2_Supervisor)
        {
            DiccionarioCompartido = new Dictionary<string, string>();
            SeleniumHelper = new HelperSelenium(id, WebDriverSelector.ObtenerWebDriver());
        }

        public TestBase(HelperSelenium seleniumHelper, Dictionary<string, string> diccionarioCompartido = null)
        {
            SeleniumHelper = seleniumHelper;
        }

        public HelperSelenium SeleniumHelper { get; set; }

        public static Dictionary<string, string> DiccionarioCompartido { get; set; }

        public void CloseBrowser()
        {
            SeleniumHelper.Quit();
        }

        #region Configuración Test

        [TestInitialize]
        public void InitializeTest()
        {

        }

        [TestCleanup]
        public void TestCleanupTest()
        {
            SeleniumHelper.Quit();
        }

        #endregion
        }
    }

如您所见,public TestBase(int id = (int)ColegioEnum.ColegioDemoMovilidad2_Supervisor)收到一个参数,它对应于我想要测试的colegio环境。如果没有作为参数传递colegio,则默认的参数为ColegioEnum.ColegioDemoMovilidad2_Supervisor

但是,当我试图在一个TestContext中实例化TestClass时,如下所示:

代码语言:javascript
复制
[TestClass]
    public class GenerarBoletinDeClase : TestBase
    {
        public TestContext TestContext { get; set; }

        private static TestContext _testContext;

        [TestInitialize]
        public static void SetupTests(TestContext testContext)
        {
            _testContext = testContext;
        }

        public GenerarBoletinDeClase() : base((int)TestContext.Properties["colegio"]) { }

出现以下错误:An object reference is required for the non-static field, method, or property

任何帮助都是非常感谢的,因为我给了这个问题很长的时间,我不能再进步了。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-07-16 20:14:22

首先,感谢@Peska在这个答案https://stackoverflow.com/a/51367231/5364231中提供了代码

因此,最后,我所做的是向类TestBase添加以下代码

代码语言:javascript
复制
public class TestBase
{
    public TestContext TestContext { get; set; }

    public static int Colegio { get; set; }

    [AssemblyInitialize]
    public static void ClassInitialize(TestContext TestContext)
    {
        Colegio = int.Parse(TestContext.Properties["colegio"].ToString()); // colegio is equal 7 in here
    }

    public TestBase()
    {
        SeleniumHelper = new HelperSelenium(Colegio, WebDriverSelector.ObtenerWebDriver());
        DiccionarioCompartido = new Dictionary<string, string>();
    }

装饰器[AssemblyInitialize]是必需的,[ClassInitialize][TestInitialize]不能工作,我相信因为TestContext还没有实例化。

之后,通过转到Test Settings File,确保配置了Test > Test Settings > Select Test Settings File,该文件必须命名为*.runsettings

这样,应该为TestContext.Properties设置从测试设置文件中读取的所有内容设置。

票数 1
EN

Stack Overflow用户

发布于 2018-07-16 17:30:54

你必须解决以下几个问题:

  • TestInitialize方法不能是静态的,它不应该有任何参数
  • 您需要以ClassInitialize属性和TestContext为参数的静态方法。
  • 测试类中的TestContext不能是静态的。

之后,您可以在任何单元测试中访问您想要的任何属性。下面是一个示例:

代码语言:javascript
复制
[TestClass]
public class GenerarBoletinDeClase
{
    public TestContext TestContext { get; set; }

    public static int Colegio { get; set; }

    [ClassInitialize]
    public static void ClassInitialize(TestContext testContext)
    {
        Colegio = int.Parse(testContext.Properties["colegio"].ToString()); // colegio is equal 7 in here
    }

    [TestInitialize]
    public void TestInitialize()
    {
        int tempColegio = int.Parse(this.TestContext.Properties["colegio"].ToString()); // colegio is equal 7 in here
    }

    [TestMethod]
    public void TestMethod1()
    {
        int colegio = int.Parse(this.TestContext.Properties["colegio"].ToString()); // colegio is equal 7 in here as well

        Assert.AreEqual(7, Colegio);
        Assert.AreEqual(7, colegio);
        Assert.AreEqual(colegio, Colegio);
    }
}
票数 3
EN

Stack Overflow用户

发布于 2021-10-28 19:51:14

正如在这个Microsoft文档中所解释的,您不需要分配TestContext来填充它。它会在每次TestInitialize调用之前自动分配。从那里,您可以通过属性访问在*.runsettings中定义的属性。

总之,只需添加一个名为TestContext的TestContext类型属性,MS将在运行时填充它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51364570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档