我是一个控件开发人员和单元测试的相对新手。几乎每天,我都会对由于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