如何对Windows应用程序进行TDD /单元测试?

5

我对测试完全是新手,但我已经读了一些相关内容,发现这是一个很好的方法。我喜欢只需点击按钮就能确保代码库稳定的想法。只要测试通过,就可以自由地进行修改,这非常有趣。

然而,我的软件是基于Windows的程序。它主要与用户桌面上的其他窗口进行交互,并根据某些条件将它们移动到屏幕上的不同位置。例如,如果XX图像可见,则将该窗口移动到x/y坐标;如果在该窗口上按下F9键盘快捷键,则将其移动到x2/y2坐标等。

我不知道如何进行任何类型的测试。希望能得到帮助。

3个回答

4

既然您提到您是一个初学者,我在这里要提醒您,您需要小心测试的内容。您希望测试的是您的逻辑,而不是窗口。为了做到这一点,您需要将您的关注点分成一个包含您的逻辑的类(或类)和包含您使用的API的包装器(代理)的类 - 您不会测试API。它们可以工作,直到您证明它们不能。

您将想要测试您的类,并存根或模拟代理。在上面的示例中,例如,如果您正在使用Windows API命令来传递您的解决方案,您将把移动窗口的命令放入WindowsProxy类中,并模拟调用,验证调用是否进行,但实际上不在测试中运行它们。

如果您正在使用.NET和Windows-Forms或某些类似的框架,则需要使用支持测试的模式,例如MVP。您将希望编写测试来练习Presenter,同时存根或模拟View(您的窗口)和Model(您使用的任何API或域对象)。

这是一个示例架构:
public interface IView { ... }

public class View : IView
{
   private Presenter _p;
   View()
   {
      _p = new Presenter(this);
      ...
   }

}

public class Presenter
{
   presenter IView _v;
   Presenter(IView view)
   {
      _v = view;
   }
}

使用像Moq这样的模拟框架,您可以轻松地存根和模拟视图,并测试所有逻辑所在的Presenter。使用Moq,您可以使被测类在模拟上设置值,并稍后验证其值(例如窗口的坐标)。希望这会有所帮助。我花了很多时间开发基于Win-Form的自定义控件,并使用TDD进行开发。一旦掌握了它,它并不是不可能或困难的。如果需要进一步解释,请告诉我。Assaf.

谢谢。我觉得你的解释有点超出我的理解范围。我正在使用一种脚本语言编码,因此可用的框架不多。但我想开始学习整个单元测试过程,并将其应用于我的当前项目。正如你所指出的,逻辑代码和窗口代码都混在一起,所以我可能需要进行大量重构。我想如果不提供更多关于我的应用程序的细节,就很难得到良好的反馈。其他示例包括,在特定x/y处检查像素颜色并移动窗口。如果X分钟内没有像素颜色,则移动窗口等。 - mikew

2

不建议对Windows进行单元测试,因此最好将您的应用程序重构为Model-View-Controller(任何此类模式),并单独测试控制器和模型类。


1
为了对这种类型的应用程序进行单元测试,您需要区分测试屏幕上看到的内容和测试应用程序的状态。
如果我拿你的一个例子:
如果在该窗口上按下F9键盘快捷键,则将其移动到x2 / y2
您可以构造代码,以便可以轻松触发移动窗口的函数/方法。然后,您将要询问窗口状态并确定它在哪里。如果窗口状态报告它位于位置x2 / y2,那就是一个积极的结果。
这些类型的测试有很大的价值。当然,窗口认为自己在哪里,实际上出现的位置可能不匹配。因此,您仍应进行一些测试,其中您点击按钮并查看屏幕。您只需不需要全部使用此类测试。

例如,实际的移动总是成功的。我从来没有遇到过移动失败的情况。它只是调用了Win32 API MoveWindow函数:http://msdn.microsoft.com/en-us/library/ms633534%28v=vs.85%29.aspx通常问题出现在窗口状态被错误地检测到,然后MoveWindow函数永远不会被调用。所以,我需要测试我在屏幕上看到的内容,并将其与应用程序的状态进行比较。这将需要进行一些重大的重构,因为这段代码只是随意拼凑起来的。 - mikew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接