2016-03-04 80 views
0

目前我正在开发一段代码,它首先从一组文档中搜集句子,然后对这些句子进行标记,然后使用结果分析令牌序列的循环频率,包括案例变体(大写/小写/引导帽/其他),然后打印出结果。实施多阶段过程时的TDD策略?

现在我希望在打印出结果之前引入两个阶段:
1.首先,去除“停用词”(即词或短序列其频率永远是兴趣,比如,在英语,“其中”,“其中”,等等) - 从数据库表中获取这些停用词/“停止序列”
2.其次,调出使用户能够识别序列的对话新的停用词,然后删除所涉及的令牌序列,并将有问题的序列添加到数据库表中。

问题是,这是一个多阶段过程,我只是想知道TDD专家面临的情况是什么样的:我为每个单独的阶段创建一个新的测试方法......?问题在于每个单独的阶段都需要使用前一阶段的“实时内存数据”:另一种可能性是以某种方式将这些数据序列化,然后在测试下一阶段时对其进行反序列化......但是这会涉及应用程序代码做的事情只对测试代码有好处,也就是说,这意味着为测试代码的好处调整(“扭曲”?)应用程序代码,这在原则上似乎是错误的...

此外,如果任何人都可以将我指向一本书或网站的方向,以帮助像我这样的TDD新手进入“更高层次”,我将非常感激。

为了谁该标记为“最喜欢”的人:现在我有一本书叫“成长的面向对象的软件,通过测试指导”,这是保持良好审查和似乎是有人想从初学者到中级。第一印象不错。

专家对本书有任何意见也欢迎,当然...

+0

要明确一点,您已经对流程的现有阶段进行了测试,您的问题是关于您正在引入的新阶段? – forsvarir

+0

我刚刚在单个功能测试中开发了现有的2个阶段......我现在想知道如何将多阶段过程在实践中由经验丰富的TDD人员分解......作为第一步,我把这两个阶段放到不同的方法中(我使用Jython,而这一切都发生在SwingWorker中)。但只是为特定的舞台制作一个方法仍然留下了为每个要测试的方法创建**前置条件**的问题......希望这是有道理的...... –

回答

1

在它的面前,你似乎是建立一个管道。从我所知道的,你目前正在一个类中实现它,它存储正在处理的数据并实现处理的方法。你可以采取的一种方法是将问题分解成更小的块。您不是只有一个类,而是为管道的每个阶段都有一个类,而另一个类负责编排负责按照正确顺序将各个阶段组合在一起的过程。

所以,通过你所描述什么扫描,你似乎有下列处理器:

  • DocumentReader(读取文档的某个地方到内存中的文件)
  • SentenceExtractor(文件/文件列表,句子列表)
  • 1个或更多SentenceAnalysers(句子输入,统计数据输出),您可能希望根据分析类型以及它的复杂程度将其分解。
  • StopWordExtractor(StopWordProvider和句子,句子出来)

有迹象表明将需要额外的支持类,以支持新的禁用词到数据库中写入并根据stopwordprovider是如何实现的保持它同步因为用户选择新的。

本质上,我所说的是,你似乎在一个位置做得太多。如果你是真的幸福的是,你所描述的代码是一个单一的单元,那么你在一个地方进行测试并没有什么错,但是你的输入将是你的起始文档/句子和你的输出将是过程的结束。如果你真的同意我的观点,那么在这个过程中会涉及到几个独立的组件,这些组件可能会独立地发生变化,那么我会建议将这个过程分解成更小的类,并测试那些对于给定的输入/输出集按预期执行的那些...

+0

谢谢!是的,你已经说得很清楚了。一条“管道”......这个术语完美地概括了它。今天早上,我一直在挠头,慢慢地解决问题......也许当你想到它时有点显而易见(已经给出了答案!)。它意味着一个“协调”的课堂,就像你说的......这样更多的工作......我想这是付出更强大解决方案的代价。 –