2013-07-18 38 views
2

我剛剛學習C#,所以請原諒我的恩惠。在C#項目中存儲不變變量的好方法是什麼?

  • 我們使用Visual Studio 2012將C#/ Selenium項目放在一起進行自動化測試。
  • 我們有三個信用卡處理器。

我想存儲每個處理器的登錄憑證,測試設置和測試付款項目。我可以在一分鐘內做到這一點在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頁面上......我只是希望有一種方法可以將alla放在一個地方,而且最少會有大驚小怪,因爲我們偶爾會遇到「這適用於每個處理器「測試。

(另外這個是完全的測試數據,並且將是誰已經可以看到它現在同樣的民間訪問,所以我並不擔心。)

+0

您需要哪些值才能訪問?在一個方法裏面?一類?一個組件? – Oded

+1

您是否可以不將值存儲在'Properties-> Settings.settings' – MethodMan

回答

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]" 
     } 
    }; 

這將創建的Dictionarystring對象匿名對象映射具有三個屬性的實例 - WebsiteUsernamePassword。由於進入的對象屬於匿名類(注意缺少new與開放大括號之間的類名),因此字典的值類型定義爲dynamic。這可以讓你在將來添加更多屬性而不會改變其他任何東西。

您可以使用ProcessorCreds這樣的:

urlopen(ProcessorCreds[procName].Website); 
+0

使這隻'readonly'。 。 。? –

+0

@JimMischel絕對,謝謝! – dasblinkenlight

+0

我是一個MORON。我完全忘了app.config!謝謝!! – XtinaS

1

有很多不同的方法來做到這一點。您可以將數據存儲在靜態只讀字典中。

public static readonly Dictionary<int, int> MY_DICTIONARY; 

並將其置於整個項目中的靜態類中。

您還可以將數據存儲在屬性settings.settings文件中。

通常,在我的C#代碼中,我嘗試避免全局數據,而是在需要時傳遞信息。這允許更容易測試的代碼。

+0

我當然也會這樣!這只是很少的 - 如果有的話,改變數據;最常見的變化是更改後的密碼,每年發生兩次。上次我們從密碼中更改任何登錄信用_apart_時,這是一筆鉅額交易,使我們放慢了兩個月。 :wry: – XtinaS

+0

你不能'const只讀'。它是一個或另一個。既然你不能初始化一個常量字典,我懷疑你的意思是'公共只讀字典...' –

+0

@JimMischel謝謝!我的意思是「靜態只讀」,因爲這個問題似乎在尋找一個靜態解決方案。更新。 – Chris

2

你可以把他們在App.Config中(Web.config)中appSettings部分,並使用ConfigurationManager中得到他的值,如在下面的例子中

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

在代碼中,你將有以下

string username=ConfigurationManager.AppSettings["username"]; 
+0

這是假設一個處理器 –

0

您的問題比技術更具安全性和程序上的含義。

由於您正在保存用於支付處理的用戶名和密碼,因此將這些存儲位置公開存儲的風險存在各種風險。你的企業需要遵守PCI嗎?鑑於這是安全信息,您是否想要在某種程度上將它們保持在鎖定狀態?也許把它們保存在數據庫中,或以某種方式加密。

如果沒有這樣的問題,你的appConfig文件可能是最好的選擇:你可以在你的項目中定義它們,並使用ConfigurationManager類檢索它們。將被存儲在與您的應用程序一起部署的XML文件中。用純文本。

+0

這些項目也存儲在我們的內部維基上,可以通過回購中的人看到,因此我不太關心它。如果使用實際的實際數據,我可能會做任何其他的事情,但這是故意的測試數據,所以......恩。 – XtinaS

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 
0

把它們放在一個靜態的動態變量 - 這是最pythonish的方式來做到這一點,雖然它不是慣用的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;

相關問題