我是一個控件開發人員和單元測試的相對新手。幾乎每天,我都會對由於UI交互而無法測試控件的態度進行抗爭。我正在製作一個演示控件,以表明如果控件設計爲可測試的,可以顯着減少手動測試。目前我有50%的邏輯覆蓋率,但是如果我能找到一種方法來測試一些更復雜的部分,我認爲我可以將其提高到75%或更高。你如何測試產生複雜對象圖的方法?
例如,我有一個具有描述控件狀態的屬性的類以及一個生成由多個段組成的WPF對象的方法。實施看起來是這樣的:
internal PathGeometry CreateOuterGeometry()
{
double arcRadius = OuterCoordinates.Radius;
double sweepAngle = OuterCoordinates.SweepAngle;
ArcSegment outerArc = new ArcSegment(...);
LineSegment arcEndToCenter = new LineSegment(...);
PathFigure fig = new PathFigure();
// configure figure and add segments...
PathGeometry outerGeometry = new PathGeometry();
outerGeometry.Figures.Add(fig);
return outerGeometry;
}
我有一些其他的方法,像這樣的佔未覆蓋的代碼幾百塊,一個額外的25%的覆蓋率。我原本打算測試這些方法,但拒絕了這個概念。我仍然是一個單元測試的新手,我能想到的唯一的方法來測試代碼將是幾種方法是這樣的:
void CreateOuterGeometry_AngleIsSmall_ArcSegmentIsCorrect()
{
ClassUnderTest classUnderTest = new ClassUnderTest();
// configure the class under test...
ArcSegment expectedArc = // generate expected Arc...
PathGeometry geometry = classUnderTest.CreateOuterGeometry()
ArcSegment arc = geometry.Figures.Segments[0];
Assert.AreEqual(expectedArc, arc)
}
測試本身看起來不錯;我會爲每個預期的分段寫一個。但我有一些問題:
- 我需要測試來驗證「是否第一段
ArcSegment
?理論上測試測試這個,但不應該每個測試只測試一件事情?這聽起來像兩件事。 - 該控件至少有六個計算案例和四個邊緣案例;這意味着對於每種方法我至少需要十次測試。
- 在開發過程中,我改變了多次生成各種幾何圖形的方式。這會導致我不得不重寫所有的測試。
第一個問題讓我停頓了一下,因爲它好像可能會誇大測試的次數。我想我可能不得不測試像「有x個分段嗎?」和「段n是正確的類型?」,但現在我已經想得更多了,我發現方法中沒有分支邏輯,所以我只需要做一次這些測試。第二個問題讓我更加確信測試會有很多努力。這似乎是不可避免的。第三個問題複合了前兩個問題。每次我改變計算幾何圖形的方式時,我都必須編輯大約40次測試,以使它們尊重新的邏輯。這也包括添加或刪除測試,如果段添加或刪除。
由於這三個問題,我選擇編寫一個應用程序和手動測試計劃,將控件置於所有有趣的狀態,並要求用戶驗證它看起來是一種特定的方式。這是錯的嗎?我是否高估了編寫單元測試的努力?有沒有其他方法來測試這可能更容易? (我目前正在學習模擬和存根;好像需要對設計進行一些重構,並最終付出大致的努力)。
究竟是什麼問題?這看起來更像是對單元測試的個人挫折的冗長討論。 – 2009-09-18 15:09:15
問題是帶有問號的部分:「?是這個錯誤我是高估參與編寫單元測試的工作是否有測試此的另一種方式,可能是更容易?」 – OwenP 2009-09-18 15:11:00