我有一個關於測試套件中構建的視覺工作室的問題。 VS studio是否應用了一些特殊的編譯器標誌來運行這些測試?單元測試運行的特殊編譯器標誌
問題描述如下。 我在其中一個類上重載了Equals
函數。 在測試過程中,如果它能給我一些額外的信息,那麼這個班級裏的哪些成員根本就不相同。
所以我想實現一些消息只有當應用程序在測試模式下運行。
感謝您的回覆! 安德烈亞斯
我有一個關於測試套件中構建的視覺工作室的問題。 VS studio是否應用了一些特殊的編譯器標誌來運行這些測試?單元測試運行的特殊編譯器標誌
問題描述如下。 我在其中一個類上重載了Equals
函數。 在測試過程中,如果它能給我一些額外的信息,那麼這個班級裏的哪些成員根本就不相同。
所以我想實現一些消息只有當應用程序在測試模式下運行。
感謝您的回覆! 安德烈亞斯
VS編譯/構建項目與當前選擇的生成配置。因此,一個解決方案可能是自己創建一個單獨的構建配置,然後對該特定構建配置中的項目使用常量(例如TEST)。輸出方法的執行可以通過#if TEST
指令或[Conditional("TEST")]
屬性來限制。您可以配置您的構建服務器,然後使用該特定構建配置運行測試,以便您可以看到更多輸出。從VS
創建一個新的解決方案配置「測試」(如果你沒有它尚未),並切換到它。打開項目設置,切換到Build選項卡並定義一個新的符號TEST。按OK。
更改您的Equals實施
public override bool Equals (object obj)
{
#if TEST
// Your implementation
#else
return base.Equals (obj);
#endif
}
這將編譯一個不同的方法體爲您的測試配置。
感謝您的回答。我並不是真的想要在完全不同的實現之間切換,但只是稍微提高輸出。 –
你仍然可以調用base.Equals實施,並提供額外的輸出需要 –
我不得不說我不喜歡在代碼中隨處添加條件編譯的想法。這使得閱讀和調試代碼變得更加困難。
也許你應該退後一步,實現你有兩套不同的算法來確定對象是否相等。您可以通過使用Strategy Design Pattern來將這些代碼從等於方法中排除。
然後在運行時,你可以在你的基類選擇Equals方法低谷依賴注入的策略,或者一個簡單的功能是這樣的:
public override bool Equals (object obj)
{
if (EqualsStrategy != null)
{
return EqualsStrategy.Equals(this,object);
}
else
{
return base.Equals(obj);
}
}
在你的單元測試,你會初始化EqualsStrategy與功能你想用。
我看到這一點,並aggree爲主,但我並沒有真的想改變'Equals'實施。它只應該給我更多的輸出,所以我可以找到更容易的錯誤原因。 –
我會強烈建議不要在應用程序中插入任何測試僅代碼。 (單元)測試的目的是測試軟件的生產質量,而不是測試只測試代碼。
如果您的測試,只有代碼工作找到,但量產版壞了你的測試將是毫無價值的。
取而代之,您應該以這樣的方式編寫測試:只有一件事可以錯誤。這樣如果測試失敗,你已經知道什麼是錯的。因此,如果您正在測試考慮2個屬性的equals方法,請編寫一組小測試來驗證兩個屬性的所有可能組合中發生的情況,並驗證Equals方法的結果。
之後,你可以確信Equals方法的正確實現,並且你不必其他地方進行測試。
另一種解決辦法是添加該附加執行記錄測試幫手。我喜歡爲此使用擴展方法。例如:
public static class TestExtensions
{
public static void ShouldEqual(this YourType subject, YourType other)
{
// Check parameters for null here if needed
if(!subject.Equals(other))
{
// custom logging here
Assert.Fail("Objects are not equal"); // test fails
}
}
}
感謝您的回答。我不想通過單元測試來檢查'Equals'方法,但給我一些暗示默勒在我的代碼搜索的「更高」的功能錯誤。但我會考慮爲我的類添加一個特殊的「AreEqual」實現。 –
感謝您的回答。我也想過加入一些其它編譯器選項,但如果沒有一個已經通過測試環境並沒有舒爾。 –