你如何在一个非平凡的应用程序中进行TDD?

Its*_* me 15 tdd agile

我读过很多关于TDD主题的书籍和网站,它们都很有意义,特别是Kent Beck的书.然而,当我尝试自己做TDD时,我发现自己正盯着键盘,想知道如何开始.你使用过程吗?你的思考过程是什么?你如何确定你的第一次测试?

关于这个主题的大部分书籍都很好地描述了TDD是什么,而不是如何在现实世界的非平凡应用中练习 TDD.你是怎么做TDD的?

Nik*_*man 5

实际上,它比你想象的要容易.您只需在每个班级使用TDD.应该测试您在课堂上的每个公共方法的所有可能结果.因此,您看到的"概念证明"TDD示例也可以用于具有数百个类的相对较大的应用程序中.

您可以使用的另一种TDD策略是通过封装主应用程序行为来模拟应用程序测试运行.例如,我编写了一个框架(在C++中,但这应该适用于任何OO语言),它代表一个应用程序.有初始化,主runloop和关闭的抽象类.所以我的main()方法看起来像这样:

int main(int argc, char *argv[]) {
  int result = 0;

  myApp &mw = getApp(); // Singleton method to return main app instance
  if(mw.initialize(argc, argv) == kErrorNone) {
    result = mw.run();
  }

  mw.shutdown();
  return(result);
}
Run Code Online (Sandbox Code Playgroud)

这样做的好处是双重的.首先,可以将所有主要应用程序功能编译到静态库中,然后将其与测试套件和此main.cpp存根文件链接.其次,这意味着我可以通过为argc&argv []创建数组来模拟主应用程序的整个"运行",然后模拟main()中会发生什么.我们使用这个过程来测试许多真实的功能,以确保应用程序在给定某个真实的输入数据和命令行参数语料库的情况下生成它应该做的事情.

现在,您可能想知道如何为具有真实GUI,基于Web的界面或其他任何应用程序的应用程序进行更改.对此,我只想说使用模型来测试程序的这些方面.

但简而言之,我的建议归结为:将测试用例分解到最小的水平,然后开始向上看.最终,测试套件会将它们全部放在一起,最终您将获得合理水平的自动化测试覆盖率.


Men*_*elt 4

我曾经也有同样的问题。我过去常常通过启动窗口设计器来为我想要实现的第一个功能创建 UI 来开始大多数开发。由于 UI 是最难测试的东西之一,因此这种工作方式不能很好地转化为 TDD。

我发现 Presenter First 上的原子对象论文非常有帮助。我仍然首先设想要实现的用户操作(如果您有用例,这是一个很好的开始方式),并使用 MVP 或 MVC 式模型,我首先为第一个屏幕的演示者编写测试。通过模拟视图直到演示者工作,我可以通过这种方式快速开始。http://www.atomicobject.com/pages/Presenter+First这里有关于这种方式工作的更多信息。

如果您正在使用您不熟悉或有很多未知的语言或框架启动一个项目,您可以首先开始进行峰值。我也经常为我的峰值编写单元测试,但只是为了运行我正在峰值的代码。进行峰值可以为您提供一些有关如何开始实际项目的信息。当你开始真正的项目时,不要忘记扔掉你的钉子