簡體   English   中英

C# - 從項目的發布版本中排除單元測試

[英]C# - Excluding unit tests from the release version of your project

您通常如何分離代碼庫和相關的單元測試 我知道有人為單元測試創​​建了一個單獨的項目,我個人覺得這個項目令人困惑且難以維護。 另一方面,如果您將代碼及其測試混合在一個項目中,最終會得到與您的單元測試框架(無論是NUnit,MbUnit還是其他任何內容)相關的二進制文件以及您自己的二進制文件。

這對於調試很好,但是一旦我構建了發布版本 ,我真的不希望我的代碼再次引用單元測試框架

我找到的一個解決方案是將所有單元測試都包含在#if DEBUG - #endif指令中:當沒有代碼引用單元測試程序集時,編譯器足夠聰明,可以省略編譯代碼中的引用。

是否還有其他(可能更舒適)的選擇來實現類似的目標?

我絕對主張將你的測試分成一個單獨的項目。 這是我認為的唯一方法。

是的,正如加里所說,它也迫使你通過公共方法測試行為,而不是玩你班級的內臟

正如其他人所指出的那樣,一個單獨的測試項目(對於每個正常項目)是一個很好的方法。 我通常鏡像命名空間並為每個普通類創建一個測試類,並在名稱后附加'test'。 如果您擁有可以在另一個項目中自動生成測試類和方法的Visual Studio Team System,則可直接在IDE中支持此功能。

如果要使用“內部”訪問器測試類和方法,需要記住的一件事是將以下行添加到要測試的每個項目的AssemblyInfo.cs文件中:

[assembly: InternalsVisibleTo("UnitTestProjectName")]

v2之后的.Net框架具有一個有用的功能,您可以使用InternalsVisibleTo屬性標記程序集,該屬性允許程序集被另一個訪問。
一種裝配隧道功能。

在文件中使用編譯器指令或創建單獨項目的另一種替代方法僅僅是在項目中創建其他.cs文件。

通過項目文件本身的一些魔力,您可以指示:

  1. nunit.framework DLL僅在調試版本中引用,並且
  2. 您的測試文件僅包含在調試版本中

示例.csproj摘錄:

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">

   ...

   <Reference Include="nunit.framework" Condition=" '$(Configuration)'=='Debug' ">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\..\debug\nunit.framework.dll</HintPath>
   </Reference>

   ...

   <Compile Include="Test\ClassTest.cs" Condition=" '$(Configuration)'=='Debug' " />

   ...
</Project>

我會建議一個單獨的項目進行單元測試(還有更多項目用於集成測試,功能測試等)。 我嘗試在同一個項目中混合代碼和測試,發現它比將它們分成單獨的項目更難維護。

維護並行命名空間並對測試使用合理的命名約定(例如,MyClass和MyClassTest)將幫助您保持代碼庫的可維護性。

有一點需要考慮的是,2005年之前的VisualStudio版本不允許從其他項目引用EXE組裝項目。 因此,如果您正在使用VS.NET中的舊項目,您的選項將是:

  • 將單元測試放在同一個項目中,並使用條件編譯將它們從發布版本中排除。
  • 將所有內容移動到dll程序集,這樣你的exe只是一個入口點。
  • 通過在文本編輯器中破解項目文件來繞過IDE。

三個條件編譯中最不容易出錯。

對於每個項目,都有一個相應的.Test項目,其中包含測試。

例如,對於被稱為“Acme.BillingSystem.Utils”的程序集,將會有一個名為“Acme.BillingSystem.Utils.Test”的測試程序集。

通過不發送該dll將其從產品的發貨版本中排除。

只要您的測試處於單獨的項目中,測試就可以引用代碼庫,但代碼庫從不必參考測試。 我不得不問,維護兩個項目有什么困惑? 您可以將它們保存在組織的相同解決方案中。

當然,復雜的部分是當企業在解決方案中有55個項目時,其中60%是測試。 算你自己幸運。

我把測試放在一個單獨的項目中但是在同一個解決方案中。 當然,在大型解決方案中可能會有很多項目,但解決方案資源管理器在分離它們方面已經足夠好了,如果你給出了所有合理的名稱,我並不認為這是一個問題。

如果#if(DEBUG)標簽允許一個干凈的“發布”版本,為什么你需要一個單獨的項目進行測試。 nunit LibarryA / B的例子(是的,我知道它的一個例子)這樣做。 目前正在與場景搏斗。 曾經使用過一個單獨的項目,但這似乎可以提高生產力。 仍然是hummin和hawin。

我總是把我的單元測試放在一個單獨的項目中,所以它編譯成它自己的程序集。

我絕對同意其他人的意見,你應該將測試與生產代碼分開。 但是,如果你堅持不這樣做,你應該定義一個名為TEST的條件編寫常量,並用一個包裝所有單元測試類

#if TEST
#endif

首先要確保測試代碼不在生產場景中編譯。 完成后,您應該能夠從生產部署中排除測試dll,或者甚至更好(但更高的維護),為生產創建一個NAnt或MSBuild,在沒有引用測試dll的情況下進行編譯。

我總是創建一個單獨編譯的單獨的Acme.Stuff.Test項目。

相反的論點是:你為什么要考試? 為什么不提供測試? 如果您將測試與測試運行器一起交付,則您需要對產品進行一定程度的驗收測試和自檢。

我已經聽過幾次這個論點並考慮過它,但我個人仍然在一個單獨的項目中進行測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM