是否可以配置 .net runsettings 文件以包含复杂对象?

问题描述 投票:0回答:1

我正在考虑实现一个用于自动化测试的运行设置文件。问题是,我的变量是复杂的对象,我在有关运行设置的文档中找到的所有内容都有简单的键/值选项,就像这样。

<TestRunParameters>
  <Parameter name="webAppUrl" value="http://localhost" />
  <Parameter name="docsUrl" value="https://learn.microsoft.com" />
</TestRunParameters>

我想知道是否可以指定一个像下面指定的复杂对象(特别是因为 TextContext.Properties 返回一个对象,所以我假设它在某种意义上是多态的?)并将其转换为给定的定义类

<TestRunParameters>
  <Parameter name="AdminUser" UserID="Admin" Password="P@55w0rd!" />
  <Parameter name="User" UserID="User" Password="P@55w0rd!" />
</TestRunParameters>

我意识到我可以执行以下操作并手动创建我的对象实例,但如果可能的话我真的很想避免它

<TestRunParameters>
  <Parameter name="AdminUserID" value="Admin"/>
  <Parameter name="AdminUserPW" value="P@55w0rd!" />
  <Parameter name="UserID" value="User"/>
  <Parameter name="UserPW" value="P@55w0rd!" />
</TestRunParameters>
c# automated-tests typing
1个回答
0
投票

据我所知,目前是不可能的。 但是,有两种选择:

  1. 将序列化数据存储在 json 文件中;将带有 json 文件名称的单个参数添加到 runsettings TestRunParameters 部分;并反序列化 json

例如

<Parameter name="Environment" value="appsettings.Staging.json" />

但在这种情况下,您可以考虑使用 appsettings.json 来代替。

  1. 如果线性类足以满足您的需求,以下方法有助于避免一一读取所有参数。 例如

    公共类GlobalTestSettingss { 公共字符串参数1; 公共 int 参数2; }

    私有静态无效DeserializeTestRunParameters(TestContext上下文) { //从{Environment}.runsettings获取GlobalTestSettings数据 var typeGlobal = typeof(GlobalTestSettings); foreach(typeGlobal.GetProperties() 中的 var 属性) { if (属性.CanWrite) { var 属性名称 = 属性.名称; var propertyValue = context.Properties[propertyName]; var propertyValueStr = propertyValue?.ToString(); Console.WriteLine($@"设置 TestRunParameter '{propertyName}' = '{propertyValueStr}'");

             if (!string.IsNullOrEmpty(propertyValueStr))
             {
                 property.SetValue(typeGlobal, Convert.ChangeType(propertyValue, property.PropertyType), null);
             }
         }
     }
    

    }

© www.soinside.com 2019 - 2024. All rights reserved.