我正在考虑实现一个用于自动化测试的运行设置文件。问题是,我的变量是复杂的对象,我在有关运行设置的文档中找到的所有内容都有简单的键/值选项,就像这样。
<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>
据我所知,目前是不可能的。 但是,有两种选择:
例如
<Parameter name="Environment" value="appsettings.Staging.json" />
但在这种情况下,您可以考虑使用 appsettings.json 来代替。
如果线性类足以满足您的需求,以下方法有助于避免一一读取所有参数。 例如
公共类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);
}
}
}
}