问题

StackOverflow上有一则是否使用TDD(测试驱动开发)进行UI开发 的提问。

JacobE问:

对于是否使用TDD进行开发UI这件事,我想了很久,但难以决定。我想听听你们的意见。

回答

kdgregory的回答(23票赞同)

试图测试UI组件的放置是没有意义的,首先因为UI布局是主观的,所以应该由人来测试。其次,随着UI改动,你要不断地重写测试。 同样,没必要测试你所使用GUI库的组件,它们已经被非常多的人测试过了。如果你写了新的UI组件,倒是可以测一测。 你应该测试的是GUI下面的程序行为:控制器和模型部分。朝这个方向努力,你就会开始关心组件分离。为了方便测试,你会让你的模型部分和控制器和你的UI尽量解耦。

bangroot的回答(8票赞同)

当我使用自动化测试去测试UI的外观风格时,我发现这是最大的“过度工程”。我的建议是:不要!把你的测试重心转移到程序的行为上吧,至于程序的UI,留给测试团队去做吧。关键是把你的精力用在高收益的行为上,自动化的UI测试不仅不会增加价值,还会让你负债!

Brian Rasmussen的回答(5票赞同)

TDD的作用就是让你的逻辑代码和你的GUI代码分离。如果你这样做了,你会发现很容易用TDD建立逻辑代码。如果你的逻辑代码分离得好,在它之上你完全可以建立另一套UI。

Harald Scheirich(4票赞同)

我从来不用TDD做任何UI布局的事情,因为花的时间太不值。

后面的解答不一一列举。

结论

关于这个问题的回答基本是一边倒的结论:没必要把精力放在UI的自动化测试上。原因可归结为以下两点:

  1. 不合理。“因为UI布局是主观的,所以应该由人来测试。”
  2. 不划算。对于UI的自动化测试,要花费很大的努力和很多的时间,随着UI改动,测试也要改动。工作量太大。明显不如由人来测试UI划算。

根据以上的讨论,我的结论是:

  1. TDD是辅助设计的一种方法,但不是唯一的方法。当我做UI布局时,写CSS时,没必要TDD。
  2. TDD应该针对程序的行为,而不是程序的外观。TDD的目标写出依赖尽量少的,方便测试的功能模块。