2

我只是在学习 C#,所以请原谅我的 n00bness。

  • 我们使用 Visual Studio 2012 组合了一个 C#/Selenium 项目以进行自动化测试。
  • 我们有三个信用卡处理器。

我想为每个处理器存储登录凭据、测试设置和测试支付项目。我可以在一分钟内使用 dict 在 Python 中做到这一点:

processorCreds = {
    'ProcOne': {
        'website': '[url]',
        'username': '[username]',
        'password': '[password]'
    },
    'ProcTwo': {
        'website': '[url]',
        'username': '[username]',
        'password': '[password]'
    },
}

然后我会在需要时调用它:

def openProcessor(procName):
    urllib2.urlopen(processorCreds[procName]['website'])

openProcessor('ProcTwo')

基本上,我想在 C# 中使用它。我很少需要更改这些凭据,并且它们将在多个测试用例中使用,因此我希望能够在需要的地方提取信息。

我把它放在一起的最好方法是什么?我应该使用 XML 文件,还是可以在一个类中,或者......?

[编辑]我看到的另一种选择是,我们每次有一个测试用例时都设置变量,这似乎不是……面向对象的。或者,我想我可以将变量放在 [Processor]Portal.cs 页面上......我只是希望有一种方法可以将所有这些都放在一个地方,而不是大惊小怪,因为我们偶尔会“这适用于每个处理器“测试。

(而且这完全是测试数据,现在已经可以看到的同一个人可以访问,所以我不担心。)

4

6 回答 6

3

.NET 提供了多种存储常量或接近常量数据的方法:您可以在多种读取 XML 文件、配置文件、具有您自己格式的资源文件等的方法中进行选择。如果您想在代码中定义像您这样的结构,您可以使用IDictionary

internal static readonly IDictionary<string,dynamic> ProcessorCreds =
    new Dictionary<string,dynamic> {
        {"ProcOne", new {
            Website = "[url]",
            Username = "[username]",
            Password = "[password]"
        },
        {"ProcTwo", new {
            Website = "[url]",
            Username = "[username]",
            Password = "[password]"
        }
    };

这将创建一个实例,Dictionary该实例将对象映射到具有三个属性 - 、和string的匿名对象。由于进入的对象属于匿名类(注意在大括号之间缺少类名),因此字典的值类型定义为. 这将允许您在将来添加更多属性而无需更改任何其他内容。WebsiteUsernamePasswordnewdynamic

你可以ProcessorCreds这样使用:

urlopen(ProcessorCreds[procName].Website);
于 2013-07-18T21:23:58.080 回答
2

您可以将它们放在 appsettings 部分的 App.Config(Web.Config) 中,并使用配置管理器获取他的值,如下例所示

<appSettings>
    <add key="username" value="me" />
    <add key="password" value="getmein" />
</appSettings>

在代码中,您将拥有以下内容

string username=ConfigurationManager.AppSettings["username"];
于 2013-07-18T21:20:52.300 回答
1

有很多不同的方法可以做到这一点。您可以将数据存储在静态只读字典中。

public static readonly Dictionary<int, int> MY_DICTIONARY;

并将其放在整个项目中可用的静态类中。

您还可以将数据存储在 Properties settings.settings 文件中。

通常,在我的 C# 代码中,我尽量避免使用全局数据,而是在需要时传递信息。这允许更容易测试的代码。

于 2013-07-18T21:19:28.983 回答
1

使用 C# 或 Python 不会显着改变这个问题的答案。如果在 Python 中使用像字典这样的可变内存数据结构对您来说很好,那么您可以在 C# 中做同样的事情。

类似的答案使用动态,但它更惯用,并且 C# 中有许多优点支持使用静态类型,如下所示:

public class Processor {
    public Uri Website { get; private set; }
    public string Username { get; private set; }
    public string Password { get; private set; }
    public Processor(Uri website, string username, string password) {
        Website = website;
        Username = username;
        Password = password;
    }
}

var processorCreds = new Dictionary<string, Processor> {
    { "ProcOne", new Processor(new Uri("[url]"), "[username]", "[password]") },
    { "ProcTwo", new Processor {new Uri("[url]"), "[username]", "[password]") }
};

哪种情况被用作

processorCreds["ProcOne"].Website
于 2013-07-18T21:27:04.150 回答
0

您的问题比技术具有更多的安全性和程序含义。

由于您要保存用于支付处理的用户名和密码,因此将这些存储在公开可用的地方存在各种风险。您的业​​务需要 PCI 合规性吗?鉴于这是安全信息,您是否不想在某种程度上将它们置于锁定状态?也许将它们保存在数据库中,或者以某种方式加密。

如果没有这样的问题,您的 appConfig 文件可能是最好的选择:您可以在项目中定义它们,并使用 ConfigurationManager 类检索它们。将存储在与您的应用程序一起部署的 XML 文件中。在纯文本中。

于 2013-07-18T21:22:55.013 回答
0

将它们放在静态动态变量中 - 这是最 Python 的方式,虽然它不是惯用的 c#

static dynamic processorCreds =new {
    ProcOne= new {
        website= "[url]",
        username= "[username]",
        password= "[password]"
    },
    ProcTwo= new {
        website= "[url]",
        username= "[username]",
        password= "[password]"
    },
}

然后,您可以使用var s = (string) processorCreds.ProcTwo.website;

于 2013-07-18T21:33:55.990 回答