TDD /单元测试Windows应用程序?

时间:2011-04-20 09:15:31

标签: unit-testing testing tdd

我很擅长做任何类型的测试,但我做了一点阅读,看起来这是一个很好的方法。我喜欢只需单击按钮并确保代码库稳定的想法。只要测试通过,就可以自由地进行攻击,这非常有趣。

但是,我的软件是一个基于Windows的程序。基本上它的作用是与用户桌面上的其他窗口进行交互,并根据特定条件在屏幕上移动它们。如果可以看到XX图像,请将该窗口移动到x / y坐标。如果在该窗口上按下F9键盘快捷键,请将其移至x2 / y2坐标。等

我不知道如何进行任何类型的测试。任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:4)

既然你提到你是初学者,我会在这里添加一个提醒,你需要注意你测试的。你希望测试你的逻辑,而不是Windows。为此,您需要将您的关注点分成包含您的逻辑的类(或类),以及包含您使用的API的包装器(代理)的类 - 您不测试API。他们一直工作,直到你证明不是。

您将需要测试您的类,并存根或模拟代理。在上面的示例中,例如,如果您使用Windows API命令来提供解决方案,则可以将用于移动窗口的命令放入WindowsProxy类,并模拟调用,验证调用它们,但实际上并没有在测试中运行它们。

如果您使用的是.NET,Windows窗体或类似的框架,则需要使用支持测试的模式,例如MVP。您需要编写测试来练习演示者,同时存根或模拟查看(您的窗口)和模型(任何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这样的模拟框架,您可以轻松地存根和模拟视图,并测试演示者(所有逻辑将驻留在哪里)。使用Moq,您可以在模拟上使用测试集值下的类,然后验证它们的值(例如窗口的坐标)。

希望这会有所帮助。我花了很多时间开发基于Win-Form的自定义控件,并使用TDD开发它们。一旦掌握了它,这不是不可能的,甚至是困难的。

如果您需要进一步详细说明,请与我们联系。

阿萨弗。

答案 1 :(得分:2)

不推荐使用UnitTest窗口,因此您最好将应用程序重构为Model-View-Controller(任何类型的此模式),并独立测试Controller和Model类。

答案 2 :(得分:1)

为了对这类应用程序进行单元测试,您需要区分测试在屏幕上看到的内容,以及测试应用程序的状态。

如果我采取你的一个例子:

  

如果按下F9键盘快捷键   该窗口,将其移至x2 / y2

您可以构建代码,以便您可以轻松触发移动窗口的函数/方法。然后你想要询问窗口状态并确定它的位置。如果窗口状态报告它位于x2 / y2位置,那么这是一个肯定的结果。

这些类型的测试有很多价值。当然,窗口的位置总是有可能,实际出现的位置可能不匹配。因此,您仍然应该在单击按钮并查看屏幕的位置进行一些测试。你不需要像那样做所有的测试。