[英]How to organize unit tests and do not make refactoring a nightmare?
我目前組織單元測試的方法歸結為以下幾點:
BusinessLayer
,有一個BusinessLayer.UnitTests
測試項目。 CustomerRepository
從命名空間BusinessLayer.Repositories
,有一個測試類CustomerRepositoryTests
命名空間中的BusinessLayerUnitTests.Repositories
。 每個測試類中的方法遵循簡單的命名約定MethodName_Condition_ExpectedOutcome
。 因此,類CustomerRepositoryTests
包含測試一類CustomerRepository
與Get
方法定義如下所示:
[TestFixture]
public class CustomerRepositoryTests
{
[Test]
public void Get_WhenX_ThenRecordIsReturned()
{
// ...
}
[Test]
public void Get_WhenY_ThenExceptionIsThrown()
{
// ...
}
}
這種方法對我很有用,因為它使得對某些代碼的定位測試非常簡單。 在相反的網站上,它使代碼重構變得非常困難,應該是:
有沒有組織單元測試仍然讓我找到測試特定的代碼快速的同時更借本身對重構的一些巧妙的方式?
或者,是否有一些,呃,也許是Visual Studio擴展,這將允許我以某種方式說“嘿, 這些測試是針對該方法的,所以當方法的名稱發生變化時,請非常友好並改變測試” ? 說實話,我正在認真考慮寫自己的東西:)
經過大量的測試后,我逐漸意識到(至少對我而言)擁有所有這些限制從長遠來看會帶來很多問題,而不是好事。 因此,我們已經開始使用代碼,而不是使用“名稱”和約定來確定它。 每個項目和每個類可以包含任意數量的測試項目和測試類。 所有測試代碼都是根據從功能角度測試的內容(或者它實現了哪個要求,或者它復制了哪些錯誤等)來組織的。 然后,為了找到一段代碼的測試,我們這樣做:
[TestFixture]
public class MyFunctionalityTests
{
public IEnumerable<Type> TestedClasses()
{
// We can find the tests for a class, because the test cases references in some special method.
return new []{typeof(SomeTestedType), typeof(OtherTestedType)};
}
[Test]
public void TestRequirement23423432()
{
// ... test code.
this.TestingMethod(someObject.methodBeingTested); //We do something similar for methods if we want to track which methods are being tested (we usually don't)
// ...
}
}
我們可以使用諸如resharper“usages”之類的工具來查找測試用例等等......當這還不夠時,我們通過加載所有測試類並運行類似allTestClasses.where(testClass => testClass.TestedClasses().FindSomeTestClasses());
反射和LINQ做一些魔術。 allTestClasses.where(testClass => testClass.TestedClasses().FindSomeTestClasses());
您還可以使用TearDown收集有關每個方法/類測試哪些方法的信息並執行相同操作。
移動代碼時保持類和測試位置同步的一種方法:
端到端或行為測試的一個優點是測試按需求分組,而不是代碼,因此您可以避免將測試位置與相應代碼保持同步的問題。
關於將代碼與測試相關聯的VS擴展,請查看Visual Studio的測試影響。 它在分析器下運行測試並創建一個緊湊的數據庫,將IL序列點映射到單元測試。 換句話說,當您更改代碼時,Visual Studio知道需要運行哪些測試。
是否有一些組織單元測試的聰明方法仍然可以讓我快速找到特定代碼的測試
Resharper有一些很好的快捷方式,可以讓你搜索文件或代碼
正如您所說的CustomerRepository類,它們是一個測試CustomerRepositoryTests
R#快捷方式顯示你在你發現的內容的輸入框中你可以輸入CRT,它會顯示所有以name開頭的文件首先作為Capital C然后是R然后是T
它還允許您通過諸如CR *之類的通配符進行搜索,它將顯示文件CustomerRepository和CustomerRepositoryTests的列表
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.