gpt4 book ai didi

unit-testing - 您如何测试生成复杂对象图的方法?

转载 作者:行者123 更新时间:2023-11-28 20:47:41 27 4
gpt4 key购买 nike

我是一名控件开发人员,也是单元测试的新手。几乎每天,我都反对因为 UI 交互而无法测试控件的态度。我正在制作一个演示控件,以表明如果该控件设计为可测试的,则可以显着减少手动测试。目前我有 50% 的逻辑覆盖率,但我认为如果我能找到一种方法来测试一些更复杂的部分,我可以将其提高到 75% 或更高。

例如,我有一个具有描述控件状态的属性的类和一个生成由多个段组成的 WPF PathGeometry 对象的方法。实现看起来像这样:

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 个测试才能使它们遵循新的逻辑。如果添加或删除了分割,这还包括添加或删除测试。

由于这三个问题,我选择编写一个应用程序和手动测试计划,将控件置于所有有趣的状态,并要求用户验证它以特定方式显示。这是错的吗?我是否高估了编写单元测试所付出的努力?有没有其他方法可以更容易地对此进行测试? (我目前正在研究模拟和 stub ;它似乎需要对设计进行一些重构,最终需要付出大约同样多的努力。)

最佳答案

使用依赖注入(inject)和模拟。

为 ArcSegmentFactory、LineSegmentFactory 等创建接口(interface),并将模拟工厂传递给您的类。这样,您将隔离特定于此对象的逻辑(这应该使测试更容易),并且不会依赖于其他对象的逻辑。

关于要测试的内容:您应该测试重要的内容。您可能有一个时间表,您希望在其中完成事情,并且您可能无法测试每一件事。 确定需要测试的优先级,并按优先顺序进行测试(考虑测试需要多少时间)。此外,当您已经进行了一些测试时,为其他内容创建新测试会变得更加容易,而且我真的没有看到为同一类创建多个测试有什么问题......

关于改变,这就是测试的目的:让你改变,不要真的害怕你的改变会给世界带来困惑。

关于unit-testing - 您如何测试生成复杂对象图的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1445122/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com