2009-03-03 115 views
31

notorious Stack Overflow #38 podcastJoel Spolsky中谈到了对于像JPEG压缩之类的东西做TDD有多困难。鲍勃·马丁wanted to cover如何在播客#41期间为TDD这样的实例做TDD,但我认为他们从来没有做到这一点。因此:TDD和JPEG压缩

如何使用TDD开发和测试JPEG压缩?

+1

并请,我们可以从现在*总*称其为“臭名昭著的#1#38”或TNS#38 ;-) – 2009-03-04 10:23:28

回答

70

乔尔的问题是这样的。假设你想在某处设置一个导致显示低分辨率图像而不是高分辨率图像的位置。你将如何使用TDD来实现这个目标?你会写一个测试,刮屏幕显示图像是在低分辨率?

当然不是。您已经知道JPEG库的工作原理。你已经知道,如果你用正确的参数调用它,它将以低分辨率显示。您需要测试的是您设置的位被转换为适当的JPEG库调用。所以你用一个由你的测试控制的非常简单的模块来嘲笑JPEG库。然后你设置位,并请求显示。 Mocked JPEG库会记住它是如何被调用的,然后测试可以检查它是否被正确调用。

好的,那么如何测试JPEG库的内部?我对JPEG渲染知之甚少,但我认为它是关于压缩,解压缩和位图的。压缩和解压缩只是算法。算法具有来自给定输入的可预测输出。因此,您设置了一系列非常简单的输入,并确保您获得可预测的输出。您设置输入以便覆盖JPEG算法的内部。相同的逻辑适用于位图。你不必在屏幕上渲染它们。简单的小的位图可以被渲染到测试可以检查的内存缓冲区中。简单来说,我的意思是简单。 3X3,5X5,8X8。简单。再次,您将输入数据构建为涵盖大部分代码。

这不是火箭科学。如果完美无损但是一组50个测试可以证明90%的逻辑是正确的,当您想进行更改时可以产生巨大的差异。

你能完全消除手动测试吗?当然不是。但你可以显着缓解它。您可以将手动测试减少到几个非常具有战略意义的测试,而不是成千上万的痛苦乏味的测试计划。

+16

太棒了,我让Bob叔叔加入了stackoverflow。应该有一个这样的徽章。 – stimms 2009-03-04 05:11:11

4

如果您认为TDD意味着在任何代码或任何设计之前进行测试,那么这在很大程度上是不可能的。对于复杂的算法,你需要一些结果。而在压缩的情况下,结果很难手工生成。不是不可能的,但很难。

此外,压缩需要非常高性能的算法。简单地通过测试并不够好。许多低性能算法可以通过基本的“正确性”测试。

为了超越正确性,您需要证明您的算法是最优的。这只能在测试世界观之外开发。您需要使用O东西)进行复杂度分析,这不是测试的结果;也不能将其定义为测试结果。

另一方面,如果您认为“可测试性”出现在大多数代码之前,那么这很容易。

  • 设计你的算法。写一个证明它是最优的。

  • 编写一些将您的算法的关键部分公开为可测试模块的代码。

  • 在某些情况下,编写代码以生成整个算法的测试结果。这可能是次优的,强力代码,通过真正明显但慢速的算法产生正确的答案。

  • 组装unittest以显示您的实现产生预期的测试结果。

  • 组装技术文件以显示它也是最优的。

这不是测试优先。但它是测试驱动的。

0

测试驱动开发不仅是编程,还有很多其他的东西,你可以先使用测试做例子验收TDD等

想第一你想要的表现,这就是事情。对于一个算法,一个例子可以是这样的:

  • “它必须完成在10秒5级的呼叫”
  • “我们必须减少10%的图像的大小”
  • 其他。

我相信这只是一种生活方式清楚要实现什么想:d